news 2026/5/1 10:31:31

单环PID控制Buck电路实现方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
单环PID控制Buck电路实现方案

系统概述

单环PID控制是Buck电路中最基础也是最常用的控制策略,主要通过调节PWM占空比来稳定输出电压。

硬件系统设计

核心组件配置

组件型号/参数作用
主控制器STM32F103PID算法执行,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电路的实现方案提供了完整的电压闭环控制,具有较好的动态响应和稳态精度。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 4:02:45

立足北京,直通AI:CAIE认证报考全流程与核心技能详解

随着人工智能技术在各行各业的深度应用&#xff0c;专业能力评估体系逐渐成为人才市场的重要参考。在北京这座科技创新中心&#xff0c;如何系统化提升AI技能、获取行业认可&#xff0c;成为许多从业者关注的重点。 本文将客观分析当前人工智能领域的专业能力评估路径&#xff…

作者头像 李华
网站建设 2026/5/1 5:01:16

可可炭疽病叶片和果实检测_YOLO11-C3k2-DWR-DRB模型实现

1. 可可炭疽病叶片和果实检测_YOLO11-C3k2-DWR-DRB模型实现 1.1.1. 经验分享 在农业病害检测领域&#xff0c;尤其是针对可可炭疽病的识别&#xff0c;模型的精度和效率至关重要。&#x1f50d; 经过多次实验&#xff0c;我发现YOLO11结合C3k2、DWR和DRB模块的组合能够显著提…

作者头像 李华
网站建设 2026/5/1 6:17:12

我的用户文件夹占了几十G,怎么知道是哪些文件这么大?

我的用户文件夹占了几十G&#xff0c;怎么知道是哪些文件这么大&#xff1f;如果你的用户文件夹占用了几十个 gigabytes, 看起来像一个隐藏的空间水池, 在删除任何重要文件之前, 你需要一个清晰的方法来找到大文件和大文件夹. 本文展示了在 windows, macos, 或 linux 上识别空间…

作者头像 李华
网站建设 2026/4/30 14:45:50

POS文件完全指南:从零开始学处理

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个交互式POS文件学习工具&#xff0c;通过分步向导引导用户完成&#xff1a;1) POS文件结构认知 2) 基础数据解析 3) 简单统计分析。每个步骤提供示例文件、操作指导和即时反…

作者头像 李华
网站建设 2026/5/1 7:22:22

告别USB线!无线DroidCam办公效率提升300%

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个网络优化工具&#xff0c;专门针对无线DroidCam使用场景&#xff0c;功能包括&#xff1a;1) 自动检测网络延迟和带宽&#xff1b;2) 推荐最佳视频分辨率和帧率&#xff1b…

作者头像 李华
网站建设 2026/4/30 18:26:30

告别配置烦恼:DeepSeek本地部署的自动化硬件调优

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 构建一个DeepSeek硬件配置自动化优化系统&#xff0c;能够&#xff1a;1. 通过基准测试自动评估当前硬件性能 2. 与DeepSeek推荐的理想配置进行比对 3. 自动调整系统参数优化性能 4…

作者头像 李华