基本原理
PWM是如何实现?
分类
程序实现
总结
25%
,
50%
和
75%
占空比状态,不难发现,假设占空比为
D
,则满足:
其中 是PWM的周期,通常和载波的周期相同;
ON
或者是
OFF
,因为一般都是作用到开关元器件上;如下图所示;
PWM
波形了;
matlab
的
simulink
中搭建了一下仿真,具体如下图所示;
10
,然后我希望输出平均为
5
的波形(图1中红色的水平直线);
5
时;PWM输出低电平,即为
OFF
;
5
时,PWM输出高电平,即为
ON
;
0%
增大到
100%
;
sin wave
,那也就是我们常说的
SPWM
,其实是可以的,具体如下图所示;
MCU
大部分都自带硬件
PWM
发生器,即配置好相应的寄存器,就能直接产生
PWM
,下面的例子基于
NUCLEO-F767ZI
,通过
cubemx
配置了三路
PWM
输出,然后实现了呼吸灯的效果;
int main(void)
{
HAL_Init();
MX_GPIO_Init();
MX_TIM4_Init();
MX_TIM3_Init();
MX_TIM12_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, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim12, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim3, TIM_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;
}
}
}
PWM
输出的占空比也是随时间变化;
往期好文合集