目录:
7.PWM输出模式具体代码
7.1.PWM的相关概念
PWM(Pulse Width Modulation):脉冲宽度调制
占空比:就是输出的PWM中,高电平保持的时间与该PWM的时钟周期的时间之比。
PWM调节说通俗一点就是,我们在一个时间周期里面,控制高电平持续的时间,来达到等效的电压的行为,比如下面的例子
在一个周期为1000us的波形中,我们控制输出200us的高电平,stm32的额定电压输出为3.3v,这样只控制1/5的高电平输出,就相当于3.3v*1/5,就相当于只输出了0.66v的电压,这样就可以实现电压的调制。
一般我们在使用PWM调制的时候,都是用来控制电机或者是用来控制灯光闪烁的。在做智能小车转弯的时候,需要两个电机转速不一致,这个时候就需要PWM调制来实现。
7.2.定时器中输出比较的功能框图
我们以通用定时器的PWM输出端口为例
我们是通过配置捕获/比较寄存器的数值来控制输出高电平的时间的;
- 首先我们需要在时基单元中设置ARR的值,然后再在捕获/比较寄存器中设置CCR的值,当然CCR的值需要比ARR的值小。
- 当开始计数以后,如果计数单元CNT的值小于CCR的值的时候,这时候就会输出低电平,当计数单元CNT的值,大于CCR的值的时候,就开始输出高电平,这就是定时器产生PWM波的具体原理。
所以我们只需要控制寄存器CCR的值,就可以来控制输出的高电平的时间,从而实现脉冲宽度的调制。
当然,不同的PWM模式下,CCR和CNT的相关比较也是不同的,具体的模式1和模式2如下图所示:
高电平为有效
低电平为无效
7.3.利用PWM实现呼吸灯效果
实验目标:利用TIM2的通道1产生PWM波形,控制IO口上的LED灯实现呼吸灯的效果。
7.3.1.cubemx具体配置
其他配置和原来相同
7.3.2.具体代码实现
其实实现PWM的效果就是去改变寄存器CCR的值,所以我们可以直接使用寄存器来改变CCR的值,代码如下
这样改变CCR的值从而产生PWM波形的代码就搞定了。
下一步我们还需要开启定时器的PWM,然后在主函数中用for循环来实现CCR数值的改变,具体代码如下
通过这段代码,我们就能实现在PA0上产生呼吸灯的效果了。
8.定时器相关寄存器
我们以通用定时器为例
通用定时器中的寄存器主要包括
- 控制寄存器(TIMx_CRx)
- 从模式寄存器(TIMx_SMCR)
- DMA/中断使能寄存器(TIMx_DIER)
- 状态寄存器(TIMx_SR)
- 事件产生寄存器(TIMx_EGR)
- 捕获/比较模式寄存器(TIMx_CCMRx)
- 捕获/比较使能寄存器(TIMx_CCER)
- 计数器(TIMx_CNT)
- 预分频器(TIMx_PSC)
- 自动重装载寄存器(TIMx_ARR)
- 捕获/比较寄存器(TIMx_CCRx)
- DMA控制寄存器(TIMx_DCR)
- 连续模式的DMA地址(TIMx_DMAR)
由于定时器的寄存器比较多也比较杂,所以我们重点介绍几个比较常用也比较重要的寄存器,其他的寄存器及各种位感兴趣的可以去中文参考手册上查看。
8.1.控制寄存器1(TIMx_CR1)
- 第0位是用来使能计数器的,如果CEN被置为0,则计数器停止工作;如果CEN被置为1,那么计数器开始工作。
- 第1、2、3位不重要,这里就不介绍了。
- 4位是用来控制计数方向的,如果DIR位被置为0,那么采用向上计数方式,如果DIR置为0,那么采用向下计数方式。
- 第5、6位用来选择中央对齐模式,通俗来说,就是计数器交替得向上或向下计数,可配置为只在计数器向下计数时被设置、只在计数器向上计数时被设置、在计数器向上和向下计数时均被设置或者计数器依据方向位(DIR)向上或向下计数。需要注意的是,如果设置中央对齐模式,则DIR无效,即4位无效。
- 第7位是自动重装载预装载允许位,具体来说,是否需要自动重装载,如果是则到达计数上限后自动装载到寄存器,产生一次中断。
- 第8、9位是用来设置分频比例的,用不用都可以
8.2.DMA/中断使能寄存器(TIMx_DIER)
这个寄存器中比较重要的是第0位和第6位。
- 第0位是允许更新中断,如果设置UIE为0,那么就会禁止更新中断;如果设置UIE为1,那么就允许更新中断。
- 第6位是是触发中断使能,如果TIE设置为0,那么就会禁止触发中断,如果TIE设置为1,那么就会允许触发中断。
至于允许更新中断和触发中断使能的区别如下:
更新中断,比如CNT的值计数到ARR的时候,需要重新装载CNT(也就是所谓的更新),那么就可以触发更新中断。
触发中断,比如输入捕获的时候,当触发脉冲出现的时候,那么就可以引起触发中断。
8.3.状态寄存器(TIMx_SR)
这个寄存器主要是显示定时器的相关状态
比较重要的是第0位和第6位
- 第0位是更新中断标记,当UIF为0时,表示无更新事件产生;当UIF为1是,表示发生更新中断,更新中断等待响应。
- 第6位是触发器中断标记,当TIF为0时,表示无触发器事件产生;当TIF为1时,表示触发器中断等待响应。
8.4.计数器(TIMx_CNT)
用来存放计数器的值,因为大部分计数器是16位的,最大存放的数值为2^16的数值,所以这个计数器寄存器也是16位的。
8.5.预分频器(TIMx_PSC)
预分频器就是我们在给CNT脉冲时钟之前,将给定时器的系统时钟进行分频操作的寄存器,比如我们给预分频器72的值,那么它就会将系统时钟的72MHZ进行72分频,分频为1MHZ输入给CNT寄存器。
8.6.自动重装载寄存器(TIMx_ARR)
自动重装载寄存器是用来设定自动重装载值的,当CNT计数器的值技术到ARR的时候,需要进行自动重装载,这个寄存器也是16位的寄存器,最大可以存放2^16的数值。
8.7.捕获/比较寄存器(TIMx_CCRx)
我们以通道1的CCR1为例
当定时器配置为输入捕获模式的时候,CCR存放着上一次输入捕获事件传输的数值;
当定时器配置为输出比较模式的时候,CCR存放着下一次要输出的值,用来调节PWM波形。
上面就是定时器配置PWM和相关寄存器的内容了,希望大家多批评指正!!!