PWM(Pulse Width Modulation)控制就是对脉冲的宽度进行调制的技术,即通过对一系列脉冲的宽度进行调制,来等效的获得所需要的波形(含形状和幅值);面积等效原理是PWM技术的重要基础理论;一种典型的PWM控制波形SPWM:脉冲的宽度按正弦规律变化而和正弦波等效的PWM波形称为SPWM波。
在模拟电路中,模拟信号的值可以连续进行变化,在时间和值的幅度上都几乎没有限制,基本上可以取任何实数值,输入与输出也呈线性变化。所以在模拟电路中,电压和电流可直接用来进行控制对象,例如家用电器设备中的音量开关控制、采用卤素灯泡灯具的亮度控制等等。
但模拟电路有诸多的问题:例如控制信号容易随时间漂移,难以调节;功耗大;易受噪声和环境干扰等等。
与模拟电路不同,数字电路是在预先确定的范围内取值,在任何时刻,其输出只可能为ON和OFF两种状态,所以电压或电流会通/断方式的重复脉冲序列加载到模拟负载。PWM技术是一种对模拟信号电平的数字编码方法,通过使用高分辨率计数器(调制频率)调制方波的占空比,从而实现对一个模拟信号的电平进行编码。其最大的优点是从处理器到被控对象之间的所有信号都是数字形式的,无需再进行数模转换过程;而且对噪声的抗干扰能力也大大增强(噪声只有在强到足以将逻辑值改变时,才可能对数字信号产生实质的影响),这也是PWM在通讯等信号传输行业得到大量应用的主要原因。
可以通过对改变脉冲的时间宽度,来等效的获得所需要合成的相应幅值和频率的波形;
由上图可知,脉冲宽度调制使用一个脉冲宽度会被调制的方波,并且波型的平均值会有所变化。如果我们考虑一个周期为 的脉冲波,低值 ,高值为 ,跟占空比(duty cycle),此波的平均值为
PWM是如何实现?
PWM实现的原理是通过锯齿波/三角波(载波)所需要合成的波形(调制波)进行比较,然后确定PWM所需要输出的极性,通常是ON或者是OFF,因为一般都是作用到开关元器件上;
现在的MCU大部分都自带硬件PWM发生器,即配置好相应的寄存器,就能直接产生PWM,下面的例子基于NUCLEO-F767ZI,通过cubemx配置了三路PWM输出,然后实现了呼吸灯
int main(void)
{
HAL_Init();
MX_GPIO_Init();
MX_TIM0_Init();
MX_TIM14_Init();
MX_TIM16_Init();
int32_t time_stamp = 0;
int32_t time_stamp_old = 0;
int32_t ccr_val = 0;
uint8_t add_flag = 1;
HAL_TIM_PWM_Start(&htim4, PWM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim12, PWM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim3, PWM_CHANNEL_3);
while (1)
{
time_stamp = HAL_GetTick();
if(time_stamp - time_stamp_old > 5){
time_stamp_old = time_stamp;
if(add_flag){
ccr_val+=25;
if(ccr_val >= 0xFFFF){
ccr_val = 0xFFFF;
add_flag = 0;
}
}else{
ccr_val-=25;
if(ccr_val <= 0){
add_flag = 1;
ccr_val = 0;
}
}
TIM4->CCR2 = ccr_val;
TIM12->CCR1 = ccr_val;
TIM3->CCR3 = ccr_val