OC(Output Compare)输出比较:
输出比较可以通过比较CNT(计数器)与CCR(捕获/比较寄存器)的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形
每个高级定时器和通用定时器都拥有4个输出比较通道
高级定时器的前3个通道额外拥有死区生成和互补输出的功能
PWM的介绍:
PWM(Pulse Width Modulation)脉冲宽度调制
在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域
PWM参数:
频率 = 1 / TS
占空比 = TON / TS
分辨率 = 占空比变化步距(是占空比变化的精细程度)
输出比较通道(通用定时器):
REF(reference):参考信号,由CCR和CNT比较得出
CCR(capture compare register): 捕获/比较寄存器
CNT:计数器
极性选择:
- 给CC1P这个寄存器写0,信号就往上走,就是信号电平不翻转,输出就是输入原信号。
- 给CC1P写1的话,信号就往下走,就是信号通过一个非门取反,输出的信号就是输入信号的高低电平取反的信号。
REF经过比较后具体给什么电平可看下图:
冻结模式:输出暂停,REF保持上一个状态,并且高低电平也维持在暂停时刻的状态,保持不变。
匹配时置有效/无效电平模式 :可以理解为有效电平为高电平,无效电平为低电平。
匹配时电平翻转模式:可以方便地输出一个频率可调的占空比为50%PWM波形。
强制有效/无效电平模式:CNT与CCR无效,强制为高低电平
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的基本结构(重要):
黄线(ARR)
蓝线(CNT)
红线(CCR)
模式:PWM1
PWM的参数计算:
PWM的频率: 就是计数器(CNT)的更新频率(计数器溢出频率)
PWM的占空比: 因为PWM1模式CNT>=CCR就是低电平,所以高电平一共占了0~CCR-1,所以就是CCR(Ton)/ARR+1(Ts)
PWM的分辨率:取决于ARR的值,因为当你CCR超过了ARR在PWM1上就一直是有效电平(高电平),这样无意义,所以ARR值越大越好,分辨率就越精细,这样占空比就更细腻。
设置PWM代码过程:
- RCC开启时钟,要用到TIM和GPIO外设时钟打开。
- 配置时基单元
- 配置输出比较单元,包括CCR的值,输出比较模式,极性选择,输出使能这些参数。
- 配置GPIO,把PWM对应的GPIO口,初始化为复用推挽输出的配置。
- 运行控制。启动计数器,这样就能输出PWM了。
有关PWM和输出比较模块的库函数(重要的函数序号前有*号):
OC(Output Compare)输出比较
*1.配制输出模块(一共有四个OC1~4),参数分别是:1选择定时器,2结构体,输出比较的那些参数了。
void TIM_OC1Init (TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
2.给输出比较结构体赋一共默认值,参数是结构体
voidTIM_OCStructInit(TIM_OCInitTypeDef*TIM_OCInitStruct);
- 配制强制输出模式(通用和上面配置输出模块一样OC1~OC4),参数为1选择定时器,2……
void TIM_ForcedOC1Config (TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
- 配置CCR预装功能(影子寄存器:写入的值不会立即生效,而是在更新事件后生效)同样有OC1~OC4
void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
5.配置快速使能(同样有OC1~OC4)
void TIM_OC1FastConfig (TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
6.外部事件时清除REF信号(同样有OC1~OC4)
void TIM_ClearOC1Ref (TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
7.单独设置输出比较极性(带N的是高级定时器的互补通道配置,同样有OC1~OC4)
void TIM_OC1PolarityConfig (TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC1NPolarityConfig (TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
8.用来单独修改输出使能(带N的是高级定时器的互补通道配置)
void TIM_CCxCmd (TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);
void TIM_CCxNCmd (TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);
9.选择输出比较模式(用来单独更改输出比较模式的函数)
void TIM_SelectOCxM (TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);
*10.用来单独更改CCR寄存器值的函数(同样有OC1~OC4)
在函数运行时需要更改占空比,就得用这个函数。
void TIM_SetCompare1 (TIM_TypeDef* TIMx, uint16_t Compare1);
Yik_XXX: 有我当年风范
qq_59804548: 大佬,方便分享源码吗,还没买飞控,想参考一下结构内容
CSDN-Ada助手: 非常感谢您的辛勤创作!您的第20篇博客《BKP及RTC简介》真是让读者获益匪浅。您在介绍BKP和RTC方面的知识非常详尽,让我们对这两个领域有了更深入的了解。希望您能继续保持创作的热情,分享更多有关技术和相关领域的知识。或许下一步,您可以探讨一下BKP和RTC在实际应用中的案例研究,以及它们对现代科技发展的潜在影响。期待您的下一篇博客!
是子以: 很有水平
CSDN-Ada助手: 恭喜您写下了第19篇博客!标题为“Unix时间戳”听起来非常有趣。您的持续创作精神值得赞扬。不断分享关于Unix时间戳的知识,无疑会为读者带来更多的启发和见解。或许下一步,您可以考虑探索Unix时间戳的应用领域,或者分享一些实际案例,以便读者更好地理解其实用性。再次感谢您的分享,期待您未来更多的精彩博客!