好久没写文章,之前发过一篇《Design a synchronous buck converter with Raspberry Pi Pico》,但是证明Pico是做不到同步整流buck变换器的。原因是:我在逻辑仪查看Pico输出的PWM的时候,发现它在PWM启动前或者改变PWM频率之时,双通道会有100ns-200ns的时间可能输出高电平。况且,在网上找Pico PWM的library库,发现其他作者也只是封装Pico的官方SDK库,没有直接进行寄存器操作,因此造成了:
- 双通道同时输出高电平给同步整流buck可能会导致上下MOS管都导通,那不就是直接短路炸机了。尽管只是持续100ns-200ns时间,但是作为入门工程师,应该秉持爱护自己生命的原则,应该使用其他更专业提供更精准定时器的MCU,保证输出的双PWM信号总是互补和有死区时间。如果硬是要使用Pico作为驱动逻辑,那在MOSFET的驱动IC选型也需要选用不会同时输入PWM高电平,输出上、下MOS管也不会同时导通,具有相互闭锁功能的。但这大大增加了既要又要的选型困难。哪有驱动IC可以提供那么多安全又可靠又好用又驱动电流强又便宜的(三色图答案:滚)。
- 好像没见到寄存器输出互补PWM的,似乎都是用官方SDK的API,重新打包来实现软互补PWM。那程序的运行速度太慢了,如果做voltage-mode control电压环控制,还要逐周期中断,那大概来不及。
- 我在网上没见到用Pico写PWM寄存器操作的手把手教程,躺平了。
综上,我这过去三个月转行学习STM32(学了一些皮毛),再加上网上B站的佬友相助,终于做出了基于STM32的同步整流buck变换器,其中,实现了以下控制方法:
- 电压环 (Voltage-mode control aka. VMC),基础的电压环控制,输出恒压。
- 电流环(Current-mode control aka. CMC),电流环控制,输出恒流。
- 平均电流环(或者双闭环(我的理解),Average Current Mode Control aka. ACMC),内环是电流环,外环是电压环,输出恒压。
以上的电压环和电流环都要感谢B站林佬友的相助,让我终于知道如何入门数字电源控制和设计补偿器,实现了人生第一块降压buck变换器(其实还是信息差,互联网基本没有像这位B站佬友无私分享了全套设计流程,我实属感动涕零)。ACMC则是彻夜在网上找论文,大概了解了设计流程,而后不知疲惫询问AI,最终茫茫大海获得一丝头绪,直到今日的曙光(哭)。
基于于此,我觉得应该将自己学到的,记录在此,不止重新加深我对设计变换器的印象,也可以让我在编写教程时反思过程是否还有遗错细节,也可以为在互联网茫茫大海苦搜寻到这篇文章的道友,或许也和那时候的我迷茫失措,但愿这篇文章的记载到时候可以帮到你们(教程不会很专业,如有错漏之处,也请谅解)。
A. 设计流程
开门见山,设计一个数字控制的buck变换器的基础步骤要知道先,才不会迷茫:
- 通过小信号模型分析 (small-signal modeling),获得buck变换器的传递函数,例如Gvd(s) = vo(s)/d(s), Gid(s) = iL(s)/d(s), 和Gvi(s) = vo(s)/iL(s)。网上教导小信号模型都很复杂很高大上,什么DC变压器建模,其实在我这里是省略的(我觉得没有必要了),我们的目标是通过小信号找到buck系统传递函数,基于它们设计补偿器,设计补偿器才是重中之重。我学习的做法是,我先看懂了小信号建模的数学原理,其实就是一个类似低通滤波器的东西,把开关频率或者倍数于开关频率的信号都衰减掉,只留下了直流和很低频幅度很小的交流信号。而后,将这滤波后的信号中的直流项去除,只保留小信号(就是那个幅度很低频率很慢的交流信号),再将公式转换到频域(frequency domain, Laplace Transform),再公式对调一下,就可以获得传递函数了(你看,这里省去了什么DC变压器建模,只需要用手上公式就能获得传递函数,而不是手上的公式–>建模–>才能获取传递函数,这没必要)。至于为什么要用小信号,科学家们说是对的,那我们是工程师,就不深究其中的深层问题了(例如他们所说的工作平衡点)。不过如果可以做到像笔者一样也成功手搓一次buck小信号传递函数,而不是网上直接抄个传递函数来用,也已经打赢了很多工程师了。我感觉能手搓公式对以后再造boost变换器或者buck-boost变换器都会更有信心和动力。手搓小信号的方法,我迟点会上传笔记到这儿给大家参考下。如果你说:哎,我信不过网上的小信号传递函数,怕不对,又实在手搓失败,那你可以用PLECS仿真你的buck电路来获取bode响应图,然后用MATLAB帮你辨识和计算出传递函数出来,林佬的教学便是基于此方法获取传递函数,大家想直接造数字buck,加速project可以看他的教学,我已经看过,PLECS提供的传递函数和我手搓的传递函数和网上论文提供的传递函数在相同电路参数下几乎一样。总的来说,获取buck的传递函数是第一步,它们基于小信号建模而得来,获取的方式有如下:手搓,上网抄,或PLECS+MATLAB辨识出来。
- 设计补偿器:设计补偿器的意思就是强化buck的负反馈自控系统(负反馈系统本身就会尝试输出和期望值一样的结果,减小误差,但是自身可能有稳定性不足等缺陷),改进buck自身系统的性能和稳定性。在这里,你可以看到,小信号推导到的传递函数就是用数学来描述这个控制系统。这里需要一些自动控制原理的知识,例如我半年前看过这个教授的网课,可以参考一二。自动控制原理很复杂,我学了后也没有感觉会太多,吸收有限(确实难啊),但是要起码知道频域稳定性怎么看(极点的位置),相位裕量,带宽,damping factor阻尼等常用的东西,他们都是设计补偿器的时候会考虑的因素。懂了后就直接在bode图上设计补偿器,常用伎俩有:低频的增益通常是-20dB/decade穿越cutoff frequency截止频率,而后高频段要-40dB/decade衰减,相位裕度>60°(数字控制要大一些)。设计补偿器的方法可以参考林佬的MATLAB设计补偿器教学,常用的补偿器(aka pole-zero placement)可以是2个零点+3个极点(1个极点在原点,即是积分器)。
- 设计好补偿器后,获得补偿器的传递函数Gcom(s),转成z-domain,使用MATLAB的Tustin转换方法即可,获得Gcom(z)的差分方程,现在这个方程可以直接写进STM32单片机里计算,自此buck变换器便懂得自我良好稳定地控制了。
B. Methodology 设计步骤
Part 1: 手搓小信号
手搓buck小信号模型与寻得传递函数之手稿:






PDF整理版本(来源于本人某份报告),验证了手搓的传递函数是有效滴:
(to be continued)
