手把手教你开发stm32——定时器(下)(基于hal库)

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和相关寄存器的内容了,希望大家多批评指正!!!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式进阶之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值