目标:使用STM32CubeIDE编程,控制STM32F103输出200KHz的PWM波形,且占空比可通过串口动态调节。
basic PWM
之前的博客已经解决了串口中断接收的bug,本篇文章主要设置占空比,调节buck-boost电路输出电压。我选择使用STM32F103 TIM1(APB2)定时器 channel1,TIM3(APB1)定时器 channel1,channel2产生PWM波形。首先,配置相关时钟,使用STM32CubeIDE可以直观的看到时钟的配置,具体内容如下图。
接着,设置周期和占空比,通过设置Prescaler,Count_Period参数,设置周期,具体关系如下:T=1/( 时钟频率/(Prescaler+1)/(Count_Period +1)),以64M总线时钟,0分频,319计数周期为例,T=1/(64M/1/320)=1/200KHz=5us。时钟周期为5us,脉冲频率为200KHz,
上面的做法,可以生成指定频率的波形,再通过__HAL_TIM_SET_COMPARE函数,即可设置指定占空比的波形。具体的代码示例如下。
TIM_HandleTypeDef htim3;
MX_TIM3_Init();
HAL_TIM_PWM_Init(&htim3);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
//50%,320 set duty, period is 320, duty = x/period
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,x);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,x);
这里需要分别设置timer3定时器的通道1,通道2的占空比,并将通道极性分别设置为不同数值,才能做到PWM1,PWM2互补输出(占空比互补,且两个PWM波同一时刻电平不同,即不同时为高电平或低电平)。
Buck-Boost
干货| BUCK-BOOST 电源原理及工作过程解析 - 知乎 (zhihu.com)
HAL库 PWM功能实现并不困难,难点在于如何配合电源转换芯片和Buck-boost电路,实现升降压控制。Q1Q2占空比互补,Q3导通,buck模式,降压电路,Vout=Vin*d1(Q1接入的PWM占空比);Q1导通,Q3,Q4占空比互补,boost模式,升压模式,Vout=Vin/d2。升压模式时,要注意,如果搞混了Q3,Q4的线序,建议从50%占空比,向两极扩展,这样可以找到正确的连线。
Warning
用基础PWM来控制Buck-Boost电路,会导致MOS管烧毁。这是因为PWM波形翻转需要时间,以Buck模式为例,在电平翻转过程中,上下2个NMOS管(Q1,Q2)可能会同时导通,致使Vin直接与地短接,瞬时大电流会烧毁NMOS管。升压电路没有试过,使用基础PWM没有过多测试,不确定会出现什么现象。