15.4 数字BUCK变换器项目2:闭环系统设计

# 15.4 数字BUCK变换器项目2:闭环系统设计

本实验在开环系统基础上引入数字PI控制,通过动态调节占空比实现输出电压的精确稳压,提升系统抗干扰能力。
核心改进

  • PI闭环控制:消除输入电压波动、负载变化带来的误差。
  • 动态参数调节:通过编码器实时调整PI参数。
  • 多模式切换:支持1V/3.3V输出快速切换,验证动态响应。

# 15.4.1 数字PI控制原理

# 1. PI控制公式

离散时间域表达式:


其中:

  • :控制输出
  • :误差(设定值 - 实际值)
  • :比例系数
  • :积分系数
  • :采样周期

# 2. 参数作用

  • 比例系数(:快速响应误差,过大会导致振荡,过小则响应迟缓。
  • 积分系数(:消除稳态误差,过大引起超调,过小则静差残留。

# 15.4.2 STM32CubeMX配置

# 1. 新增配置(基于开环工程)

  1. 开启TIM1中断:用于逐周期PI计算。
  2. 编码器按键配置:PB4引脚设置为上拉输入,用于参数切换。
  3. 代码生成:为外设生成独立文件,保持原有配置不变。

# 15.4.3 闭环软件设计

# 1. 关键变量定义(代码清单15‑7)

/* USER CODE BEGIN PV */
uint16_t value[2];    // ADC采样值:[电流, 电压]
float Vout, Iout;     // 实际电压/电流值
char Vo_str[30], Io_str[30], P_str[30], I_str[30];
int Encoder_cnt[2] = {0, 0};  // P/I参数编码值
int PI_select = 0;    // 0:调节P,1:调节I
int32_t pidtest[2] = {310, 1024};  // 1V/3.3V对应的ADC参考值
/* USER CODE END PV */
1
2
3
4
5
6
7
8

# 2. PI控制函数(代码清单15‑8)

void PositionalPI_Update(void) {
  static int32_t Integral = 0;
  int32_t Error = Voref - value[1];  // 电压误差
  // PI计算
  u0 = Integral + Error * KP;
  Integral += Error * KI;
  // 积分限幅
  Integral = (Integral < INTEGREAL_MIN) ? INTEGREAL_MIN : 
             (Integral > INTEGREAL_MAX) ? INTEGREAL_MAX : Integral;
  // 占空比限幅(10%~90%)
  Dutycycle = (u0 >> 12);
  Dutycycle = (Dutycycle < 409) ? 409 : (Dutycycle > 3686) ? 3686 : Dutycycle;
  // 更新PWM占空比
  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, Dutycycle * 720 >> 12);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 3. 功能函数

  • 输出电压切换(代码清单15‑9):

    void Outputvoltage_Change() {
      pidcnt = (pidcnt + 1) % 2;  // 0↔1切换
      Voref = pidtest[pidcnt];     // 1V或3.3V
    }
    
    1
    2
    3
    4
  • OLED显示(代码清单15‑10):

    void OLED_disp() {
      sprintf(P_str, "P:%.1f", KP / 4096.0);
      sprintf(I_str, "I:%.2f", KI / 4096.0);
      OLED_PrintString(45, 0, "BUCK", &font16x16, OLED_COLOR_NORMAL);
      // ...其他显示逻辑
    }
    
    1
    2
    3
    4
    5
    6
  • 编码器控制(代码清单15‑11):

    void Encoder() {
      Encoder_cnt[PI_select] = __HAL_TIM_GET_COUNTER(&htim2);
      // 限幅0~100
      if (Encoder_cnt[PI_select] > 100) Encoder_cnt[PI_select] = 100;
      // 更新PI参数
      if (PI_select == 0) KP = Encoder_cnt[0] * 409;  // P步长0.1
      else KI = Encoder_cnt[1] * 82;                 // I步长0.02
    }
    
    1
    2
    3
    4
    5
    6
    7
    8

# 15.4.4 PI调试过程

# 1. 调试步骤

  1. 比例系数(P)调试

    • 初始值,逐步增加至系统出现轻微振荡(如)。
    • 现象:输出电压超调,稳态误差明显(图15‑14)。
  2. 积分系数(I)调试

    • 固定,逐步增加,消除稳态误差(图15‑15a)。
    • 注意过大会导致振荡加剧(图15‑15b)。
  3. 优化比例系数

    • 降低,平衡响应速度与稳定性(图15‑16)。

# 2. 最终参数

  • 理想值
  • 实际效果:输出电压稳定在3.3V,误差<±0.05V(图15‑17)。
闭环实验结果

# 15.4.5 关键说明

  • 死区保护:占空比限制10%~90%,避免MOS管直通。
  • 定点数运算:采用Q12/Q24格式,避免浮点运算开销。
  • 动态切换:200ms周期切换输出电压,验证系统响应。