HAL STM32F103C8T6输出相位可调占空比可调的四路互补PWM波
需求分析
最近接到了一个项目,顾客需要输出如下图所示的四路互补PWM波,频率为100khz,但又不能完全互补,第一路PWM和第二路PWM要留一定的死死区,不让PWM1和PWM2同时导通。
顾客的PWM输出需求如下:
原理分析
本项目可以用ITR0-ITR3实现定时器TIM1-TIM4的链式触发,我们可以根据下图来配置触发源。
具体思路思路如下:
1.配置定时器TIM1的通道1为触发源,用于触发定时器TIM2,TIM1的通道2输出PWM1 。
2.配置定时器TIM2的通道1为触发源,用于触发定时器TIM3,TIM2的通道2输出PWM2。
3.配置定时器TIM3的通道1为触发源,用于触发定时器TIM4,TIM3的通道2输出PWM3。
4.配置定时器TIM4的通道3输出PWM4。
通过上面的四步可以实现输出相位可调占空比可调的四路互补PWM波。
硬件选择
本项目采用价格便宜的STM32F103C8T6作为互补PWM波发生器,STM32F103C8T6如下图所示:
STM32cubeMX配置
设置RCC
设置SYS
clock配置
TIM1配置
clock source选internal clock
channel1选PWM generation no output
channel2选PWM generation CH2
由于客户要求PWM频率为100Khz,因此
prescaler设置为1-1
counter period设置为720-1
Master/Slave Mode选Enable
Trigger Event Selection选Compare Pulse (OC1)
TIM1其余部分保持默认即可
TIM2配置
slave mode选reset mode
trigger source选ITR0
clock source选internal clock
channel1选PWM generation no output
channel2选PWM generation CH2
prescaler设置为1-1
counter period设置为720-1
Master/Slave Mode选Enable
Trigger Event Selection选Compare Pulse (OC1)
TIM2其余部分保持默认即可
TIM3配置
slave mode选reset mode
trigger source选ITR1
clock source选internal clock
channel1选PWM generation no output
channel2选PWM generation CH2
prescaler设置为1-1
counter period设置为720-1
Master/Slave Mode选Enable
Trigger Event Selection选Compare Pulse (OC1)
TIM3其余部分保持默认即可
TIM4配置
slave mode选reset mode
trigger source选ITR2
clock source选internal clock
channel3选PWM generation CH3
prescaler设置为1-1
counter period设置为720-1
其余配置保持默认
MDK程序生成
点击位置1想生成的目标程序平台
点击位置2生成目标程序
keil程序编写
主要在这两处添加程序
位置1
/* USER CODE BEGIN 2 */
offset1=720.0/100.0*PWM;
if(PWM<50)
{
offset2=720.0/100.0*(50-PWM);
}
else
{
offset2=720.0/100.0*(150-PWM);
}
offset3=720.0/100.0*PWM;
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,offset1);
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,offset2);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,offset3);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);
/* USER CODE END 2 */
位置2
//__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,360);
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,PWM/100.0*(720-1));
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,(100-PWM)/100.0*(720-1));
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,PWM/100.0*(720-1));
__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_3,(100-PWM)/100.0*(720-1));
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
结果
这里用keil5的仿真和用示波器实际测试输出波形
仿真结果
从仿真结果看,输出的四路PWM波满足了项目的设计需求
示波器实际测试输出波形
从实际的示波器输出波形看,也满足了项目的设计需求。
写在最后
博主长期接STM32等项目,有需求的读者可以找我。
若读者想要完整的STM32cubeMX配置或者MDK工程的话,请评论留言获取
或者添加v信:whhuashou
或者扫描闲鱼联系