☰
STM32 Boost数控电源:PWM/ADC时序与PI环路整定实战
2026/10/26 13:28:11 网站建设 项目流程

简介:这是一份围绕STM32实现Boost数控电源的完整项目资料,适合嵌入式电源方向的学生、电子竞赛选手及课程设计开发者,用于理解升压变换、恒流恒压闭环控制与上位机联调等关键问题。压缩包共510个文件,约32.82MB,包含大量.h/.c源码、Keil工程文件(uvprojx、uvoptx)、hex/axf可执行文件,以及pdf/docx/txt说明、芯片包和上位机相关资源,便于从底层驱动到整机方案对照学习。已有1610人学习下载,说明该案例在电源类实践中具有一定参考价值。资料重点覆盖STM32外设配置、PWM占空比调节、ADC采样反馈、恒流/恒压模式切换及串口通信等内容,读者可据此梳理Boost电源的软硬件结构,复现实验电路,排查控制环路与参数整定中的常见问题,并在此基础上扩展电压范围、电流限制和监控界面。

1. 拆前先问一句:这块 STM32 Boost 数控电源,到底卡在硬件还是固件

有人拿着一套 STM32 Boost 数控电源资料来问,能不能直接改成 5V 进、24V 出、2A 带载。我没急着看代码,先问电感选多大,他答不上来。这类项目的分水岭就在这儿:决定一块升压电源稳不稳的,从来不是 MCU 跑多少兆,而是电感电流有没有算过、ADC 采样落在哪个时刻、环路带宽压没压在右半平面零点以下。这份资料的价值,是它把 STM32 的 PWM、ADC、PI 调节和 Boost 主功率级串成了一条能跑通的完整链路,固件工程和硬件是一一对应的对照物,而不是几张截图加一段公式。资料丰富的好处在这儿体现得最明显——参数改错了,你能回头找到对应的计算依据。

适合两类人:正在做课程设计、想把 Buck 经验迁移到升压拓扑的嵌入式工程师;手里已经有板子、但一直被啸叫、炸管、轻载飘压折腾的人。下面按我实际拆包和复现的顺序讲,先算账,再看时序,最后说保护和验证。

2. 升压级的账要先算平:占空比、电感电流与右半平面零点

2.1 升压拓扑的三个硬边界,绕不过去

第一个边界是占空比。理想情况下 $D = 1 - V_{in}/V_{out}$,5V 升 24V 算出来是 0.792。但真实电路里串着 MOS 的导通电阻、电感的直流电阻和肖特基的正向压降,要把这些补回去,实际占空比会爬到 0.80 到 0.83 之间。这个数字很关键,它决定了后面所有的电流应力和零点位置——很多改造失败,就是把理想值当成了实际值,电感按理想电流选,一上载就饱和。

第二个边界是电感平均电流。升压变换器输入端和电感是串联的,输出电流只在 $(1-D)$ 那段时间里由电感供给,所以 $I_L = I_{out}/(1-D)$。输出要 1A,电感平均电流就是 4.8A,算上 88% 的效率实际是 5.5A 左右。第一次做 Boost 的人最容易在这儿翻车:以为输出 1A 是小电流,结果电感、采样电阻、MOS 全按 1A 选,一加载直接保护。

第三个边界是右半平面零点。升压拓扑的传递函数里天然存在一个右半平面零点,频率是

$$f_{RHPZ} = \frac{(1-D)^2 R}{2\pi L}$$

它的恶劣之处在于增益随频率上升而相位往下掉。环路带宽必须压在 $f_{RHPZ}$ 的五分之一以下,否则你无论怎么调 PI,相位裕度都不够,表现为输出带载时持续低频振荡、电感啸叫。这条是血泪经验:我见过有人把 PI 的 Kp 从 0.1 一路调到 5,振荡一点没改善,因为问题根本不在增益,而在带宽越界。

2.2 从指标反推主功率参数:一份可以直接改数字的脚本

与其拿计算器按半小时,不如把推导写成脚本。下面这段是我改这一版资料时先跑的,输入只有四个:输入电压、输出电压、输出电流、开关频率,出来的是占空比、电感量、饱和电流、输出电容和那个要命的零点频率。

# boost_design.py —— 从输入指标反推主功率级参数 Vin, Vout, Iout = 5.0, 24.0, 1.0 fsw = 200e3 # 开关频率 200 kHz eta = 0.88 # 整机效率,按经验先估,实测再回代 Vf = 0.45 # 肖特基正向压降 ripple = 0.35 # 电感纹波系数,一般取 0.3~0.4 Vripple = 0.05 # 目标输出纹波 50 mV D_ideal = 1 - Vin / Vout D_real = (Vout + Vf - Vin) / (Vout + Vf) # 补上二极管压降 Iin = Vout * Iout / (Vin * eta) # 输入平均电流 IL = Iin # 电感平均电流 = 输入电流 dIL = ripple * IL L = Vin * D_real / (dIL * fsw) # 电感量 Ipk = IL + dIL / 2 Isat = 1.3 * Ipk # 饱和电流留 30% 裕量 Cout = Iout * D_real / (fsw * Vripple) # 仅按容性纹波估 R_load = Vout / Iout f_rhpz = (1 - D_real) ** 2 * R_load / (2 * 3.1416 * L) print(f"D_real = {D_real:.3f} IL = {IL:.2f} A") print(f"L = {L*1e6:.1f} uH Ipk = {Ipk:.2f} A Isat >= {Isat:.2f} A") print(f"Cout = {Cout*1e6:.0f} uF f_RHPZ = {f_rhpz/1e3:.1f} kHz")

跑出来的一组数是:占空比 0.796,电感平均电流 5.45A,理论电感量 10.4µH,峰值电流 6.41A,饱和电流要求不低于 8.3A,输出电容 80µF,右半平面零点在 16kHz。

参数说明和取舍:电感取标称 10µH 就够,但饱和电流这一栏千万别照 6.4A 买,磁芯在直流偏置下电感量会掉,实际选 10A 以上的屏蔽电感更保险。输出电容算出 80µF 是纯容性纹波,实际还要叠电解的 ESR 贡献,常见做法是 100µF 固态电容并一颗 10µF 陶瓷,陶瓷负责高频尖峰,固态负责储能。零点频率 16kHz 意味着闭环带宽不能超过 3.2kHz,这个数字就是后面调 PI 的天花板。

提示:脚本里的eta和Vf是第一版估计值,板子跑起来之后要把实测效率回代重算一次。效率从 0.88 掉到 0.80,电感电流会涨 10%,采样电阻的功耗和限流点都要跟着改。

2.3 采样链路选型:低边电阻、DCR 还是霍尔

电流采样决定了限流准不准、恒流模式能不能用。三种方案在这类小功率 Boost 上的差异很明显。

低边采样电阻是资料里默认的做法:把 10mΩ 电阻串在开关管源极到地之间,运放做 50 倍以上的差分放大。优点是共模电压接近零,运放好选、精度高、成本低。缺点是它只测得到开关管导通那段时间的电流,所以 ADC 采样必须跟 PWM 同步,而且轻载进入跳周期模式后会拿不到有效值。电阻功耗按 $I_{rms}^2 R$ 算,5.5A 有效值配 10mΩ 是 0.3W,必须用 2512 或者 1W 的合金电阻,普通 0805 上去就发黑。布线要走开尔文接法,两根采样线从电阻焊盘内侧引出,不能从走线中途分叉,这个细节直接决定限流点的一致性。

电感 DCR 采样是无损方案,在电感两端并 RC 网络,让 $R \cdot C$ 等于 $L/DCR$ 的时间常数,从电容上取压降。好处是不引入额外损耗,坏处是 DCR 本身随温度漂 30% 以上,精度只能做到 ±20%,我一般只拿它做辅助判断,不用来做恒流。

霍尔或者集成电流传感器适合更大功率的场合,隔离、带宽宽、精度稳,代价是成本和体积。5V 进 24V 出 1A 这个量级用它有点浪费,除非要做多路并联均流。

选完采样还要算 ADC 分辨率。24V 输出经 1/10 分压到 2.4V,12 位 ADC 在 3.3V 基准下每个 LSB 是 0.806mV,折算到输出端是 8mV。听起来够用,但分压电阻的热噪声和 ADC 的抖动会把这个精度吃掉一半,实测有效位数大概 9 到 10 位。要做 10mV 级的稳压精度,得靠软件做平均或者用外部基准。

3. STM32 侧的时序对齐:200 kHz PWM 与 ADC 触发怎么咬合

3.1 定时器配置:中心对齐 PWM 的计数边界

单管异步 Boost 只需要一路 PWM,同步整流版本才需要互补的两路加死区。资料里的主功率级是单管结构,所以定时器配置的重点不在死区,而在计数模式和更新事件的频率。

用高级定时器出 200kHz、中心对齐的 PWM,计数时钟 170MHz 时周期寄存器算下来是 425。中心对齐的好处是开关管在计数器峰值和谷底各动作一次,电流纹波呈三角形,谐波分布比边沿对齐柔和,采样点也正好落在纹波的中点或谷底,取到的是平均值附近而不是尖峰。

/* TIM1 中心对齐 PWM:fsw = 200 kHz,计数时钟 170 MHz */ /* ARR = 170e6 / (2 * 200e3) = 425 */ TIM_HandleTypeDef htim1; TIM_OC_InitTypeDef sConfigOC = {0}; htim1.Instance = TIM1; htim1.Init.Prescaler = 0; /* 不分频 */ htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1; htim1.Init.Period = 425 - 1; htim1.Init.RepetitionCounter = 1; /* 关键:中心对齐下一次溢出不够,用 RCR 压成一个开关周期一次 */ htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; HAL_TIM_PWM_Init(&htim1); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; /* 上电先给 0,等软启动接管 */ sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

RepetitionCounter = 1是这里最容易漏的一行。中心对齐模式下计数器从 0 数到 ARR 再数回 0,更新事件在一个开关周期里会来两次,如果拿它当 ADC 触发源,采样率就变成了 400kHz,而且是交错采两遍同一个量。把重复计数器设成 1,更新事件被压成每周期一次,触发节奏才对得上。

占空比的分辨率也要心里有数:ARR 是 425,一个计数对应 0.235% 的占空比。在 24V 输出、占空比 0.8 附近,一个 LSB 引起输出电压跳变约 70mV。想要更细的调压步进,就得提高计数时钟或者换带高分辨率定时器的型号,普通定时器在这个频率下就是这个精度。

3.2 ADC 与 PWM 同步:采样窗口落在哪个时刻

采样时刻选错,是这类项目里最隐蔽的一类故障。低边采样电阻上的电流只在开关管导通期间存在,如果 ADC 在关断期间采样,读到的是零,PI 会把占空比一路推到最大,然后过流保护。表现出来就是"一上电就打嗝",很多人以为是保护阈值设低了,其实是时序错了。

正确做法是用定时器的 TRGO 去触发 ADC 注入组,触发点选在计数器峰值(中心对齐时对应导通中点),这样采到的就是电感电流的平均值附近。注入组的好处是它插在规则组前面执行,不受主循环里其他采样任务的影响,时序确定。

/* ADC1 注入组:TIM1_TRGO 上升沿触发,先采输出电压再采电感电流 */ ADC_ChannelConfTypeDef sConfig = {0}; hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc1.Init.Resolution = ADC_RESOLUTION_12B; hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.ScanConvMode = ENABLE; hadc1.Init.ExternalTrigInjecConv = ADC_EXTERNALTRIGINJEC_T1_TRGO; hadc1.Init.ExternalTrigInjecConvEdge = ADC_EXTERNALTRIGINJECCONV_EDGE_RISING; hadc1.Init.InjectedNbrOfConversion = 2; HAL_ADC_Init(&hadc1); sConfig.Channel = ADC_CHANNEL_1; /* 输出分压 */ sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES; /* 运放建立时间要留够 */ HAL_ADC_ConfigChannel(&hadc1, &sConfig); sConfig.Channel = ADC_CHANNEL_2; /* 低边电阻放大后 */ sConfig.Rank = 2; HAL_ADC_ConfigChannel(&hadc1, &sConfig);

采样时间从 2.5 周期改成 28 周期不是随手写的。分压电阻 10k 并联 100nF 之后,源阻抗在百欧量级,2.5 周期的采样电容建立误差能到几个 LSB;低边采样经过运放输出串了 100Ω 隔离电阻,同样需要更长的建立时间。28 周期在 42.5MHz 的 ADC 时钟下是 0.66µs,相对 5µs 的开关周期占 13%,还在可接受范围。如果采样窗口再长,就会跨过开关沿,反而把开关噪声采进来。

转换结果要在注入转换完成回调里取,别在主循环里轮询标志位,那样会错过本周期,PI 用的就是上一周期的旧数据。

3.3 数字 PI 的落地写法:增量式、钳位与输出限幅

升压拓扑的 PI 我倾向用增量式,理由很实际:增量式的积分作用体现在输出量自身,对输出占空比钳位就等于钳住了积分器,不会出现位置式那种积分项单独跑到天上去、退饱和要等好几秒的情况。

typedef struct { float kp, ki; float err_prev; /* 上一拍误差 */ float out; /* 当前占空比 0.0 ~ out_max */ float out_max, out_min; } PI_t; /* 增量式 PI:输出直接是占空比,钳位即抗饱和 */ float PI_Update(PI_t *p, float ref, float fb) { float err = ref - fb; float du = p->kp * (err - p->err_prev) + p->ki * err; p->err_prev = err; /* 饱和时也要更新,否则退饱和会滞后 */ p->out += du; if (p->out > p->out_max) p->out = p->out_max; if (p->out < p->out_min) p->out = p->out_min; return p->out; }

三个参数怎么取:out_max必须限制在 0.85 左右,不能给到 0.95。占空比逼近 1 的时候升压能力趋近于零,右半平面零点也压到几千赫兹,环路必然失稳,这个上限是硬约束而不是调参余量。out_min给 0 就行,但要配合假负载,否则空载时占空比掉到零、输出直接跟随输入,看起来像"升不上去"。

kp和ki的整定顺序是先比例后积分。把ki归零,kp从 0.02 开始加,加到输出对给定阶跃有响应但明显过冲,再退回一半;然后加ki,从kp/200开始,观察稳态误差收敛速度,加到出现低频摆动就退回去。整个过程在 1kHz 的环路频率下做,改一次参数看一次阶跃,十分钟能收敛。

注意:PI 的调用频率必须等于开关频率,放在 PWM 周期中断里跑。放在主循环里跑会引入不确定的延迟,采样到输出的相位滞后一大,调出来的参数换块板子就失效。

4. 保护链与软启动:把炸管概率压到最低的三道闸

4.1 逐周期限流:比较器加刹车输入,比软件快一个数量级

软件限流的问题是慢。ADC 采样、转换完成、进中断、判断、改占空比,这一圈下来最快也要两三个开关周期。短路发生时,电感电流在几十微秒内就能冲到十几安培,等到软件反应过来,MOS 已经在雪崩区了。

可靠做法是把模拟比较器的输出直接接到定时器的刹车输入脚。比较器比较低边采样电阻上的电压和 DAC 设定的阈值,一旦超过就拉高,定时器硬件立即把输出拉到定义的 idle 电平,整个过程不经过 CPU,延迟只有几十纳秒加滤波时间。

/* TIM1 刹车输入:比较器输出直接封波,故障后必须软件手动恢复 */ TIM_BreakDeadTimeConfigTypeDef sBreak = {0}; sBreak.OffStateRunMode = TIM_OSSR_ENABLE; /* 运行时关闭态由 OSSR 决定 */ sBreak.OffStateIDLEMode = TIM_OSSI_ENABLE; /* 空闲时也保持关断 */ sBreak.DeadTime = 0; /* 单管拓扑不需要死区 */ sBreak.BreakState = TIM_BREAK_ENABLE; sBreak.BreakPolarity = TIM_BREAKPOLARITY_HIGH; sBreak.BreakFilter = 0x3; /* 几个时钟的滤波,压住开关噪声毛刺 */ sBreak.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; /* 关键:不许自动恢复 */ HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreak); /* 故障计数与恢复放在 1 ms 任务里做,不在刹车中断里做 */ void PSU_FaultTask(void) { if (__HAL_TIM_GET_FLAG(&htim1, TIM_FLAG_BREAK) != RESET) { __HAL_TIM_CLEAR_FLAG(&htim1, TIM_FLAG_BREAK); fault_cnt++; __HAL_TIM_MOE_DISABLE(&htim1); /* 保持封波,等状态机决定 */ } }

几个参数值得说。BreakFilter不能给 0,开关瞬间的共模干扰会让比较器误触发,表现为"带载加到一半随机掉电",看着像玄学。但也不能给太大,滤波时钟越多响应越慢,我一般在 200kHz 开关频率下给 3 到 7 之间。AutomaticOutput必须关掉,如果开了自动输出,刹车信号一消失 PWM 就自己恢复,短路还没排除就又打一次,电感直接饱和。故障恢复一定要走状态机的冷却流程,让人为和逻辑都有判断时间。

比较器的 DAC 阈值怎么定:按Isat / 1.2反推采样电阻上的电压再乘运放增益。以 10mΩ、50 倍增益、8A 限流点为例,阈值为 8 × 0.01 × 50 = 4.0V。留 20% 裕量是因为比较器有失调,而且运放输出在大电流下会压缩。

4.2 软启动斜坡:把 24V 拆成 20 毫秒

硬启动的危害有两层。电气上,输出电容瞬间被当成短路,电感电流冲到限流点,输入电源被拉塌,严重时 MCU 自己复位。控制上,PI 的误差项一开始就是满量程,积分立刻饱和,等输出冲过头再退饱和,过冲能到额定值的 40% 以上。

软启动的做法是给 PI 一个斜坡上升的参考值,而不是直接给目标值。斜坡起点取输入电压附近(升压拓扑输出不可能低于输入),斜率按输出电容算:I_charge / C决定上升速度,1A 恒流给 100µF 充电是 240V/s,也就是 20ms 从 5V 爬到 24V 左右。斜坡太陡起不到作用,太缓又会让上电时间不可接受。

#define V_RAMP_START 5.0f /* 从输入电压附近起步 */ #define RAMP_STEP 0.095f /* 每 100us 涨 0.095V,约 20 ms 到 24V */ static float v_ramp = V_RAMP_START; void PSU_SoftStart(void) /* 100 us 周期中断里调用 */ { if (v_ramp < v_set) { v_ramp += RAMP_STEP; if (v_ramp > v_set) v_ramp = v_set; } duty = PI_Update(&pi, v_ramp, v_out); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, (uint32_t)(duty * 425)); }

这里有个细节容易忽略:斜坡期间 PI 的err_prev也要正常更新,不能因为还在软启动就跳过。跳过的话,斜坡结束切入闭环的那一拍会算出一个巨大的增量,前功尽弃。另外恒流模式下的软启动要把参考值换成电流,斜坡改成从 0 开始的电流斜坡,逻辑结构一样。

4.3 状态机与故障记录:让板子自己说清怎么挂的

保护逻辑堆到四五个之后,用 if-else 写必然乱。状态机是唯一能长期维护的写法,而且它天然带冷却和重试次数限制。

typedef enum { ST_IDLE, ST_SOFTSTART, ST_RUN, ST_FAULT, ST_COOLDOWN } psu_state_t; static psu_state_t st = ST_IDLE; static uint8_t fault_cnt = 0; static uint32_t t_fault = 0; void PSU_Task(void) /* 100 us 周期 */ { switch (st) { case ST_IDLE: duty = 0.0f; if (cmd_enable) { v_ramp = Vin_measured; st = ST_SOFTSTART; } break; case ST_SOFTSTART: v_ramp += RAMP_STEP; if (v_ramp >= v_set) { v_ramp = v_set; st = ST_RUN; } duty = PI_Update(&pi, v_ramp, v_out); break; case ST_RUN: duty = PI_Update(&pi, v_set, v_out); if (oc_flag || ov_flag || ot_flag) st = ST_FAULT; break; case ST_FAULT: duty = 0.0f; __HAL_TIM_MOE_DISABLE(&htim1); fault_cnt++; t_fault = tick_ms; st = ST_COOLDOWN; break; case ST_COOLDOWN: if (fault_cnt >= 5) { /* 锁死,等人工复位 */ } else if (tick_ms - t_fault > 500) { st = ST_IDLE; } break; } __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, (uint32_t)(duty * 425)); }

500ms 的冷却时间不是拍脑袋:它要足以让输出电容和假负载把电压放到安全水平,也要让电感温度回落一点。5 次重试上限是为了区分"偶发干扰"和"真故障"——如果连续五次都在软启动阶段挂掉,肯定是硬件问题,继续重试只会扩大损坏范围。

故障类型建议存进一个字节的位域里,掉电前写进备份寄存器或者外挂的 EEPROM。调试阶段最常见的场景是板子跑两天挂一次,现场没记录,只能靠猜;有了故障码,一看是过温还是过流,排查方向立刻收窄。

5. 避坑实录:调 Boost 数控电源最容易翻车的五个地方

5.1 空载时输出电压一路飘到 30V 以上

现象:输出端不接负载,设定 24V,实测慢慢爬到 30V 甚至更高,接上负载立刻回到 24V。

原因:升压拓扑在空载时输出电流为零,占空比理论上应该趋近于零,但实际存在最小导通时间、驱动延迟和输出电容的漏电流,能量只进不出,电容电压就一路累积。这不是环路调得不好,是拓扑本身在空载下没有泄放通路。

解决:输出端并一只假负载电阻,按额定电流的 1% 到 2% 取值,24V/1A 的系统用 1.2kΩ、0.5W 就够。如果对空载效率有要求,就在固件里加一个电压上限判断,超过设定值 5% 就强制关波几百微秒,让它跌回来再开,也就是间歇工作模式。

5.2 上电瞬间 MOS 炸掉,测下来是电感饱和

现象:第一次上电就炸管,拆下来的 MOS 是 D-S 击穿,电感量测出来比标称低了 70%。

原因:启动瞬间输出电容相当于短路,PI 立刻把占空比顶到上限,电感电流按 $V_{in}/L$ 的斜率直线上升,几个开关周期就超过了磁芯的饱和点。饱和之后电感量掉到原来的几十分之一,电流上升斜率陡增十倍,MOS 里过的电流远超额定。

解决:软启动斜坡必须在闭环之前生效,也就是第一拍 PWM 就要受斜坡约束,不能先开环跑一段时间再切闭环。另外out_max限在 0.85,别给 0.95。选电感时饱和电流按峰值电流的 1.3 倍以上,不要按平均值。

5.3 输出稳定但一直有低频啸叫,改 PI 参数没用

现象:轻载时输出在 200 到 500Hz 之间持续摆动,电感有可听见的啸叫,加大 Kp 减小 Kp 都只是改变摆动幅度,频率不变。

原因:环路带宽越过了右半平面零点。前面算过 5V 升 24V、10µH 的时候零点在 16kHz,带宽上限 3.2kHz。如果 PI 的积分时间常数给得太小,实际穿越频率跑到 5kHz 以上,相位裕度是负的,就会出现这种与参数弱相关的固定频率振荡。

解决:先算零点频率,再把穿越频率压到它的五分之一以下,重新整定 PI。如果带宽压不下来是因为输出电容太小,那就得加电容。这条没有捷径,靠试参数是试不出来的。

5.4 ADC 读到的电流值跳动超过 20%

现象:示波器上看电感电流波形很干净,但固件里读回来的电流值上下跳,限流点因此很不准。

原因:采样时刻没有跟 PWM 同步,或者虽然同步了但采样窗口跨过了开关沿。另一种情况是采样电阻的布线没走开尔文接法,把功率回路的压降一起测进去了。

解决:确认 ADC 是注入组触发而规则组软件启动的混合用法,检查触发源是不是 TIM_TRGO。把采样时间从 2.5 周期加到 28 周期以上看有没有改善。低边电阻的两个采样脚必须从焊盘内侧单独引出,中间不要有任何功率电流经过。

5.5 限流点算出来是 8A,实测 5A 就保护了

现象:按公式算的限流阈值,实测差了一大截,而且温度越高保护点越低。

原因:三个叠加因素。比较器和运放本身有失调,几十毫伏在 10mΩ 的采样电阻上就是几安培的偏差;采样电阻是正温度系数,温度上来阻值变大;再一个是 PWM 的响应延迟,实际电流峰值比采样到的值更高,硬件刹车又在峰值之后才动作。

解决:阈值按理论值加 20% 裕量设定,然后用电子负载实测标定,把实测值和理论值的偏差写成补偿系数放进固件。采样电阻选低温漂的合金材质,别用厚膜。刹车滤波参数调小一档,看保护点有没有往理论值靠近。

6. 上电验证与闭环整定:用阶跃响应反推相位裕度

板子焊完第一次上电,我按四步走,每一步都必须过完再进下一步。

第一步只给 MCU 供电,主功率级的输入断开。用示波器看 PWM 引脚,确认频率是 200kHz、占空比在软启动阶段的斜坡正常。这一步能挡掉大部分定时器配置错误。

第二步给主功率级串一个可调直流源,限流设到 200mA,输出接 1kΩ 假负载。缓慢升输入电压,用万用表盯着输出,确认能升上去但升不高——这一步是验证电感、二极管、驱动都正常工作,同时电源的限流能兜住任何异常。

第三步接入电子负载,从 10% 额定电流开始,每档停 30 秒,记录输入输出和 MOS 温度。这一步主要看效率曲线和温升有没有异常点。

第四步才做动态测试。用电子负载做 10% 到 90% 的电流阶跃,上升沿设 100µs,示波器抓输出电压。判据如下:

验证项测点合格判据
稳态纹波输出端,20MHz 带宽限制峰峰值小于设定值的 1%
负载阶跃过冲输出端,10%↔90% 跳变过冲小于 5%,恢复时间小于 2ms
软启动过冲输出端,上电过程无过冲,单调上升到设定值
限流精度低边采样电阻与设定值偏差小于 15%
短路保护输出端直接短接10µs 内封波,无器件损坏

阶跃响应里能读出相位裕度:过冲在 5% 以内、恢复过程没有二次振荡,对应相位裕度大概 60 度以上;如果出现两三个可见的振荡周期才收敛,说明裕度在 30 度左右,勉强稳定但温度漂移或者器件离散就能把它推失稳。这个判断方法是经验性的,比不上用频响分析仪注入扫频,但对没条件买设备的人来说够用。

还有一个容易被跳过验证的项:满载运行两小时后,把输入电压从 5V 拉到 4.5V 再拉回来,看输出有没有掉出稳压范围。输入欠压时的环路增益变化很大,这一步能暴露出 PI 参数只在标称点勉强收敛的问题。

从那以后我每次改这类升压电源的参数,都会先把电感电流和零点频率算一遍写进注释,再动手调 PI,哪怕只是把输出从 24V 改成 19V 也照做一遍。数字电源的玄学基本都是没算账造成的。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询