简介:这份资源面向嵌入式开发学习者与电源设计爱好者,提供一套基于STM32的Boost数控电源完整工程,帮助理解升压变换器与数字闭环控制的实际落地方式。压缩包共510个文件,约32.82MB,以h头文件与c源文件为核心,配合d依赖文件、o目标文件、crf交叉引用文件及s汇编文件,另有sln、uvprojx、csproj等工程配置,以及hex、axf固件与pdf、docx说明文档,覆盖从源码到可烧录文件的完整链路。内容围绕STM32外设驱动、PWM调制、ADC采样与恒流恒压切换展开,并包含上位机通信与参数监控相关资料,便于对照硬件电路理解闭环控制算法。目前已有1609人学习下载,适合希望从零搭建数控电源、积累嵌入式电源系统开发经验的读者参考。
1. 数控电源的“数字”到底数在哪:从旋钮到PWM的范式转移
很多人第一次拆开一台标着“数控”的电源,会以为里面藏着一颗DAC芯片,靠模拟电压去调输出。真拆开看,往往找不到DAC,只有一颗STM32、一个电感、一颗MOS管和一堆电阻电容。所谓“数控”,数的不是输出电压本身,而是开关管导通与关断的时间比例。模拟电源靠电位器改变基准电压,数控电源靠定时器改变占空比,两者最终都落到同一个反馈节点上,但调节路径完全不同。这个区别决定了数控电源能做到模拟电源做不到的事:按键设定、软件限流、曲线输出、状态回读。搞懂这条从“旋钮电压”到“PWM占空比”的链路,是理解整个Boost数控电源的起点,也是后面所有采样、闭环、保护逻辑的根。这份资料把这条链路拆得比较细,从定时器配置到ADC采样再到PID整定都有对应实现,适合想从原理层面吃透的人。
2. Boost拓扑的升压本质:为什么电感电流不能断
2.1 从能量搬运看升压,而不是从公式背升压
Boost升压最常见的解释是“电感储能,断开时叠加电源电压”,但这句话只说了现象,没说约束。真正决定Boost能不能工作的,是电感电流的连续性。开关管导通时,电感两端加的是输入电压,电流线性上升,能量存进磁场;开关管关断时,电感为了维持电流不变,感应出反向电动势,把自身电压叠加到输入上,通过二极管给输出电容和负载供电。注意这里的关键词是“维持电流不变”——电感电流不能突变,这是物理定律,不是设计选择。所以Boost的占空比D和升压比的关系是 1/(1-D),D越接近1,理论升压比越大,但实际受限于电感直流电阻、MOS导通电阻、二极管压降和开关损耗。当D超过0.8以后,升压比增长变缓,效率下降,这是Boost的固有特性,不是代码能绕过去的。
常见的实现思路是:先根据输入输出电压算出理论占空比,再留出20%到30%的裕量选电感值和开关频率。比如输入12V、输出24V,理论D约0.5,实际取0.45到0.55之间调节。开关频率选高了电感可以小,但开关损耗大;选低了电感大,动态响应慢。这份资料里用的是几十kHz量级的频率,属于兼顾体积和效率的常见区间。
2.2 连续导通与断续导通:一个容易被忽略的分界线
电感电流在开关周期结束时是否降到零,把Boost分成CCM(连续导通模式)和DCM(断续导通模式)。CCM下,占空比和升压比的关系稳定,闭环控制好做;DCM下,关系变成非线性的,还跟负载有关,PID参数得跟着变。很多初学者调Boost时发现轻载电压飘、重载反而稳,八成是进了DCM。判断方法很简单:算临界电感值。临界电感 L_crit = (D × (1-D)² × R) / (2 × f),其中R是负载等效电阻,f是开关频率。负载越轻,R越大,临界电感越大,越容易进DCM。所以设计时要么把电感取大一点保证额定负载范围内都在CCM,要么在控制策略里针对DCM做补偿。这份资料在参数选择部分给了临界电感的计算过程,也说明了为什么最终选的电感值比理论临界值大——留裕量,避免轻载翻车。
2.3 同步整流与非同步:效率差在哪
非同步Boost用二极管整流,简单、便宜,但二极管正向压降带来固定损耗,输出电流越大损耗越明显。同步整流用MOS管替代二极管,导通电阻可以做到几毫欧,损耗大幅降低,但需要额外的驱动逻辑和死区时间控制,防止上下管直通。对于数控电源来说,同步整流还有个好处:可以用软件控制整流管的开关时机,实现双向电流或者主动放电。不过代价是控制复杂度上升,死区时间设不好会烧管。这份资料里给的是非同步方案,二极管选的是肖特基,压降和反向恢复时间都做了说明。如果要做同步整流版本,驱动电路和死区配置得另加,不能直接套用。
3. STM32的定时器与ADC:数控的“手”和“眼”
3.1 PWM分辨率决定了电压调节的精细度
STM32的定时器产生PWM,占空比由比较寄存器CCR和自动重载寄存器ARR的比值决定。分辨率就是1/(ARR+1)。比如ARR设成999,分辨率是千分之一;设成3599,分辨率是三千六百分之一。分辨率越高,输出电压能调得越细,但同样开关频率下ARR不能无限大,因为PWM频率 = 定时器时钟 / ((ARR+1) × (PSC+1))。想要高分辨率又想要高频率,就得提高定时器时钟,或者用高分辨率定时器。常见的做法是:开关频率定在几十kHz,定时器时钟72MHz或更高,ARR取几千,分辨率做到几千分之一,对应输出电压的调节步进在毫伏级。这份资料里给出了具体的ARR和PSC取值,以及对应的分辨率和频率,可以直接对照着改。
// 以STM32F1为例,定时器时钟72MHz,目标PWM频率50kHz // 预分频PSC=0,则计数时钟72MHz // ARR = 72MHz / 50kHz - 1 = 1439 // 分辨率 = 1/1440 ≈ 0.069% TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 1439; // ARR TIM_TimeBaseStructure.TIM_Prescaler = 0; // PSC TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // 占空比设置:CCR = 期望占空比 × (ARR+1) // 例如50%占空比:CCR = 720 TIM_SetCompare1(TIM1, 720);上面这段代码里,ARR决定了PWM周期,CCR决定了高电平时间。改CCR就是改占空比,也就是改输出电压。注意ARR一旦确定,整个运行期间最好不要频繁改,否则PWM频率会跟着变,影响电感和电容的工作点。要调电压就只改CCR。另外,高级定时器如TIM1需要使能主输出MOE,否则PWM出不来,这是初学者常踩的坑。
3.2 ADC采样时机:为什么不能在开关瞬间采
ADC要采输出电压和电感电流,但采样时刻很讲究。开关管导通和关断的瞬间,电压和电流都有尖峰和振铃,这时候采到的值不能代表真实状态。常见的做法是在PWM周期的特定时刻触发ADC,比如在开关管关断后一段时间,等振铃衰减了再采。STM32的定时器可以产生触发信号给ADC,实现硬件同步采样,不占用CPU。采样时间也要设够,ADC的采样保持电容需要时间充电,源阻抗大的话采样时间要加长。这份资料里用了定时器触发ADC的规则组,在PWM中点采样输出电压,在另一个时刻采样电流,避开了开关噪声。如果采样值跳动大,先查采样时刻对不对,再查硬件滤波和软件滤波。
3.3 采样值与物理量的换算:别让定点数坑了你
ADC返回的是0到4095的整数,要换算成实际电压电流,得乘一个系数。这个系数由分压电阻比、运放增益、ADC参考电压共同决定。比如输出电压经过1/11分压,ADC参考3.3V,那么实际电压 = ADC值 × 3.3 / 4096 × 11。电流采样如果是用采样电阻加运放,系数类似。这里容易翻车的地方是整数除法和溢出。STM32F1没有硬件浮点,用float会慢,用定点数又容易在乘法时溢出。常见的做法是用int32或int64做中间运算,最后再移位。这份资料里给了换算公式和对应的定点实现,注释写得比较清楚,可以直接移植。
4. 闭环控制:PID在Boost上到底怎么调
4.1 电压环与电流环:双环还是单环
Boost数控电源通常有两个环:外环电压、内环电流。电压环的输出作为电流环的给定,电流环再控制PWM占空比。双环的好处是限流天然实现——电流环给定被限制住,输出电流就不会超。单环只控电压,限流得靠额外的比较器或者软件判断,响应慢一拍。这份资料里用的是双环结构,电压环和电流环都是PI,参数分别整定。电压环要慢,电流环要快,一般电流环带宽是电压环的5到10倍。如果两个环带宽太接近,会互相干扰,表现为输出电压振荡或者电流抖动。
4.2 积分饱和:为什么你的电源启动时冲很高
PI控制器有积分项,误差一直存在时积分项会一直累加,直到输出限幅。如果限幅后误差还没消除,积分项会继续累加,这就是积分饱和。等误差反向时,积分项要花很长时间才能退回来,表现为启动过冲大、恢复慢。解决办法是加抗饱和:输出限幅时停止积分,或者把积分项钳位在合理范围。这份资料里在PI实现中加了积分分离和钳位,启动过冲明显小。如果自己写PI发现启动冲高,先查积分饱和。
// 带抗饱和的PI控制器 typedef struct { float Kp; float Ki; float integral; float out_max; float out_min; } PI_Controller; float PI_Update(PI_Controller *pi, float error) { float output; // 比例项 output = pi->Kp * error; // 积分项累加 pi->integral += pi->Ki * error; // 积分限幅,防止饱和 if (pi->integral > pi->out_max) pi->integral = pi->out_max; if (pi->integral < pi->out_min) pi->integral = pi->out_min; output += pi->integral; // 输出限幅 if (output > pi->out_max) output = pi->out_max; if (output < pi->out_min) output = pi->out_min; return output; }这段代码里,积分项在累加后立即限幅,输出也限幅。注意积分限幅的范围和输出限幅一致,这样积分项不会超出执行器的能力范围。Kp和Ki的整定顺序是先调Kp让响应快但不振荡,再加Ki消除静差。如果Kp太大,输出会高频抖动;Ki太大,会低频振荡。这份资料里给了整定步骤和每组参数对应的波形描述,可以对照着调。
4.3 采样噪声与滤波:软件滤波的代价
ADC采样难免有噪声,直接送进PID会导致占空比抖动,进而输出电压纹波变大。常见的软件滤波有均值滤波、中值滤波、一阶低通滤波。均值滤波平滑但滞后,中值滤波抗脉冲但计算量大,一阶低通实现简单但相位滞后。这份资料里用的是一阶低通加滑动均值,兼顾平滑和响应。滤波系数越大越平滑,但动态响应越慢。如果发现负载跳变时电压恢复慢,先看滤波系数是不是太大。另外,滤波放在PID之前还是之后也有讲究:放在之前平滑反馈,放在之后平滑输出,一般放在之前。
5. 避坑与排查:那些让电源炸管或飘压的细节
5.1 现象:上电瞬间MOS管炸了
原因:Boost的输入到输出有一条直通路径——电感加二极管。上电瞬间,输入电压通过电感和二极管直接给输出电容充电,电流不受控,如果输出电容很大,冲击电流可能超过二极管和电感的额定值。另外,如果PWM初始化时占空比默认给大了,MOS管一上电就长时间导通,电感饱和,电流飙升。解决:在输入串NTC或者继电器加限流电阻,等输出电容充到一定电压再短路限流;软件上确保PWM初始占空比为0,启动后再慢慢加。
5.2 现象:输出电压带载后掉得厉害
原因:可能是电感直流电阻太大,或者MOS导通电阻大,或者二极管压降大,导致占空比调到最大也升不上去。也可能是电流采样系数算错,电流环提前限流了。解决:先测电感直流电阻和MOS导通电阻,算一下额定电流下的压降;再检查电流采样换算公式,用万用表实测电流和ADC读数对比,看系数对不对。
5.3 现象:轻载时电压飘,重载正常
原因:轻载时电感电流进入DCM,占空比和输出电压的关系变了,原来的PI参数在DCM下不合适。解决:要么加大电感保证轻载也在CCM,要么在轻载时切换PI参数,或者加假负载。这份资料里提到了DCM的判断和参数切换思路,但没有展开,需要自己补。
5.4 现象:ADC读数跳动大,PID输出抖
原因:采样时刻在开关瞬间,或者采样时间不够,或者模拟地和功率地没分开。解决:用定时器触发ADC,采样时刻避开开关沿;加长采样时间;检查PCB布局,模拟地和功率地单点连接。软件上可以加滤波,但滤波只是掩盖问题,根源在硬件和采样时机。
5.5 现象:按键设定电压后,输出要很久才稳定
原因:PI的积分项太小,或者输出限幅太窄,或者滤波系数太大。解决:先看PI输出有没有被限幅,再看积分系数是不是太小,最后看滤波。如果都正常,可能是负载电容太大,充电时间长,这属于正常现象,可以加软启动。
6. 从能跑到好用:数控电源的设计取舍与验证习惯
Boost数控电源从能跑到好用,中间隔着一堆取舍。开关频率选高了,电感小、动态快,但开关损耗大、EMI难搞;选低了,效率高、EMI好,但电感大、响应慢。ADC分辨率选高了,调节细,但采样慢、成本高;选低了,调节粗,但快。PID参数调激进了,响应快但容易振荡;调保守了,稳但慢。这些取舍没有标准答案,取决于你的负载特性、体积要求和成本预算。这份资料的价值在于它把每个取舍点都摆出来了,给了具体参数和对应的现象描述,你可以照着改,也可以反推为什么这么选。
验证一个数控电源是否真的稳,我一般会做三件事:第一,用电子负载做阶跃跳变,看电压恢复时间和过冲;第二,用示波器看开关节点波形,确认没有异常振铃和占空比抖动;第三,长时间满载老化,看温升和参数漂移。这三件事做完,基本能判断控制环路和硬件有没有硬伤。从那以后我每次调电源都强制走一遍这三步,省得后面返工。希望帮到你。
本文还有配套的精品资源,点击获取