STM32片上资源:TIM功能实现之输出比较

1.输出比较简介

(1)OC英文output compare的简称,意为输出比较。

(2)输出比较可通过比较CNT与CCR(capture compare regester)寄存器的关系,来对输出电平置1,置0或翻转的操纵,用于输出一定频率和占空比的PWM波形

(3)每个高级定时器和通用定时器都拥有4个输出比较通道。

(4)高级定时器的前3个通道额外拥有死区生成和互补输出的功能。

(5)输出比较主要用途:输出PWM波形

2.PWM简介

(1)PWM(Pulse Width Modulation)脉冲宽度调制。

(2)在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效的获得所需要的模拟参数,常应用于电机控速等领域。

(3)PWM参数:

    频率f = 1 / Ts        占空比 = Ton / Ts        分辨率 = 占空比变化步距(占空比变化的细腻程度)

注:

a.Ts为一个周期;Ton为高电平期间;Toff为低电平期间。

b.PWM只用于惯性系统中,如LED呼吸灯,舵机驱动,直流电机的驱动。因为PWM原理为Ton的期间开启,Toff期间关闭,然后反复进行,比如LED呼吸灯,利用光在人眼中的停留;舵机,电机在断电期间不会立即停下了的原理,实现控制LED的任意亮度和电机和舵机的不同速度。

3.输出比较和PWM的关系

输出比较有CNT,ARR,CCR三个,在计数时,如图

当CNT在(0,CCR)时,可输一种电平(比如为高电平)。

当CNT在(CCR,ARR)时,可输另一种电平(那么就只能是低电平)。

如图,实现了PWM要求的反复连续改变电平要求。

4.通用定时器框图——输出比较通道

当CNT >= CCR1时,输出模式控制器会改变OC1ref的高低电平。

OC1ref:output compare reference(参考信号)

5.输出比较模式介绍

当CNT >= CCR1后,会发生什么呢?这取决于输出模式控制器里执行的逻辑

模式描述
冻结CNT = CCR时,REF保持原状态
匹配时置有效电平CNT = CCR时,REF置有效电平(高电平)
匹配时置无效电平CNT = CCR时。REF置无效电平(低电平)
匹配时电平翻转CNT = CCR时,REF电平翻转
强制为无效电平CNT与CCR无效,REF强制为无效电平
强制为有效电平CNT与CCR无效,REF强制为有效电平
PWM模式1

向上计数:CNT<CCR时,REF置有效电平

                  CNT>=CCR时,REF置无效电平

向下计数:CNT>CCR时,REF置无效电平

                  CNT<=CCR时,REF置有效电平

PWM模式2

向上计数:CNT<CCR时,REF置无效电平

                  CNT>=CCR时,REF置有效电平

向下计数:CNT>CCR时,REF置有效电平

                  CNT<=CCR时,REF置无效电平

注:PWM模式1与PWM模式2是相反的极性。

6.PWM基本结构

PWM工作流程:

1.RCC开启时钟,把我们要用的TIM外设和GPIO外设的时钟打开。

2.配置时基单元,包含前面的是时钟源选择。

3.配置输出比较单元包括CCR的值,极性选择。输出使能。

4.配置GPIO(复用推挽输出),只有复用输出才可以将GPIO口的控制权交给其他外设。

5.运行控制。

注:

(1)CCR由自己控制,输出不同速率的PWM。

(2)PWM模式1

7.PWM参数计算

(1)PWM频率 (Freq)= 计数器一个溢出更新周期

                                         = CK_CNT_OV

                                         = CK_PSC / (PSC+1) /(ARR+1)

(2)PWM占空比(Duty)= CCR / (ARR+1)

        其中:一个周期中,CCR为高电平时间,ARR为总时间

(3)PWM分辨率(Reso) = 1 / (ARR+1)

7.1 PWM参数计算示例:要求输出一个频率为1KMZ,占比比可任意调节,且分辨率为1%的PWM波形。

解:

因为Reso = 1%

由Reso = 1/ (ARR+1)

所以得出(ARR+1)为100

因为Freq = 1KHZ

由Freq = CK_CNT_OV = 72MHZ / (PSC+1)/ (ARR+1)

得出(PSC+1)=720

8输出比较函数补充

8.1 用于配置输出比较模块(不同函数对应不同的单元)

void TIM_OC1Init(TIM_TypeDef * TIMx,TIM_OCInitTypeDef * TIM_OCInitStruct);

void TIM_OC2Init(TIM_TypeDef * TIMx,TIM_OCInitTypeDef * TIM_OCInitStruct);

void TIM_OC3Init(TIM_TypeDef * TIMx,TIM_OCInitTypeDef * TIM_OCInitStruct);

void TIM_OC4Init(TIM_TypeDef * TIMx,TIM_OCInitTypeDef * TIM_OCInitStruct);

参数1:TIM_TypeDef * TIMx        选择定时器

参数2:TIM_OCInitTypeDef * TIM_OCInitStruct        结构体配置输出比较的参数

8.2 void TIM_OCStructInit(TIM_OCInitTypeDef * TIM_OCInitStruct)

作用:给结构体配置一个默认值

8.3 用于单独更改CCR寄存器值的函数

void TIM_SetCompare1(TIM_TypeDef * TIMx,uint16_t Comparex);

void TIM_SetCompare2(TIM_TypeDef * TIMx,uint16_t Comparex);

void TIM_SetCompare3(TIM_TypeDef * TIMx,uint16_t Comparex);

void TIM_SetCompare4(TIM_TypeDef * TIMx,uint16_t Comparex);

参数1:TIM_TypeDef * TIMx                选择定时器

参数2:uint16_t Comparex        要改入的CCR

8.4 void TIM_CtrPWMOutputs(TIM_TypeDef * TIMx,FunctionalState NewState)

仅高级定时器使用,在使用高级定时器输出PWM时,需要调用这个函数,使能主输出,否则PWM将不能正常输出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值