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将不能正常输出。