定时器输出比较功能:输出PWM波形
OC(Output Compare)输出比较
输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形。
每个高级定时器和通用定时器都拥有4个输出比较通道。
高级定时器的前3个通道额外拥有死区生成和互补输出的功能(三项电机)。
CCR:捕获比较寄存器。IC(InputCompare):输入捕获 CC:Capture/Compare
PWM(Pulse Width Modulation)脉冲宽度调制
在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域
PWM参数:
频率= 1 /TS (频率越快等效的模拟信号越平稳,开销越大)
占空比= TON / TS(占空比越大,等效的模拟电压就越趋向于高电平,占空比越小,等效的模拟电压就越趋向于低电平) 分辨率= 占空比变化步距(例如:1%,2%,3% 这种分辨率是1%)
当调控灯的点亮和熄灭的时间比例时,就能让LED呈现出不同的亮度级别。下1图,++上长下短等效模拟量偏上。上短下长等效模拟模拟量偏上。++
高级定时器前三个输出比较部分电路
通用定时器输出比较部分电路
CNT>=CCR1,输出模式控制器收到信号会改变OC1REF的输出电平。该信号:1.可以前往主模式控制器,把REF信号映射到主模式的TRGO输出上去;2.通过下路到达极性选择。极性选择:给CC1P写0,即不反转,写1,电平翻转。上方的ETRF一般不用。
输出模式控制器(输出比较模式)
**冻结模式:**输出PWM波形时候,想暂停一下, 切换为冻结模式,PWM波形输出停止,高低电平位置暂停时刻的状态,保持不变。
有效电平和无效电平是高级定时器的说法,是和关断、刹车这些功能配和表述。
**匹配时翻转模式:**可以输出一个频率可调,高低电平时间相等,占空比为50%的PWM波形;例如,如CCR为0,那CNT每次更新清0时,就会产生一次CNT=CCR的时间,每更新两次,输出为一个周期。当改变定时器更新频率时,输出波形频率也会随之改变。
**PWM模式1:**可以输出频率和占空比都可调的PWM波形,一般只使用向上计数,由于输出模式里可以设置极性,所以PWM模式1的正极性和PWM模式2的反极性最终的输出是一样的。
输出PWM的基本结构:
ARR为黄色线;CCR为红色线;CCR设置大一点,占空比就大;CCR设置的小一点,占空比就小;
PWM频率: Freq= CK_PSC / (PSC +1) / (ARR +1)
PWM占空比: Duty= CCR / (ARR +1) // 因为30时刻已经变成低电平了,所以不是CCR+1
PWM分辨率: Reso= 1 / (ARR +1)
PWM使用步骤:
第一步RCC开始时钟,把要用的TIM外设和GPIO的外设打开;
第二步 配置时基单元,包括时钟源选择
第三步 配置输出比较单元,包括CCR的值,输出比较模式,极性选择,输出使能这些参数。
第四步 配置GPIO。
第五步 启动计数器。
硬件:
舵机:
舵机是一种根据输入PWM信号占空比来控制输出角度的装置.
输入PWM信号要求:周期为20ms ,高电平宽度为0.5ms~2.5ms;舵机不是使用PWM等效模拟输入,而是把PWM当成一个通信协议;
直流电机
直流电机是一种将电能转换为机械能的装置,有两个电极,当电极正接时,电机正转,当电极反接时,电机反转
直流电机属于大功率器件,GPIO口无法直接驱动,需要配合电机驱动电路来操作
TB6612是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速和方向。
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);
void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);配置CCR寄存器的预装功能(影子寄存器);
void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);用来配置快速使能,(单脉冲模式)
void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);外部事件时,清楚ref信号;
void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);用来单独设置输出比较的极性的
void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);N 为互补通道
void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
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);
void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);用来单独更改输出比较模式的函数
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);用来单独更改CCR寄存器值的函数
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);
void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);仅在高级定时器使用,在使用该机定时器输出PWM时,需要调用这个函数,使能主输出,否则PWM将不能输出。
AFIO :配置引脚的重映射;
AF_PP复用推挽输出,只有把GPIO设置成复用推挽输出,才能输出到GPIO端口例如PA0;