【PWM简介】
PWM(Pulse-width modulation)是脉冲宽度调制的缩写。脉冲宽度调制是一种模拟信号电平数字编码方法。脉冲宽度调制PWM是通过将有效的电信号分散成离散形式从而来降低电信号所传递的平均功率的一种方式。所以根据面积等效法则,可以通过对改变脉冲的时间宽度,来等效的获得所需要合成的相应幅值和频率的波形。实现模拟电路的数字化控制可显著降低系统成本和功耗。许多微控制器和数字信号处理器 (DSP) 已包括了 PWM控制器芯片,因此可以更轻松地实施数字化控制。PWM信号是通过调节占空比的变化来调节信号、能量等的变化。
在STM32中,他的定时器可以方便的输出PWM。此篇使用stm32cubeMX对TIM进行配置。
【stm32cubeMX配置】
从原理图上看出Arduino的接口,给出了TIM4的输出通道:
打开配置界面,使能PWM4的CH4、CH2通道为普通PWM输出:
一个用于驱动蜂鸣器输出警告,另一个输出制冷信号,用于驱动MOS管或者继电器对半导。
修改GPIO对应的PWM通道:
【输出频率配置】
从STM32H7S的时钟看出,TIM4接在APB1总线上。
从STM32CUBEMX上看到我们配置的APB1时钟频率为300MHz
为了产生1Hz的PWM输出信号,我这里配置PSC为3000-1 Output Period为100000-1,输出点空比为50000,则为50%的占空比信号。
TIM4的溢出频率=300M / ( Counter Period + 1 ) / ( Prescaler + 1 ),如下图所示,TIM8的溢出频率 = 300M / 3000 / 100000 = 1Hz。 周期T = 1 / f = 1 / 1 = 1s。
【工程测试】
在主函数中添加
if (HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2) != HAL_OK)
{
/* PWM Generation Error */
// Error_Handler();
printf("tim3_channel2 start erro\r\n");
}
if (HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_4) != HAL_OK)
{
/* PWM Generation Error */
// Error_Handler();
printf("tim3_channel2 start erro\r\n");
}
下载工程到开发板,用示波器测试得到波形如下:
接上蜂鸣器,可以扣到0.5秒的鸣响。
【总结】
在stm32pwm的输出配置中,需要使用到的参数有TIM挂载所在的总线的速率,TIM的分频系数Prescaler,溢出计数Counter Period ,点空比计数值Pluse。了解他几个参数计算出pwm频率、占空比就可以初步的使用pwm了。
当然在具体的使用中需要用到开启定时器 HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_4),
修改占空比:__HAL_TIM_SetCompare(&htim14, TIM_CHANNEL_2, pwmval); //修改占空比