1. 项目背景与需求分析
参加电子设计竞赛的同学应该都深有体会,电源类题目几乎是每届比赛的必考题型。去年我带队参加省赛时,就遇到了一个典型的智能稳压限流电源设计题目。这个系统需要实现三大核心功能:软启动、自动稳压/稳流切换、过流保护。听起来简单,但实际调试过程中遇到的坑一个接一个。
先说软启动功能。很多新手会直接给满占空比,结果导致MOS管瞬间导通产生大电流冲击。我们采用分段递增的方式,就像开车时慢慢踩油门,让电压平稳上升到目标值附近。这里有个小技巧:最后10%的上升过程要特别缓慢,就像停车时的"柔刹",能有效避免超调。
稳压和稳流模式的自动切换是另一个难点。想象你在开车,稳压模式就像定速巡航,稳流模式则像上坡时自动降档保持扭矩。我们通过状态机实现这个逻辑,具体会在第三章详细讲解。过流保护功能则是系统的安全气囊,当检测到电流超过2.2A时立即切换至稳流模式。
提示:实际比赛中建议预留20%的余量,比如题目要求2A,保护点设在2.2A会更稳妥
2. 硬件架构设计
2.1 主控与功率电路选型
我们选用STM32F103作为主控,性价比高且外设丰富。功率部分采用BUCK拓扑,关键器件包括:
- 开关管:IRF540N(耐压100V/导通电阻44mΩ)
- 驱动芯片:IR2104(自带死区保护)
- 电感:47μH工字电感(饱和电流需>3A)
- 输出电容:470μF电解+100nF陶瓷并联
这里有个血泪教训:电感饱和电流一定要留足余量!我们最初用的33μH电感在2A时就饱和了,导致MOS管发热严重。后来换用TDK的SLF7045系列才解决问题。
2.2 采样电路设计
电压采样用普通电阻分压即可,但电流采样要特别注意:
// 电流采样电路参数 #define R_sense 0.05Ω // 采样电阻 #define Gain 20 // 运放放大倍数 // 实际电流 = (ADC值 * 3.3/4096) / (R_sense * Gain)建议使用INA199这类专用电流检测芯片,比普通运放方案更稳定。我们最初用LM358搭建的电路,温度漂移导致采样值波动达5%。
3. 软件实现详解
3.1 状态机设计
系统有三种工作状态,用枚举变量定义:
typedef enum { SOFT_START, // 软启动状态 VOLTAGE_MODE, // 稳压模式 CURRENT_MODE // 稳流模式 } SystemState;状态转换逻辑如下:
- 上电进入SOFT_START
- 电压达到目标值90%时转VOLTAGE_MODE
- 检测到过流立即转CURRENT_MODE
- 电流稳定且电压回升后返回SOFT_START
3.2 增量式PID实现
相比位置式PID,增量式更适合电源控制:
float IncrementalPID(float target, float actual, PID_Params* params) { static float last_error = 0, prev_error = 0; float error = target - actual; float delta = params->Kp*(error - last_error) + params->Ki*error + params->Kd*(error - 2*last_error + prev_error); prev_error = last_error; last_error = error; return delta; }参数整定经验:
- 先设Ki=0,增大Kp直到出现轻微振荡
- 然后增大Kd抑制振荡
- 最后加少量Ki消除静差 我们最终参数:Kp=0.12, Ki=0.003, Kd=0.05
4. 调试问题汇总
4.1 上电冲击问题
现象:每次上电输出电压不一致 解决方法:
- 增加硬件缓启动电路(100kΩ+10μF)
- 软件上电延迟500ms再开启PWM
- ADC采样取100次滑动平均值
4.2 稳流模式振荡
现象:电流在保护值附近来回跳动 优化措施:
- 加入滞回比较(2.2A触发,2.0A恢复)
- 稳流模式使用独立的PID参数
- 增加输出电容ESR(串联0.5Ω电阻)
4.3 OLED显示闪烁
解决方法:
// 使用DMA传输显示数据 HAL_SPI_Transmit_DMA(&hspi1, oled_buffer, sizeof(oled_buffer)); // 在主循环中避免频繁刷新 if(update_display) { OLED_Refresh(); update_display = 0; }5. 关键代码片段
5.1 软启动实现
void SoftStart(float target_voltage) { static float duty = 0; while(duty < target_voltage * 0.9) { duty += (target_voltage * 0.05); SetPWM(duty); HAL_Delay(50); } system_state = VOLTAGE_MODE; }5.2 过流保护处理
void CurrentProtectCheck(void) { if(current > 2.2f && system_state != CURRENT_MODE) { SavePreviousDuty(); // 保存当前占空比 system_state = CURRENT_MODE; PID_Reset(); // 重置PID积分项 } }6. 性能优化技巧
ADC采样优化:
- 开启ADC的DMA连续采样模式
- 使用硬件过采样功能提升分辨率
hadc1.Init.OverSampling.Ratio = ADC_OVERSAMPLING_RATIO_16; hadc1.Init.OverSampling.RightBitShift = ADC_RIGHTBITSHIFT_4;PWM频率选择:
- 开关频率50kHz(兼顾效率和纹波)
- 死区时间设置为200ns
htim1.Init.Prescaler = 8; htim1.Init.Period = 180; // 72MHz/9/180=50kHz低功耗设计:
- 空闲时关闭不用的外设时钟
- 使用停机模式+按键唤醒
这个项目最深的体会是:硬件是骨架,软件是灵魂。调试时要学会用逻辑分析仪看PWM波形,用串口绘图观察PID响应曲线。记得最后一天调通时,看着电压表稳定显示12.00V的那种成就感,现在想起来还是很激动。电源设计就像在走钢丝,要在响应速度和稳定性之间找到完美平衡点。