1. STM32F103数控电源设计概述
数控电源作为现代电子设备的核心部件,其精度和稳定性直接影响整个系统的性能。基于STM32F103的数控电源设计,通过DAC输出精确控制电压,配合高精度电流检测技术,实现了从传统模拟电源到智能数控电源的跨越。这种设计方案在实验室设备、工业控制、医疗仪器等领域有着广泛应用需求。
我选择STM32F103C8T6作为主控芯片,主要考虑到它内置12位DAC和ADC,72MHz主频完全满足实时控制需求,且成本优势明显。相比传统的电位器调节方式,数控电源具有可编程、易校准、远程控制等显著优势。在实际项目中,电源输出精度通常需要达到±10mV以内,电流检测精度±1%以上,这对DAC输出和电流检测电路提出了严苛要求。
2. 硬件系统架构设计
2.1 主控电路设计
STM32F103最小系统包含以下关键部分:
- 主芯片:STM32F103C8T6(64K Flash,20K RAM)
- 时钟电路:8MHz晶振+22pF负载电容
- 复位电路:10kΩ上拉电阻+0.1μF电容
- 调试接口:SWD四线制(VCC、GND、SWDIO、SWCLK)
- 电源滤波:每个电源引脚配置0.1μF陶瓷电容
特别注意:STM32F103的VDDA和VSSA必须连接,且要加π型滤波(10Ω电阻+0.1μF+1μF),这对ADC精度至关重要。
2.2 功率输出级设计
功率输出采用二级放大架构:
- DAC输出缓冲:OP07运放组成电压跟随器
- 功率放大:TIP122达林顿管+散热片
- 反馈网络:精密多圈电位器用于增益校准
输出电压范围0-30V,最大电流3A。关键参数计算:
- 输出电压Vout = DAC值 × (Vref/4096) × 放大倍数
- 放大倍数 = 1 + (Rf/Ri) = 10(实测需校准)
2.3 高精度电流检测方案
电流检测采用两种技术并行:
-
高端电流检测:INA219芯片(I2C接口)
- 测量范围:±3.2A
- 分辨率:0.1mA
- 精度:±0.5%
-
低端采样电阻+仪表放大器:
- 采样电阻:0.1Ω/1% 5W合金电阻
- 放大器:AD620(增益G=100)
- ADC采样:STM32内置12位ADC
电流计算公式:
I = (ADC值 × Vref/4096) / (Rsense × G)
3. 关键软件实现
3.1 DAC输出配置
使用STM32CubeMX配置DAC:
c复制// DAC通道1配置
hdac.Instance = DAC;
hdac.State = HAL_DAC_STATE_RESET;
HAL_DAC_Init(&hdac);
// 输出缓冲使能
DAC_ChannelConfTypeDef sConfig;
sConfig.DAC_Trigger = DAC_TRIGGER_NONE;
sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1);
// 设置输出电压
void SetOutputVoltage(float voltage)
{
uint32_t dacValue = (voltage / 3.3f) * 4095;
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, dacValue);
}
3.2 电流检测ADC配置
多通道ADC DMA采样配置要点:
c复制// ADC初始化
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ENABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DMAContinuousRequests = ENABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
HAL_ADC_Init(&hadc1);
// 配置规则组通道
ADC_ChannelConfTypeDef sConfig;
sConfig.Channel = ADC_CHANNEL_1; // 电流检测
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
// 启动DMA连续转换
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adcBuffer, BUFFER_SIZE);
3.3 PID控制算法实现
电压闭环控制采用增量式PID:
c复制typedef struct {
float Kp, Ki, Kd;
float err, lastErr, prevErr;
} PID_Controller;
float PID_Update(PID_Controller* pid, float setpoint, float feedback)
{
pid->err = setpoint - feedback;
float delta = pid->Kp * (pid->err - pid->lastErr)
+ pid->Ki * pid->err
+ pid->Kd * (pid->err - 2*pid->lastErr + pid->prevErr);
pid->prevErr = pid->lastErr;
pid->lastErr = pid->err;
return delta;
}
// 调用示例
PID_Controller pid = {0.8, 0.05, 0.1};
float output = PID_Update(&pid, targetVoltage, actualVoltage);
SetOutputVoltage(output);
4. 精度提升关键技术
4.1 DAC输出校准方法
实测发现DAC存在非线性误差,采用三点校准:
- 零点校准:输出0x000,测量实际电压V0
- 中点校准:输出0x800,测量实际电压V1
- 满量程校准:输出0xFFF,测量实际电压V2
建立校准公式:
c复制float calibratedDAC(uint16_t raw)
{
// 二次曲线拟合
static float a, b, c; // 校准系数
return a*raw*raw + b*raw + c;
}
4.2 电流检测抗干扰设计
实测中遇到的噪声问题及解决方案:
- 问题:ADC采样值跳动±5LSB
- 对策:增加硬件RC滤波(1kΩ+0.1μF)
- 软件采用滑动平均滤波:
c复制#define FILTER_SIZE 8
float MovingAverage(float newVal)
{
static float buffer[FILTER_SIZE];
static uint8_t index = 0;
buffer[index] = newVal;
index = (index + 1) % FILTER_SIZE;
float sum = 0;
for(int i=0; i<FILTER_SIZE; i++) {
sum += buffer[i];
}
return sum / FILTER_SIZE;
}
- 问题:温度漂移导致零点偏移
- 对策:上电时自动校零,记录空载时的ADC值作为偏移量
5. 系统测试与性能分析
5.1 静态参数测试
测试条件:室温25℃,负载电阻10Ω
| 输出电压(V) | 设定值 | 实测值 | 误差(%) |
|---|---|---|---|
| 1.000 | 1.000 | 0.998 | -0.2 |
| 5.000 | 5.000 | 4.992 | -0.16 |
| 10.000 | 10.000 | 9.987 | -0.13 |
| 15.000 | 15.000 | 14.976 | -0.16 |
5.2 动态响应测试
使用电子负载进行阶跃响应测试:
- 负载从0.5A突变为2A时
- 电压跌落:<50mV
- 恢复时间:<200μs
5.3 长期稳定性测试
连续工作8小时监测:
- 电压漂移:<±0.05%
- 温度上升:<15℃(需保证散热条件)
6. 常见问题与解决方案
6.1 DAC输出异常
现象:输出电压与设定值偏差大
排查步骤:
- 检查参考电压是否稳定(3.3V±1%)
- 测量DAC引脚输出电压是否正常
- 验证放大电路各节点电压
- 检查PCB布局,避免数字信号干扰模拟部分
6.2 电流检测不准确
现象:小电流时读数跳动大
解决方案:
- 改用四线制接法消除导线电阻影响
- 在采样电阻两端并联0.1μF电容
- 软件上启用中值滤波算法
6.3 系统振荡问题
现象:输出电压周期性波动
调试方法:
- 降低PID的Kp系数
- 增加微分项Kd抑制振荡
- 检查反馈回路相位延迟
7. 进阶优化方向
- 采用外部精密基准源(如REF5025)替代内部参考电压,可将精度提升至±0.05%
- 电流检测改用Σ-Δ型ADC(如ADS1115),实现16位分辨率
- 增加温度传感器(DS18B20)进行温度补偿
- 设计上位机软件实现曲线记录和远程控制
实际项目中,我在功率管散热设计上栽过跟头——最初使用的普通散热片在满负载30分钟后就出现热保护。后来改用热管散热器配合风扇强制散热,才解决了这个问题。这也提醒我们,电源设计不能只看电气参数,热设计同样关键。
