定时器输出比较的应用
1. PWM 输出模式
PWM输出就是对外输出脉宽(即占空比)可调的方波信号,信号频率由自动重装寄存
器 ARR 的值决定,占空比由比较寄存器 CCR 的值决定。
PWM 模式分为两种, PWM1 和 PWM2,总得来说是差不多,就看你怎么用而已,具
体的区别见表格
模式 | 计数器 CNT 计算方式 | 说明 |
---|---|---|
PWM1 | 递增 | CNT<CCR,通道CH有效,否则为无效 |
递减 | CNT>CCR,通道CH无效,否则为有效 | |
PWM2 | 递增 | CNT<CCR,通道CH无效,否则为有效 |
递减 | CNT>CCR,通道CH有效,否则为无效 |
1.1 边沿对齐模式
在边沿对齐模式下,计数器 CNT 只工作在一种模式,递增或者递减模式。这里我们以
CNT 工作在递增模式为例,在中, ARR=8, CCR=4, CNT 从 0 开始计数,当 CNT<CCR 的
值 时 , OCxREF 为 有 效 的 高 电 平, 于 此同 时, 比 较 中断 寄 存器 CCxIF 置 位 。 当
CCR=<CNT<=ARR 时, OCxREF为无效的低电平。然后 CNT又从 0开始计数并生成计数器
上溢事件,以此循环往复。
1.2 中心对齐模式
在中心对齐模式下, 计数器 CNT 是工作做递增/递减模式下。开始的时候, 计数器
CNT 从 0 开始计数到自动重载值减 1(ARR-1),生成计数器上溢事件;然后从自动重载值开
始向下计数到 1 并生成计数器下溢事件。之后从 0 开始重新计数。
图是 PWM1模式的中心对齐波形, ARR=8, CCR=4。第一阶段计数器 CNT 工作在递增模式下,从 0 开始计数,当 CNT<CCR 的值时, OCxREF 为有效的高电平,当CCR=<CNT<<ARR时, OCxREF为无效的低电平。第二阶段计数器CNT工作在递减模式,从 ARR 的值开始递减,当 CNT>CCR 时, OCxREF 为无效的低电平,当 CCR=>CNT>=1 时,OCxREF 为有效的高电平。
在波形图上我们把波形分为两个阶段,第一个阶段是计数器 CNT 工作在递增模式的波形,这个阶段我们又分为①和②两个阶段,第二个阶段是计数器 CNT 工作在递减模式的波形,这个阶段我们又分为③和④两个阶段。要说中心对齐模式下的波形有什么特征的话,那就是①和③阶段的时间相等,②和④阶段的时间相等。
中心对齐模式又分为中心对齐模式 1/2/3 三种,具体由寄存器 CR1 位 CMS[1:0]配置。具体的区别就是比较中断中断标志位 CCxIF 在何时置 1:中心模式 1 在 CNT 递减计数的时候置 1,中心对齐模式 2 在 CNT 递增计数时置 1,中心模式 3 在 CNT 递增和递减计数时都置 1。
2. 定时器初始化结构体详解
2.1 TIM_TimeBaseInitTypeDef
typedef struct
{
uint16_t TIM_Prescaler; //预分频器
uint16_t TIM_CounterMode; //计数模式
uint16_t TIM_Period; //计数器周期
uint16_t TIM_ClockDivision; //时钟分频
uint8_t TIM_RepetitionCounter; //重复计数器
} TIM_TimeBaseInitTypeDef;
2.2 TIM_OCInitTypeDef
typedef struct
{
uint16_t TIM_OCMode; /*比较输出模式*/
uint16_t TIM_OutputState; /*比较输出使能*/
uint16_t TIM_OutputNState; /*比较互补输出使能*/
uint16_t TIM_Pulse; /*脉冲宽度 */
uint16_t TIM_OCPolarity; /*输出极性 */
uint16_t TIM_OCNPolarity; /*互补输出极性*/
uint16_t TIM_OCIdleState; /*空闲状态下比较输出状态*/
uint16_t TIM_OCNIdleState; /*空闲状态下互补比较输出状态*/
} TIM_OCInitTypeDef;
2.3 TIM_ICInitTypeDef
typedef struct
{
uint16_t TIM_Channel; /*输入通道选择*/
uint16_t TIM_ICPolarity; /*输入捕获触发选择*/
uint16_t TIM_ICSelection; /*输入捕获选择 */
uint16_t TIM_ICPrescaler; /*输入捕获预分频 */
uint16_t TIM_ICFilter; /*输入捕获滤波器*/
} TIM_ICInitTypeDef;