在电子实验室和DIY项目中,一个可靠的数控电源几乎是必备工具。传统模拟电源虽然简单,但存在调节精度低、功能单一等缺点。我最近完成的这个基于STM32的数控恒压恒流电源方案,正好解决了这些问题。
这个设计最核心的特点是实现了双模式输出:恒压模式下可精确控制输出电压(0-30V,步进0.1V),恒流模式下可稳定输出设定电流(最大1.5A)。相比市面上动辄上千元的商用电源,这个方案成本控制在200元以内,特别适合电子爱好者自制使用。
关键指标:
- 输入:AC 220V市电
- 直流输出:0-30V可调(32V初始电压)
- 最大电流:1.5A
- 控制精度:电压0.1V步进,电流10mA分辨率
- 保护功能:过流保护(可调阈值)、超温报警(>60℃)
整个电源的供电链路采用经典设计:
这里有几个关键设计要点:
电压调节采用运放+MOS管的线性稳压方案:
circuit复制[运放正相输入]--[分压电阻网络]--[输出电压]
[运放反相输入]--[TLC5615 DAC输出]
[运放输出]--[P-MOS管栅极]
具体工作流程:
实测数据:
- 电压调节响应时间:<50ms
- 输出纹波:<30mV(满载时)
- 温度漂移:<0.05%/℃
电流采样采用0.1Ω/5W的精密电阻,配合INA199电流检测放大器:
过流保护采用硬件比较器(LM393)实现快速响应:
c复制void HAL_MspInit(void)
{
// GPIO时钟使能
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
// ADC初始化
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
HAL_ADC_Init(&hadc1);
// DAC初始化
hdac.Instance = DAC;
hdac.State = HAL_DAC_STATE_RESET;
HAL_DAC_Init(&hdac);
}
c复制#define KP 0.8
#define KI 0.05
#define KD 0.1
float Voltage_PID(float setpoint, float actual)
{
static float integral = 0;
static float prev_error = 0;
float error = setpoint - actual;
integral += error;
float derivative = error - prev_error;
prev_error = error;
return KP*error + KI*integral + KD*derivative;
}
c复制void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == OCP_Pin){
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0);
Buzzer_Alert(3); // 蜂鸣器报警3次
LCD_ShowMsg("Over Current!");
}
}
电压校准:
电流校准:
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 输出电压不稳 | 反馈电阻接触不良 | 检查分压网络焊接 |
| 电流显示偏差 | 采样电阻温漂 | 更换更高精度电阻 |
| MOS管发热严重 | 驱动电压不足 | 检查栅极驱动电路 |
| 过流保护不动作 | 比较器参考电压异常 | 测量电位器两端电压 |
这个项目最让我满意的是过流保护的响应速度——实测从过流触发到完全关断仅需20μs,这得益于硬件比较器+中断的设计方案。如果要做改进,我会考虑改用Buck拓扑提高效率,毕竟线性稳压在低压大电流时发热确实明显。