I.MX6ull-PWM

news2025/1/7 16:48:57

一、PWM介绍

        PWM(Pulse Width Modulation)简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的 一种非常有效的技术,广泛应用在测量、通信、工控等方面。

pwm的工作电路

它的四种时钟信号

        (1)High-frequency reference clock (ipg_clk_highfreq) pat_ref This is a high frequency clock, provided by the Clock Control Module (CCM). This clock should be on in the low power mode when the ipg_clk is turned off. (这是一个高频时钟,由时钟控制模块(CCM)提供。当ipg_clk关闭时,处于低功耗模式,该时钟应打开)
        (2)Low-frequency reference clock (ipg_clk_32k, CKIL) This is the 32 KHz low reference clock which is provided by the CCM. This clock should be on in he low power mode when ipg_clk is turned off. Thus, PWM can be run on this clock in the low
power mode. (这是CCM提供的32 KHz低参考时钟。当ipg_clk关闭时,该时钟应该在低功耗模式下打开。因此,PWM 在低功耗模式下使用该时钟运行)
        (3) Peripheral clock (ipg_clk) This clock should be on in normal operations. In low power mode, it can be switched off. (该时钟在正常运行时应为开启状态。在低功耗模式下,可将其关闭)
        (4) Peripheral access clock (ipg_clk_s 外设访问时钟) This clock is used for register read/write.(该时钟用于寄存器的读/写)

1.1 PWM的频率

        是指在1秒钟内,信号从高电平到低电平再回到高电平的次数,也就是说1秒钟PWM有多少个周期,单 位HZ。

1.2 PWM的周期

        T=1/f,T是周期,f是频率。
        如果频率为50Hz ,也就是说一个周期是20ms,那么1秒钟就有 50次PWM周期。 1.3 占空比
是一个脉冲周期内,高电平的时间与整个周期时间的比例 (0%-100%)

1.3 总结

        脉冲周期(T),单位是时间,比如纳秒(ns)、微妙(μs)、毫秒(ms)等;
        脉冲频率(f),单位是赫兹(Hz)、千赫兹(kHz)等,与脉冲周期成倒数关系,f=1/T;
        脉冲宽度(W),简称“脉宽”,是脉冲高电平持续的时间。单位是时间,比如纳秒(ns)、微妙 (μs)、毫秒(ms)等;占空比(D),脉宽除以脉冲周期的值,百分数表示,比如50%。也常有小数或分数表示的,比如0.5 或1/2。

二,pwm的工作设置

1. 选择合适的定时器模块

 

        ARM 芯片通常有多个通用定时器(General Purpose Timer,GPT)可供选择用于产生 PWM 信号,需要根据具体的应用需求,比如所需的定时精度、PWM 频率范围等,来选定一个合适的定时器。查看芯片手册确定所选定时器对应的寄存器地址范围等相关信息。

2. 时钟配置

 

时钟源选择
        通过时钟源选择寄存器,从可用的时钟源(如内部系统时钟、外部时钟引脚输入等)中挑选适合的时钟信号来驱动定时器。如前文所述,依据不同的应用场景,像需要高精度同步时可选择系统主时钟分频后的时钟;对精度要求不高且注重功耗时,可选内部低频时钟等。按照芯片手册对相应寄存器位进行赋值操作来确定时钟源。

预分频设置
        使用预分频设置寄存器对选定的时钟源进行分频处理,以获得期望的计数时钟频率。根据想要达到的 PWM 频率以及定时器的计数特性,设置合适的分频系数。比如,如果定时器的计数器是 32 位,期望 PWM 频率为 1kHz,而系统时钟频率为 10MHz,可能就需要通过合适的分频使得最终输入到定时器计数部分的时钟频率满足能产生该 1kHz 频率 PWM 的要求,同样按寄存器位规定写入相应的值来配置分频。

3. 定时器工作模式配置

 

设置定时器为 PWM 模式
        在定时器的控制寄存器中,有专门的位用于配置定时器的工作模式。找到对应设置为 PWM 模式的位并将其置为相应的值(通常按芯片手册规定,比如置 1 表示选择 PWM 模式等),使定时器进入可产生 PWM 信号的工作状态。

确定计数方向和周期
        根据需要设置定时器计数器的计数方向(向上计数、向下计数或向上向下同时计数),一般通过控制寄存器中的相关位来配置。然后,通过周期设置寄存器来设定计数的周期,也就是 PWM 信号的周期对应的计数值。例如,如果定时器是向上计数,且期望 PWM 周期对应的计数值为 1000(这个值取决于定时器的位数以及预分频后的时钟频率等因素),就在周期设置寄存器中写入 1000。

4. PWM 占空比设置

 

配置比较寄存器
        对于每个定时器通道(通常有多个通道可同时产生 PWM 信号,用于控制多个不同的外部设备等),都有对应的比较寄存器。占空比的设置就是通过调整这些比较寄存器的值来实现的。比较寄存器的值与计数器的值进行比较,当计数器的值达到比较寄存器的值时,PWM 信号的电平就会发生翻转(比如从高电平变为低电平或者反之)。
计算占空比对应的比较寄存器值,公式一般为:比较寄存器值 = 周期计数值 × 期望占空比(以分数形式表示,如期望占空比为 50%,则为 0.5)。按照计算结果将相应的值写入比较寄存器中。

5. 死区时间设置(如果需要)

 

配置死区寄存器(部分芯片支持)
        在一些应用中,比如控制电机等感性负载时,为避免上下桥臂同时导通造成短路等故障,需要设置死区时间。通过对应的死区寄存器来设置该时间,按照芯片手册规定的单位和计算方法,将所需死区时间对应的数值写入寄存器中,使定时器在产生 PWM 信号时,能在电平翻转的间隙插入相应的死区时间。

6. 使能定时器及相关中断(可选,根据需求)

 

使能定时器
        在完成上述各项配置后,通过控制寄存器中的使能位(通常为某个特定位,置 1 表示使能定时器开始计数工作)将定时器使能,使其开始按照设定的模式、周期、占空比等产生 PWM 信号。

使能中断(若有需求)
        如果需要在 PWM 周期的某些特定时刻(比如计数到周期开始、结束或者比较值匹配时)触发中断来执行额外的任务,如更新占空比、记录相关数据等,可以在定时器的中断使能寄存器中设置相应的中断使能位,开启对应的中断功能,并且在中断服务程序中编写相应的处理代码。

三,代码案例

#include "pwm.h"

//管脚初始化
void pwm_gpio()
{
    IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO09 &= ~(0xf << 0);

}

//pwm初始化

void pwm_init()
{

    PWM2->PWMCR &= ~(0x1<<0);
    PWM2->PWMCR |= (0x1<<3);
    while (PWM2->PWMCR &(0x1<<3))
    {
        /* code */
    }
    PWM2->PWMCR &= ~(0x3<<16);
    PWM2->PWMCR |= (0x1<<16);

    PWM2->PWMCR &= ~(0xfff<<4);
    PWM2->PWMCR |= (0x41<<4);

    PWM2->PWMPR = PERIOD -2;

}

//打开pwm

void pwm_on()
{
    PWM2->PWMCR |= (0x1<<0);
}
//关闭pwm
void pwm_off()
{
    PWM2->PWMCR &= ~(0x1<<0);
}
void  pwm_set_val(int val)
{
    PWM2->PWMSAR = val;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2271986.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

性能测试04|JMeter:连接数据库、逻辑控制器、定时器

目录 一、连接数据库 1、使用场景 2、直连数据库的关键配置 3、案例 ​编辑 二、逻辑控制器 1、if控制器 2、循环控制器 3、ForEach控制器 三、定时器 1、同步定时器 2、常数吞吐量定时器&#xff08;用的少&#xff0c;了解即可&#xff09; 3、固定定时器 一、连…

基于SpringBoot和OAuth2,实现通过Github授权登录应用

基于SpringBoot和OAuth2&#xff0c;实现通过Github授权登录应用 文章目录 基于SpringBoot和OAuth2&#xff0c;实现通过Github授权登录应用0. 引言1. 创建Github应用2. 创建SpringBoot测试项目2.1 初始化项目2.2 设置配置文件信息2.3 创建Controller层2.4 创建Html页面 3. 启动…

Visual Studio C++使用笔记

个人学习笔记 右侧项目不显示 CTRL ALT L 创建第一个项目 添加类&#xff08;头文件、CPP文件&#xff09;

USB射频微波功率计的功能与优势-盛铂科技

USB射频功率计是一种用于测量射频信号&#xff08;RF&#xff09;功率的仪器&#xff0c;它通过USB接口与计算机或其他设备连接&#xff0c;以便于进行数据采集、处理和显示。 主要功能 功率测量&#xff1a;能够测量射频信号的功率&#xff0c;通常以毫瓦&#xff08;mW&…

百度贴吧的ip属地什么意思?怎么看ip属地

在数字化时代&#xff0c;IP地址不仅是网络设备的唯一标识符&#xff0c;更承载着用户的网络身份与位置信息。百度贴吧作为广受欢迎的社交平台&#xff0c;也遵循相关规定&#xff0c;在用户个人主页等位置展示账号IP属地信息。那么&#xff0c;百度贴吧的IP属地究竟意味着什么…

基于氢氧燃料电池的分布式三相电力系统Simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于氢氧燃料电池的分布式三相电力系统Simulink建模与仿真&#xff0c;仿真输出燃料电池中氢氧元素含量变化以及生成的H2O变化情况。 2.系统仿真结果 3.核心程序与模型 版本…

Linux驱动开发(16):输入子系统–电容触摸驱动实验

有关电容触摸的基础知识内容可以参考野火STM32相关教程&#xff0c;这里只介绍电容触摸驱动的相关内容。 本章配套源码、设备树以及更新固件位于“~/embed_linux_driver_tutorial_imx6_code/linux_driver/touch_scream_GTxxx”目录下。 触摸面板通过双面胶粘在显示屏上&#…

73 mysql replication 集群的交互

前言 新建两个数据库, 分别为 192.168.220.132:3001, 192.168.220.132:3002 设置 192.168.220.132:3001 为 master, 192.168.220.132:3002 为 slave 配置文件如下 然后使用 mysqld --initialize 来初始化 data 目录, 以及相关基础数据库 这里会为 root 账户创建一个随机的…

Unity-Mirror网络框架-从入门到精通之Benchmark示例

文章目录 前言什么是Benchmark&#xff1f;Benchmark 简要说明Benchmark示例BenchmarkNetworkManagerMonsterMovementPlayerMovementInterestManagement性能指标 BenchmarkIdle示例BenchmarkPrediction示例BenchmarkStinkySteak示例 前言 在现代游戏开发中&#xff0c;网络功能…

反射--反射机制

目录 一 java 1.反射的引入&#xff1a; 2.反射机制 1&#xff09; 反射会生成一个类对象------类型class类型 2&#xff09;【加载阶段】class类型相当于一面镜子------透过class 反射出 真正的类的结构 3&#xff09;反射机制原理---编译阶段---加载阶段---运行阶段 2.…

【论文笔记】LongLoRA: Efficient Fine-tuning of Long-Context Large Language Models

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: LongLoRA: Efficient Fine…

LabVIEW四边形阻抗继电器

基于LabVIEW开发了四边形阻抗继电器&#xff0c;该系统主要应用于电力系统的距离保护中。四边形阻抗继电器在克服短路点过渡电阻的影响及躲避负荷阻抗方面展现出优良的特性。通过LabVIEW图形化编程环境实现的该系统&#xff0c;具备用户友好界面和简便的操作流程&#xff0c;有…

计算机网络--路由器问题

一、路由器问题 1.计算下一跳 计算机网络--根据IP地址和路由表计算下一跳-CSDN博客 2.更新路由表 计算机网络--路由表的更新-CSDN博客 3.根据题目要求给出路由表 4.路由器收到某个分组&#xff0c;解释这个分组是如何被转发的 5.转发分组之路由器的选择 二、举个例子 …

Python安装(新手详细版)

前言 第一次接触Python&#xff0c;可能是爬虫或者是信息AI开发的小朋友&#xff0c;都说Python 语言简单&#xff0c;那么多学一些总是有好处的&#xff0c;下面从一个完全不懂的Python 的小白来安装Python 等一系列工作的记录&#xff0c;并且遇到的问题也会写出&#xff0c…

2025 年前端新技术如何塑造未来开发生态?

开发领域&#xff1a;前端开发 | AI 应用 | Web3D | 元宇宙 技术栈&#xff1a;JavaScript、React、ThreeJs、WebGL、Go 经验经验&#xff1a;6 年 前端开发经验&#xff0c;专注于图形渲染和 AI 技术 开源项目&#xff1a;AI智简未来、晓智元宇宙、数字孪生引擎 大家好&#x…

1-markdown转网页样式页面 --[制作网页模板] 【测试代码下载】

markdown转网页 将Markdown转换为带有样式的网页页面通常涉及以下几个步骤&#xff1a;首先&#xff0c;需要使用Markdown解析器将Markdown文本转换为HTML&#xff1b;其次&#xff0c;应用CSS样式来美化HTML内容。此外&#xff0c;还可以加入JavaScript以增加交互性。下面我将…

数据逻辑(十)——逻辑函数的两种标准形式

目录 1 最小项和最大项 1.1 最小项 1.2 最大项 2 逻辑函数的最小项之和 3 逻辑函数的最大项之积 4 最小项之和以及最大项之积的联系和应用场景 4.1 最小项之和以及最大项目之积的联系 4.2 最小项之和以及最大项之积的应用场景 逻辑函数的两种标准形式分别是以最小项之和…

【Ubuntu使用技巧】Ubuntu22.04无人值守Crontab工具实战详解

一个愿意伫立在巨人肩膀上的农民...... Crontab是Linux和类Unix操作系统下的一个任务调度工具&#xff0c;用于周期性地执行指定的任务或命令。Crontab允许用户创建和管理计划任务&#xff0c;以便在特定的时间间隔或时间点自动运行命令或脚本。这些任务可以按照分钟、小时、日…

鸿蒙Flutter实战:15-Flutter引擎Impeller鸿蒙化、性能优化与未来

Flutter 技术原理 Flutter 是一个主流的跨平台应用开发框架&#xff0c;基于 Dart 语言开发 UI 界面&#xff0c;它将描述界面的 Dart 代码直接编译成机器码&#xff0c;并使用渲染引擎调用 GPU/CPU 渲染。 渲染引擎的优势 使用自己的渲染引擎&#xff0c;这也是 Flutter 与其…

UniApp | 从入门到精通:开启全平台开发的大门

UniApp | 从入门到精通:开启全平台开发的大门 一、前言二、Uniapp 基础入门2.1 什么是 Uniapp2.2 开发环境搭建三、Uniapp 核心语法与组件3.1 模板语法3.2 组件使用四、页面路由与导航4.1 路由配置4.2 导航方法五、数据请求与处理5.1 发起请求5.2 数据缓存六、样式与布局6.1 样…