Skip to content

第四章 输出比较

4.1 输出比较

4.1.1 输出比较介绍

  • OC(Output Compare)输出比较
  • 输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形
  • 每个高级定时器和通用定时器都拥有4个输出比较通道
  • 高级定时器的前3个通道额外拥有死区生成和互补输出的功能(用于驱动三相无刷电机)

4.1.2 输出比较框图

  1. 输出比较模式控制器,当CNT>=CCR时输出一个参考电平(即图中oc1ref)
  2. 极性选择,选择是否对参考电平进行反转(即0→1或1→0)
  3. 使能输出,在对应的通道输出电平

CNT为计数值,CRR为 捕获/比较器,用于与CNT值比较

image-20241205203021165

4.1.3 输出比较模式

输出模式控制器 的工作逻辑选择:

模式 描述
冻结 CNT=CCR时,REF保持为原状态
匹配时置有效电平 CNT=CCR时,REF置有效电平
匹配时置无效电平 CNT=CCR时,REF置无效电平
匹配时电平翻转 CNT=CCR时,REF电平翻转
强制为无效电平 CNT与CCR无效,REF强制为无效电平
强制为有效电平 CNT与CCR无效,REF强制为有效电平
PWM模式1 向上计数:CNTCCR时,REF置无效电平,CNT≤CCR时,REF置有效电平
PWM模式2 向上计数:CNTCCR时,REF置有效电平,CNT≤CCR时,REF置无效电平

Note

只有 PWM模式 1PWM模式 2 为常用模式,可以输出频率占空比均可以调节的PWM波,其他模式有局限性不常用,其中 匹配时电平翻转 可以输出占空比恒为50%的PWM波。

4.1.4 STM32CubeMX参数

以TIM3通用定时器通道 1 为例:

image-20241205212240021

部分为输入捕获参数,不在此处介绍,关于输出比较参数介绍如下:

  • Output Compare No Output :在此模式下,输出比较通道没有任何实际的输出作用。该模式常用于仅进行比较操作,但不驱动外部信号。
  • Output Compare CH1 :在这个模式下,定时器会根据设定的比较值与计数器值进行比较。如果匹配,定时器会执行相应的操作。
  • PWM Generation No Output :在此模式下,定时器配置为 PWM 生成模式,但没有任何外部输出信号。这通常用于内部计算或调试目的。
  • PWM Generation CH1 :在此模式下,定时器会在通道 1 上生成 PWM 信号。

其中, Output Compare CH1PWM Generation CH1 为常用模式,其他了解即可。

通道若选择 Output Compare CH1 ,则可以选择通道工作模式为以下 6 种,一一对应 4.1.3 表格中的模式:

  1. Frozen (used for Timing base),即冻结
  2. Active Level on match,即匹配时置有效电平
  3. Inactive Level on match,即匹配时置无效电平
  4. Toggle on match,即匹配式反转电平
  5. Forced Active,即强制为有效电平
  6. Forced Inactive,即强制为无效电平

通道若选择 PWM Compare CH1 ,则可以选择通道工作模式为以下 2 种,一一对应 4.1.3 表格中的模式:

  1. PWM mode 1,即PWM模式 1
  2. PWM mode 2,即PWM模式 2

4.2 PWM

4.2.1 PWM介绍

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

    ​ ⭐频率 = 1 / T_S ⭐占空比 = T_ON / T_S 分辨率 = 占空比变化步距

1706197859960

4.2.2 PWM基本结构

image-20241205210104708

image-20241205210039103

4.3 STM32CubeMX配置

Warning

关于RCC、SYS、LED这里不做重复配置,详情可看GPIO章节。

image-20241205223226709

image-20241205223717325

\[ 占空比=\frac{CCR}{ARR} \]

Warning

注意PSC和ARR的参数随意但要保持最后的频率不要太小,这样LED会是闪烁的,应把频率控制在100左右或以上为好,这样才能实现控制亮度,其余参数自行百度了解即可。

最后时钟配置为72MHZ,生成工程。

image-20241128112459137

4.4 呼吸灯代码

main函数中声明一个占空比变量

C
/* USER CODE BEGIN Init */
int pwm_val;
/* USER CODE END Init */

使能PWM通道 1 和 2

C
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
/* USER CODE END 2 */

while循环写呼吸灯代码

C
/* USER CODE BEGIN 3 */
for (pwm_val = 0; pwm_val < 900; pwm_val++) {
    __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm_val);
    HAL_Delay(1);
}
for (pwm_val = 0; pwm_val < 900; pwm_val++) {
    __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, 900 - pwm_val);
    HAL_Delay(1);
}