STM32 CubeIDE(八)通用定时器PWM
通用定时器
STM32F407 系列控制器有10 个通用定时器,所有通用定时器都是彼此独立的,不共享任何资源。
APB1接口定时器(42MHz):
TIM2、TIM5:32位计数器、支持向上计数、向下计数、向上向下计数,可生产DMA请求、四路捕获/比较通道,支持正交解码。
TIM3、TIM4:16位计数器、支持向上计数、向下计数、向上向下计数,可生产DMA请求、四路捕获/比较通道,支持正交解码。
TIM12:16位计数器、支持向上计数,两路捕获/比较通道。
TIM13、TIM14:16位计数器、支持向上计数,一路捕获/比较通道。
APB2接口定时器(84MHz):
TIM9:16位计数器、支持向上计数,两路捕获/比较通道。
TIM10、TIM11:16位计数器、支持向上计数,一路捕获/比较通道。
输入/比较通道可用于:
- 输入捕获
- 输出比较
- PWM生产
- 单脉冲输出
PWM
脉冲宽度调制,简称PWM,是利用微型处理器的数字信号输出来对模拟电路进行控制的一种非常有效的技术,广泛应用于测量、通讯、功率控制与变换的许多领域中。
在模拟电路中,时间和值在幅度上几乎没有限制,基本上可以取任何实数值,所以电压和电流可以直接用来控制对象。
而在数字电路中,只能输出1和0两种状态,所以电压或电流会通过通断方式的重复脉冲序列加载到模拟负载。
PWM波就是用数字信号对模拟信号的电平进行编码后的脉冲。
PWM的优点是从处理器到被控系统信号都是数字形式的,无需进行数模转换,让信号保持为数字形式可将噪声影响降到最小。噪声只有在强到足以将逻辑 1 改变为逻辑 0 或将逻辑 0 改变为逻辑 1 时,也才能对数字信号产生影响。
总之,PWM既经济、节约空间、抗噪性能强,是一种广大工程师在许多设计应用中使用的有效技术。
通用定时器PWM原理
以向上计数模式为例,除了定时器计数值CNT和自动重装载值ARR之外,还有一个计数比较值CCR,当CNT > CCR时,通道输出高电平,当CNT < CCR时,通道输出低电平,当CNT = ARR时,重新开始计时,至此就输出了一个PWM波。
输出比较初始化结构体
/**
* @brief TIM Output Compare Configuration Structure definition
*/
typedef struct
{
uint32_t OCMode; /*!< 输出比较模式 */
uint32_t Pulse; /*!< 输出比较值 */
uint32_t OCPolarity; /*!< 输出极性 */
uint32_t OCNPolarity; /*!< 互补通道输出极性 */
uint32_t OCFastMode; /*!< PWM快速模式 */
uint32_t OCIdleState; /*!< 空闲状态输出极性 */
uint32_t OCNIdleState; /*!< 互补通道空闲状态输出极性 */
} TIM_OC_InitTypeDef;
PWM模式
TIM_OCMODE_PWM1:在向上计数时,一旦CNT<CCR时通道为有效电平,否则为无效电平;在向下计数时,一旦CNT>CCR时通道为无效电平,否则为有效电平。
TIM_OCMODE_PWM2:在向上计数时,一旦CNT<CCR时通道为无效电平,否则为有效电平;在向下计数时,一旦CNT>CCR时通道为有效电平,否则为无效电平。
PWM函数
HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim); //PWM定时器初始化
HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); //PWM通道初始化
HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel); //开启定时器通道的PWM
HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); //开启定时器通道的PWM和中断
__HAL_TIM_SetCompare(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t Compare); //设置定时器通道比较值
PWM输出实验
本次实验基于野火STM32F407-霸天虎V2开发板实现,使用通用定时器14产生1KHz,占空比70%的PWM波,,并通过示波器进行观察。
打开Cube,在Timers中激活TIM14,Channel1设置为PWM Generation CH1,设置分频系数83,向上计数模式,自动重装载值999,使能自动重装载,PWM模式1,比较值699,有效电平High。TIM14时钟频率为84MHz,84分频后为1MHz,即计数周期1us,计数值1000即PWM周期1ms,频率1KHz,比较值700,占空比70%。
生成代码后,在main函数中相应位置添加以下代码开启PWM输出。
int main(void)
{
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim14, TIM_CHANNEL_1);
/* USER CODE END 2 */
}