1. 项目背景与核心器件选型
在工业控制、医疗设备和实验室仪器等领域,经常需要将低压直流电源转换为高压直流电源。传统方案采用分立元件搭建,存在效率低、体积大、稳定性差等问题。本项目采用TI的TPS61170升压转换器与ST的STM32F745ZG微控制器组合,构建高效可靠的DC-DC升压系统。
TPS61170是一款集成1.2A开关管的单片升压转换器,具有以下突出特性:
- 输入电压范围3-18V,输出电压最高可达38V
- 固定1.2MHz开关频率,允许使用小型电感和陶瓷电容
- 集成93%占空比的功率MOSFET
- 支持轻载时的跳周期模式(Skip Mode)提高效率
- 6引脚2x2mm QFN封装节省空间
STM32F745ZG作为主控芯片的优势在于:
- 带FPU的216MHz Cortex-M7内核
- 丰富的定时器资源(PWM生成)
- 1MB Flash+320KB RAM
- 多种通信接口(SPI/I2C/USART)
- 内置12位ADC用于电压监测
2. 硬件电路设计详解
2.1 升压转换器核心电路
TPS61170的典型应用电路如图1所示。关键设计参数计算如下:
输出电压设定: Vout = Vref × (1 + R1/R2) 其中Vref=1.229V,选取R2=10kΩ,则R1=(Vout/1.229-1)×10k 例如需要24V输出时:R1=(24/1.229-1)×10k≈184kΩ
电感选型计算: 电感电流纹波通常取最大开关电流的20%-40% ΔIL = (Vin × D)/(L × fsw) 其中D=1-Vin/Vout,fsw=1.2MHz 以Vin=5V,Vout=24V为例: D=1-5/24≈0.79 取ΔIL=0.3A则: L=(5×0.79)/(0.3×1.2e6)≈11μH
输入电容选择: 输入电容需满足: Cin > Iout × D/(fsw × ΔVin) 假设允许输入纹波ΔVin=50mV: Cin > 0.3×0.79/(1.2e6×0.05)≈3.95μF 实际选用10μF陶瓷电容
2.2 STM32接口电路设计
STM32与TPS61170的硬件连接主要包括:
- PWM输出:使用TIM1_CH1连接CTRL引脚
- ADC输入:配置PA0为ADC1_IN0监测输出电压
- GPIO控制:PG13连接EN引脚实现使能控制
- 调试接口:USART1连接PC串口调试
特别注意:
- PWM频率建议设置为1kHz-10kHz
- ADC采样率需与PWM周期同步
- EN引脚需加10k上拉电阻
3. 软件控制策略实现
3.1 基础PWM调压方案
通过改变PWM占空比调节输出电压是最直接的控制方式:
// PWM初始化代码 TIM_HandleTypeDef htim1; TIM_OC_InitTypeDef sConfigOC; htim1.Instance = TIM1; htim1.Init.Prescaler = 215; // 216MHz/(215+1)=1MHz htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 999; // 1MHz/1000=1kHz PWM HAL_TIM_PWM_Init(&htim1); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 500; // 初始50%占空比 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);3.2 闭环电压控制算法
采用PID算法实现精确电压调节:
#define KP 0.5 #define KI 0.01 #define KD 0.1 float pid_control(float target, float actual) { static float integral = 0; static float prev_error = 0; float error = target - actual; integral += error; float derivative = error - prev_error; prev_error = error; return KP*error + KI*integral + KD*derivative; } void adjust_voltage(float target) { float adc_value = read_adc(); float actual_voltage = adc_value * 3.3 / 4096 * (184+10)/10; // 分压比计算 float adjust = pid_control(target, actual_voltage); uint16_t new_pulse = __HAL_TIM_GET_COMPARE(&htim1, TIM_CHANNEL_1); new_pulse += (uint16_t)adjust; new_pulse = (new_pulse > 950) ? 950 : (new_pulse < 50) ? 50 : new_pulse; __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, new_pulse); }3.3 保护功能实现
- 过压保护:
if(actual_voltage > target * 1.1) { // 超过10% HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET); // 关闭EN error_handler(); }- 软启动实现:
void soft_start(float target, uint16_t steps) { uint16_t pulse = 50; // 初始5% __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pulse); HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET); for(int i=0; i<steps; i++) { pulse += (950-50)/steps; __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pulse); HAL_Delay(10); } }4. 实测性能与优化建议
4.1 效率测试数据
在不同输入输出电压组合下的实测效率:
| Vin(V) | Vout(V) | Iout(mA) | 效率(%) |
|---|---|---|---|
| 5 | 12 | 100 | 89 |
| 5 | 24 | 50 | 85 |
| 12 | 24 | 100 | 92 |
| 12 | 36 | 50 | 88 |
4.2 常见问题解决方案
输出电压振荡:
- 检查FB引脚走线,需远离电感等噪声源
- 在FB引脚添加100pF-1nF的滤波电容
- 调整PID参数,降低KP增加KI
轻载时效率低:
- 启用Skip Mode:CTRL引脚接高电平
- 输出端并联100kΩ假负载
芯片过热:
- 检查电感饱和电流是否足够
- 加强PCB散热设计,增加散热过孔
- 降低开关频率(通过外部时钟同步)
4.3 PCB布局要点
功率回路最小化:
- 输入电容→电感→TPS61170→GND的环路面积要小
- 使用短而宽的走线(至少20mil)
敏感信号处理:
- FB引脚走线远离功率元件
- CTRL信号加33Ω串联电阻防振铃
散热设计:
- 芯片底部焊盘必须良好焊接
- 在电源层添加散热过孔阵列
5. 进阶应用扩展
5.1 多级升压方案
对于需要更高电压的应用,可采用两级升压架构:
- 第一级:TPS61170升压至24V
- 第二级:MOSFET+变压器推挽电路
STM32可统一控制两级电路,实现软启动同步。
5.2 电池供电优化
针对电池供电场景的特殊优化:
- 动态电压调节:
- 根据电池电量降低输出电压
- 实现方法:
float get_battery_voltage() { // 读取电池电压ADC值 return adc_value * 3.3 / 4096 * 2; // 假设分压比1:1 } void dynamic_adjust() { float bat_voltage = get_battery_voltage(); if(bat_voltage < 3.3) { // 低电量模式 adjust_voltage(18.0); // 降额输出 } else { adjust_voltage(24.0); } }- 低功耗模式:
- 空闲时关闭PWM进入Skip Mode
- 定期唤醒检测负载需求
5.3 数字通信接口
通过STM32的USART或I2C接口实现:
- 输出电压远程设置
- 工作状态查询
- 故障日志上传
示例协议帧格式:
[HEAD][CMD][LEN][DATA][CRC] HEAD: 0xAA CMD: 0x01 - 设置电压 0x02 - 读取状态 DATA: 对于0x01命令:2字节电压值(单位0.1V) 对于0x02命令:1字节状态码