跳到主要内容

STM32 高级定时功能

介绍

STM32微控制器以其强大的定时器功能而闻名,这些功能在嵌入式系统中广泛应用于时间测量、PWM信号生成、输入捕获和输出比较等任务。本文将深入探讨STM32的高级定时功能,帮助初学者理解并掌握这些功能的使用方法。

定时器基础

STM32的定时器模块通常包括以下几个主要部分:

  • 计数器:用于计数时钟脉冲。
  • 预分频器:用于降低输入时钟频率。
  • 自动重装载寄存器:用于设置计数器的上限值。
  • 捕获/比较寄存器:用于存储捕获或比较的值。

定时器模式

STM32的定时器可以配置为多种模式,包括:

  • 向上计数模式:计数器从0计数到自动重装载寄存器的值,然后重新开始。
  • 向下计数模式:计数器从自动重装载寄存器的值计数到0,然后重新开始。
  • 中央对齐模式:计数器从0计数到自动重装载寄存器的值,然后向下计数到0,如此循环。
c
// 配置定时器为向上计数模式
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 1000; // 自动重装载寄存器的值
TIM_TimeBaseStructure.TIM_Prescaler = 7200; // 预分频器
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

PWM生成

PWM(脉宽调制)是一种常用的信号调制技术,广泛应用于电机控制、LED调光等领域。STM32的定时器可以生成PWM信号,通过调整占空比来控制输出信号的平均电压。

c
// 配置定时器为PWM模式
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 500; // 占空比50%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM2, &TIM_OCInitStructure);

输入捕获

输入捕获功能用于测量外部信号的脉冲宽度或频率。STM32的定时器可以捕获外部信号的上升沿或下降沿,并记录捕获时的计数器值。

c
// 配置定时器为输入捕获模式
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(TIM2, &TIM_ICInitStructure);

输出比较

输出比较功能用于在计数器达到特定值时触发事件或改变输出引脚的状态。STM32的定时器可以配置为在计数器达到比较值时产生中断或改变输出引脚的电平。

c
// 配置定时器为输出比较模式
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 500; // 比较值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);

实际应用场景

电机控制

在电机控制中,PWM信号用于控制电机的转速。通过调整PWM信号的占空比,可以改变电机的平均电压,从而控制其转速。

c
// 配置定时器为PWM模式,控制电机转速
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 750; // 占空比75%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM2, &TIM_OCInitStructure);

频率测量

在频率测量中,输入捕获功能用于测量外部信号的频率。通过捕获信号的上升沿或下降沿,并记录捕获时的计数器值,可以计算出信号的频率。

c
// 配置定时器为输入捕获模式,测量信号频率
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(TIM2, &TIM_ICInitStructure);

总结

STM32的高级定时功能为嵌入式系统提供了强大的时间管理和信号处理能力。通过掌握定时器模式、PWM生成、输入捕获和输出比较等功能,开发者可以实现复杂的控制算法和信号处理任务。

附加资源

练习

  1. 配置STM32的定时器为PWM模式,生成一个占空比为25%的PWM信号。
  2. 使用输入捕获功能测量一个外部信号的频率,并将结果通过串口输出。
  3. 配置定时器为输出比较模式,在计数器达到特定值时触发中断,并在中断服务程序中改变LED的状态。