系统概述
单环PID控制是Buck电路中最基础也是最常用的控制策略,主要通过调节PWM占空比来稳定输出电压。
硬件系统设计
核心组件配置
| 组件 | 型号/参数 | 作用 |
|---|---|---|
| 主控制器 | STM32F103 | PID算法执行,PWM生成 |
| 功率开关 | MOSFET IRF540 | 高频开关 |
| 输出电感 | 100μH | 能量存储,滤波 |
| 输出电容 | 470μF | 输出滤波 |
| 电压采样 | 电阻分压+ADC | 输出电压检测 |
| 电流采样 | 采样电阻+运放 | 可选,用于过流保护 |
关键参数计算
// Buck电路参数#defineINPUT_VOLTAGE12.0f// 输入电压12V#defineOUTPUT_VOLTAGE5.0f// 目标输出电压5V#defineSWITCHING_FREQ50000// 开关频率50kHz#defineINDUCTOR_VALUE100e-6// 电感值100μH#defineCAPACITOR_VALUE470e-6// 电容值470μF#defineLOAD_RESISTANCE10.0f// 负载电阻10Ω// PWM配置#definePWM_PERIOD1599// 72MHz/(50kHz-1)#defineMAX_DUTY0.95f// 最大占空比限制#defineMIN_DUTY0.05f// 最小占空比限制软件实现
1. PID控制器结构
// PID控制器结构体typedefstruct{floatKp;// 比例系数floatKi;// 积分系数floatKd;// 微分系数floatTs;// 采样周期floatintegral;// 积分项floatprev_error;// 上一次误差floatoutput;// 输出值floatoutput_max;// 输出上限floatoutput_min;// 输出下限}PID_Controller;// PID参数初始化voidPID_Init(PID_Controller*pid,floatkp,floatki,floatkd,floatts,floatout_max,floatout_min){pid->Kp=kp;pid->Ki=ki;pid->Kd=kd;pid->Ts=ts;pid->integral=0.0f;pid->prev_error=0.0f;pid->output=0.0f;pid->output_max=out_max;pid->output_min=out_min;}// PID计算函数(位置式)floatPID_Calculate(PID_Controller*pid,floatsetpoint,floatfeedback){floaterror,derivative;// 计算误差error=setpoint-feedback;// 积分项(带抗饱和)pid->integral+=error*pid->Ts;// 积分限幅if(pid->integral>pid->output_max)pid->integral=pid->output_max;elseif(pid->integral<pid->output_min)pid->integral=pid->output_min;// 微分项derivative=(error-pid->prev_error)/pid->Ts;// PID输出计算pid->output=pid->Kp*error+pid->Ki*pid->integral+pid->Kd*derivative;// 输出限幅if(pid->output>pid->output_max)pid->output=pid->output_max;elseif(pid->output<pid->output_min)pid->output=pid->output_min;// 更新上一次误差pid->prev_error=error;returnpid->output;}2. 增量式PID实现
// 增量式PID结构体typedefstruct{floatKp,Ki,Kd;floatTs;floatprev_error;floatprev2_error;floatoutput;}Incremental_PID;// 增量式PID计算floatIncremental_PID_Calculate(Incremental_PID*pid,floatsetpoint,floatfeedback){floaterror,delta_output;error=setpoint-feedback;// 增量计算delta_output=pid->Kp*(error-pid->prev_error)+pid->Ki*error*pid->Ts+pid->Kd*(error-2*pid->prev_error+pid->prev2_error)/pid->Ts;// 累加输出pid->output+=delta_output;// 输出限幅if(pid->output>MAX_DUTY)pid->output=MAX_DUTY;if(pid->output<MIN_DUTY)pid->output=MIN_DUTY;// 更新误差历史pid->prev2_error=pid->prev_error;pid->prev_error=error;returnpid->output;}3. ADC采样处理
// 电压采样参数#defineVOLTAGE_DIVIDER_RATIO0.4f// 分压比#defineADC_REF_VOLTAGE3.3f// ADC参考电压#defineADC_RESOLUTION4095.0f// 12位ADC// 读取输出电压floatRead_Output_Voltage(void){uint16_tadc_value;floatvoltage;// 启动ADC转换ADC_SoftwareStartConvCmd(ADC1,ENABLE);while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);adc_value=ADC_GetConversionValue(ADC1);// 转换为电压值voltage=(adc_value/ADC_RESOLUTION)*ADC_REF_VOLTAGE;voltage=voltage/VOLTAGE_DIVIDER_RATIO;// 考虑分压比returnvoltage;}// 移动平均滤波#defineFILTER_WINDOW_SIZE8floatMoving_Average_Filter(floatnew_sample){staticfloatbuffer[FILTER_WINDOW_SIZE]={0};staticuint8_tindex=0;staticfloatsum=0;// 减去最旧的值,加上最新的值sum=sum-buffer[index]+new_sample;buffer[index]=new_sample;// 更新索引index=(index+1)%FILTER_WINDOW_SIZE;returnsum/FILTER_WINDOW_SIZE;}4. PWM生成与控制
// PWM初始化voidPWM_Init(void){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;GPIO_InitTypeDef GPIO_InitStructure;// 开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);// 配置GPIOGPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;// TIM2_CH1GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);// 配置定时器TIM_TimeBaseStructure.TIM_Period=PWM_PERIOD;TIM_TimeBaseStructure.TIM_Prescaler=0;TIM_TimeBaseStructure.TIM_ClockDivision=0;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);// 配置PWM通道TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;TIM_OCInitStructure.TIM_Pulse=0;// 初始占空比0TIM_OC1Init(TIM2,&TIM_OCInitStructure);// 启动定时器TIM_Cmd(TIM2,ENABLE);TIM_CtrlPWMOutputs(TIM2,ENABLE);}// 设置PWM占空比voidSet_PWM_Duty(floatduty_cycle){uint16_tpulse;// 限制占空比范围if(duty_cycle>MAX_DUTY)duty_cycle=MAX_DUTY;if(duty_cycle<MIN_DUTY)duty_cycle=MIN_DUTY;// 计算脉冲值pulse=(uint16_t)(duty_cycle*PWM_PERIOD);// 更新比较寄存器TIM_SetCompare1(TIM2,pulse);}5. 主控制循环
// 全局变量PID_Controller voltage_pid;floatoutput_voltage=0.0f;floatsetpoint_voltage=5.0f;// 目标输出电压5V// 系统初始化voidSystem_Init(void){// 初始化PID控制器// Kp=0.5, Ki=10.0, Kd=0.001, Ts=0.0001(100μs), 输出范围0-0.9PID_Init(&voltage_pid,0.5f,10.0f,0.001f,0.0001f,0.9f,0.0f);// 初始化外设ADC_Init();PWM_Init();// 启用定时中断Timer_Init(100);// 100us定时中断}// 定时中断服务函数(100us)voidTIM3_IRQHandler(void){if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET){// 清除中断标志TIM_ClearITPendingBit(TIM3,TIM_IT_Update);// 执行控制算法Buck_Control_Loop();}}// Buck控制主循环voidBuck_Control_Loop(void){staticuint16_tsample_counter=0;floatduty_cycle;// 每10次中断采样一次(1ms采样率)if(++sample_counter>=10){sample_counter=0;// 读取输出电压output_voltage=Read_Output_Voltage();// 数字滤波output_voltage=Moving_Average_Filter(output_voltage);// PID计算duty_cycle=PID_Calculate(&voltage_pid,setpoint_voltage,output_voltage);// 更新PWM输出Set_PWM_Duty(duty_cycle);}}// 主函数intmain(void){System_Init();while(1){// 主循环可执行其他任务// 如通信、状态监测、参数调整等Monitor_System_Status();}}保护功能实现
过压/欠压保护
// 保护参数#defineOVER_VOLTAGE_THRESHOLD6.0f// 过压阈值6V#defineUNDER_VOLTAGE_THRESHOLD4.0f// 欠压阈值4V// 电压保护检查voidVoltage_Protection_Check(void){if(output_voltage>OVER_VOLTAGE_THRESHOLD){// 过压保护:关闭PWM输出Set_PWM_Duty(0.0f);// 触发故障处理Handle_OverVoltage_Fault();}elseif(output_voltage<UNDER_VOLTAGE_THRESHOLD){// 欠压保护:可记录故障或采取其他措施Handle_UnderVoltage_Fault();}}软启动功能
// 软启动实现voidSoft_Start(floattarget_voltage,uint32_tstart_time_ms){staticuint32_tstart_tick=0;staticuint8_tsoft_start_active=0;if(!soft_start_active){soft_start_active=1;start_tick=Get_Tick_Count();setpoint_voltage=0.0f;// 从0开始}// 线性增加设定值uint32_telapsed=Get_Tick_Count()-start_tick;if(elapsed<start_time_ms){setpoint_voltage=target_voltage*elapsed/start_time_ms;}else{setpoint_voltage=target_voltage;soft_start_active=0;}}PID参数整定方法
经验整定法
// Ziegler-Nichols整定法voidZiegler_Nichols_Tuning(floatKu,floatTu){// Ku: 临界增益,Tu: 临界振荡周期voltage_pid.Kp=0.6*Ku;voltage_pid.Ki=1.2*Ku/Tu;voltage_pid.Kd=0.075*Ku*Tu;}// 试凑法参数调整voidEmpirical_Tuning(void){// 先调整Kp,使系统快速响应但不过冲// 再调整Ki,消除稳态误差// 最后调整Kd,抑制超调// 典型Buck电路起始参数:voltage_pid.Kp=0.1f;// 从小开始voltage_pid.Ki=1.0f;// 适当积分voltage_pid.Kd=0.001f;// 小微分}参考代码 单环PID控制buck电路www.3dddown.com/csa/73179.html
性能优化技巧
1. 抗积分饱和
// 改进的PID计算(带抗积分饱和)floatPID_Calculate_AntiWindup(PID_Controller*pid,floatsetpoint,floatfeedback){floaterror=setpoint-feedback;// 临时计算输出(不更新积分)floattemp_output=pid->Kp*error+pid->Ki*pid->integral+pid->Kd*(error-pid->prev_error)/pid->Ts;// 只有输出未饱和时才更新积分if(temp_output<pid->output_max&&temp_output>pid->output_min){pid->integral+=error*pid->Ts;}// 其余计算相同...// ...}2. 设定值平滑
// 设定值斜坡变化voidSetpoint_Ramp(floatnew_setpoint,floatramp_time_ms){staticfloatcurrent_sp=0;staticfloattarget_sp=0;staticuint32_tramp_start=0;if(new_setpoint!=target_sp){target_sp=new_setpoint;ramp_start=Get_Tick_Count();}uint32_telapsed=Get_Tick_Count()-ramp_start;if(elapsed<ramp_time_ms){setpoint_voltage=current_sp+(target_sp-current_sp)*elapsed/ramp_time_ms;}else{setpoint_voltage=target_sp;current_sp=target_sp;}}这个单环PID控制Buck电路的实现方案提供了完整的电压闭环控制,具有较好的动态响应和稳态精度。