跳到主要内容

STM32 输出比较

介绍

STM32微控制器的定时器模块功能强大,其中输出比较(Output Compare)是定时器的重要功能之一。输出比较允许开发者通过比较定时器的计数值与预设的比较值,来触发特定的事件或生成精确的PWM信号。这对于控制电机、生成音频信号或实现精确的时间控制非常有用。

在本教程中,我们将逐步讲解STM32输出比较的工作原理,并通过代码示例和实际案例帮助你掌握这一功能。


输出比较的基本概念

输出比较的核心思想是通过比较定时器的当前计数值(CNT)与预设的比较值(CCR),来触发以下操作:

  1. 改变输出引脚状态:当 CNT == CCR 时,可以翻转、置高或置低输出引脚的状态。
  2. 生成中断或事件:当 CNT == CCR 时,可以触发中断或事件,用于执行特定的任务。

STM32的定时器通常支持多种输出比较模式,例如:

  • 翻转模式(Toggle Mode):当 CNT == CCR 时,输出引脚的状态翻转。
  • 强制模式(Force Mode):手动设置输出引脚的状态。
  • PWM模式(PWM Mode):生成PWM信号。

输出比较的配置步骤

以下是配置STM32输出比较的基本步骤:

  1. 启用定时器时钟:通过RCC寄存器启用定时器的时钟。
  2. 配置定时器:设置定时器的预分频器(Prescaler)和自动重装载值(Auto-reload Register, ARR)。
  3. 配置输出比较通道:选择输出比较模式,并设置比较值(CCR)。
  4. 启用输出比较:启动定时器和输出比较功能。
  5. 处理中断(可选):如果需要,可以启用中断并编写中断服务程序(ISR)。

代码示例:生成PWM信号

以下是一个使用STM32输出比较功能生成PWM信号的示例代码:

c
#include "stm32f4xx.h"

void TIM2_Init(void) {
// 1. 启用TIM2时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

// 2. 配置TIM2
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
TIM_TimeBaseStruct.TIM_Prescaler = 84 - 1; // 84MHz / 84 = 1MHz
TIM_TimeBaseStruct.TIM_Period = 1000 - 1; // 1MHz / 1000 = 1kHz PWM频率
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStruct);

// 3. 配置输出比较通道1
TIM_OCInitTypeDef TIM_OCStruct;
TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCStruct.TIM_Pulse = 500; // 占空比 = 500 / 1000 = 50%
TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM_OCStruct);

// 4. 启用TIM2
TIM_Cmd(TIM2, ENABLE);
}

int main(void) {
TIM2_Init();
while (1) {
// 主循环
}
}

代码说明

  • TIM_Prescaler:将系统时钟分频为1MHz。
  • TIM_Period:设置PWM周期为1000个计数,即1kHz频率。
  • TIM_Pulse:设置占空比为50%(500 / 1000)。

实际应用案例:控制LED亮度

输出比较常用于控制LED的亮度。通过调整PWM信号的占空比,可以改变LED的平均电流,从而实现亮度的调节。

c
void AdjustLEDBrightness(uint16_t dutyCycle) {
TIM_SetCompare1(TIM2, dutyCycle); // 设置占空比
}

main函数中调用AdjustLEDBrightness,可以动态调整LED的亮度:

c
int main(void) {
TIM2_Init();
while (1) {
for (uint16_t i = 0; i < 1000; i += 10) {
AdjustLEDBrightness(i);
Delay(100); // 延时
}
}
}

总结

STM32的输出比较功能是定时器模块的核心功能之一,能够用于生成精确的PWM信号、控制外设或触发事件。通过本教程,你已经学会了如何配置输出比较通道并生成PWM信号。在实际项目中,输出比较功能可以用于控制电机、调节LED亮度或生成音频信号等。


附加资源与练习

资源

练习

  1. 修改代码,生成一个频率为2kHz、占空比为25%的PWM信号。
  2. 使用输出比较功能控制两个LED,分别以不同的亮度闪烁。
  3. 尝试使用输出比较的中断功能,在每次比较匹配时打印一条调试信息。
提示

如果你在实验中遇到问题,可以参考STM32的参考手册或使用STM32CubeMX工具生成初始化代码。