基于STM32的多功能数控电源设计
一、系统概述与核心功能1. 系统定位基于STM32的多功能数控电源是一款高精度、宽范围、智能化的实验室电源支持恒压CV和恒流CC两种工作模式具备过压OVP、过流OCP、过温OTP等多重保护功能。系统采用PID闭环控制算法通过STM32的PWM和ADC实现精确的电压/电流调节并配备OLED显示屏和旋转编码器实现便捷的人机交互。2. 核心功能模块模块功能描述技术指标电源变换采用同步Buck拓扑输入电压12-24V DC输出0-30V/0-5A可调效率≥92%纹波≤50mVpp控制核心STM32F103C8T672MHz Cortex-M312位ADCPWM分辨率1/1000电压调节精度±0.05V电流调节精度±0.01A采样反馈高侧电流采样INA240 分压电阻电压采样双路ADC同步采样电压采样精度±0.5%电流采样精度±1%人机交互0.96寸OLED显示旋转编码器调节参数按键切换模式显示分辨率128×64参数调节步进0.01V/0.001A保护功能过压保护OVP、过流保护OCP、过温保护OTP、短路保护响应时间10ms保护精度±2%扩展接口USB通信虚拟串口、电压/电流校准接口、外部控制接口支持PC端软件监控和控制二、硬件设计方案1. 核心硬件选型模块型号关键参数接口方式主控MCUSTM32F103C8T672MHz64KB Flash20KB RAM3个ADC4个定时器核心控制器电源变换同步Buck模块输入12-24V输出0-30V/5A开关频率200kHz外部功率模块电流采样INA240A2增益50V/V共模电压-4V至80V带宽400kHzADC1_IN0电流采样电压采样精密分压电阻100kΩ10kΩ 1%精度分压比1/11ADC1_IN1电压采样显示模块OLED 12864I2C0.96寸128×64像素自发光I2C1PB6/PB7交互模块EC11旋转编码器按键20脉冲/圈带按键功能PB0-PB2编码器A/B/Z相保护模块NTC热敏电阻比较器过温检测阈值85℃硬件快速关断ADC1_IN2温度采样2. 硬件电路设计要点2.1 电源变换电路同步Buck输入电压Vin (12-24V) │ ├── 输入滤波电容100μF0.1μF │ ├── 同步Buck控制器如LM5176 │ ├── PWM输入STM32 PB1TIM3_CH4 │ ├── 反馈电压来自输出电压分压 │ └── 使能控制STM32 PB3 │ ├── 功率电感33μH饱和电流≥8A ├── 同步整流MOSFETIRF540N×2 ├── 输出滤波电容470μF10μF │ └── 输出电压Vout (0-30V)2.2 采样电路设计电压采样 Vout ──[100kΩ]──┬──[10kΩ]── GND └── ADC1_IN1电压采样点 电流采样 Vout ──[采样电阻0.01Ω]──负载 │ └── INA240A2增益50V/V ├── 输入采样电阻高端 ├── 输入-采样电阻低端 └── 输出ADC1_IN0电流采样点2.3 保护电路设计过压保护硬件 Vout ──[分压电阻]──比较器输入端 参考电压──比较器-输入端 比较器输出──STM32 PB4外部中断 当Vout 设定阈值时比较器输出低电平触发中断关断PWM 过温保护 NTC热敏电阻──ADC1_IN2 STM32实时监测温度超过85℃时降低输出或关断三、软件设计与核心代码1. 系统架构前后台系统采用前后台系统以定时器中断为后台主循环为前台TIM2定时器中断1ms执行PID控制算法更新PWM输出主循环读取旋转编码器和按键状态更新OLED显示检查保护条件并执行保护动作处理USB通信命令2. 核心代码实现基于标准库2.1 PID控制算法#includepid.h// PID参数结构体typedefstruct{floatKp;// 比例系数floatKi;// 积分系数floatKd;// 微分系数floatsetpoint;// 设定值floatfeedback;// 反馈值floatintegral;// 积分项floatprev_error;// 上次误差floatoutput;// 输出值floatoutput_min;// 输出最小值floatoutput_max;// 输出最大值}PID_Controller_t;// PID计算函数floatPID_Calculate(PID_Controller_t*pid){floaterrorpid-setpoint-pid-feedback;// 比例项floatPpid-Kp*error;// 积分项带抗饱和pid-integralerror;if(pid-integralpid-output_max)pid-integralpid-output_max;if(pid-integralpid-output_min)pid-integralpid-output_min;floatIpid-Ki*pid-integral;// 微分项floatDpid-Kd*(error-pid-prev_error);pid-prev_errorerror;// 计算输出并限幅pid-outputPID;if(pid-outputpid-output_max)pid-outputpid-output_max;if(pid-outputpid-output_min)pid-outputpid-output_min;returnpid-output;}// 电压PID控制器PID_Controller_t voltage_pid{.Kp2.5f,// 比例系数.Ki0.8f,// 积分系数.Kd0.1f,// 微分系数.setpoint12.0f,// 设定电压12V.feedback0.0f,// 实际电压.integral0.0f,.prev_error0.0f,.output0.0f,.output_min0.0f,.output_max1000.0f// PWM最大占空比};// 电流PID控制器PID_Controller_t current_pid{.Kp1.5f,.Ki0.5f,.Kd0.05f,.setpoint1.0f,// 设定电流1A.feedback0.0f,.integral0.0f,.prev_error0.0f,.output0.0f,.output_min0.0f,.output_max1000.0f};2.2 ADC采样与转换#includeadc.h// ADC采样值转实际电压/电流floatADC_ToVoltage(uint16_tadc_value){// ADC参考电压3.3V12位分辨率floatvoltage_adc(float)adc_value*3.3f/4095.0f;// 分压比1/11实际电压 采样电压 × 11returnvoltage_adc*11.0f;}floatADC_ToCurrent(uint16_tadc_value){// INA240增益50V/V采样电阻0.01Ω// 电流 (ADC电压 / 增益) / 采样电阻floatvoltage_adc(float)adc_value*3.3f/4095.0f;return(voltage_adc/50.0f)/0.01f;// 单位安培}// 读取电压和电流voidRead_Voltage_Current(float*voltage,float*current){// 启动ADC转换ADC_SoftwareStartConvCmd(ADC1,ENABLE);while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));uint16_tadc_voltageADC_GetConversionValue(ADC1);ADC_SoftwareStartConvCmd(ADC2,ENABLE);while(!ADC_GetFlagStatus(ADC2,ADC_FLAG_EOC));uint16_tadc_currentADC_GetConversionValue(ADC2);*voltageADC_ToVoltage(adc_voltage);*currentADC_ToCurrent(adc_current);}2.3 PWM输出控制#includepwm.h// 初始化PWMTIM3_CH4PB1voidPWM_Init(void){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;// 时基配置72MHz / (711) 1MHzTIM_TimeBaseStructure.TIM_Period999;// ARR999PWM频率1kHzTIM_TimeBaseStructure.TIM_Prescaler71;// PSC71TIM_TimeBaseStructure.TIM_ClockDivision0;TIM_TimeBaseStructure.TIM_CounterModeTIM_CounterMode_Up;TIM_TimeBaseInit(TIM3,TIM_TimeBaseStructure);// PWM通道配置TIM_OCInitStructure.TIM_OCModeTIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputStateTIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse0;// 初始占空比0%TIM_OCInitStructure.TIM_OCPolarityTIM_OCPolarity_High;TIM_OC4Init(TIM3,TIM_OCInitStructure);TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);TIM_ARRPreloadConfig(TIM3,ENABLE);TIM_Cmd(TIM3,ENABLE);}// 设置PWM占空比0-1000对应0-100%voidPWM_SetDuty(uint16_tduty){if(duty1000)duty1000;TIM_SetCompare4(TIM3,duty);}2.4 主控制逻辑#includemain.h// 系统状态typedefenum{MODE_CV0,// 恒压模式MODE_CC1// 恒流模式}PowerMode_t;PowerMode_t system_modeMODE_CV;floatset_voltage12.0f;// 设定电压floatset_current1.0f;// 设定电流floatactual_voltage0.0f;// 实际电压floatactual_current0.0f;// 实际电流// TIM2中断服务函数1ms执行一次PID控制voidTIM2_IRQHandler(void){if(TIM_GetITStatus(TIM2,TIM_IT_Update)!RESET){// 读取实际电压和电流Read_Voltage_Current(actual_voltage,actual_current);if(system_modeMODE_CV){// 恒压模式电压PID控制voltage_pid.setpointset_voltage;voltage_pid.feedbackactual_voltage;floatpid_outputPID_Calculate(voltage_pid);PWM_SetDuty((uint16_t)pid_output);// 如果电流超过设定值切换到恒流模式if(actual_currentset_current*1.05f){system_modeMODE_CC;}}else{// 恒流模式电流PID控制current_pid.setpointset_current;current_pid.feedbackactual_current;floatpid_outputPID_Calculate(current_pid);PWM_SetDuty((uint16_t)pid_output);// 如果电压低于设定值切换到恒压模式if(actual_voltageset_voltage*0.95f){system_modeMODE_CV;}}TIM_ClearITPendingBit(TIM2,TIM_IT_Update);}}intmain(void){// 系统初始化SystemClock_Config();GPIO_Init();ADC_Init();PWM_Init();OLED_Init();Encoder_Init();// 启动TIM2中断1msTIM2_Init();while(1){// 扫描旋转编码器Encoder_Scan();// 更新OLED显示OLED_ShowVoltage(set_voltage,actual_voltage);OLED_ShowCurrent(set_current,actual_current);OLED_ShowMode(system_mode);// 检查保护条件Protection_Check();// 处理USB通信USB_Process();}}四、系统调试与优化1. PID参数整定参数调整方法现象解决方案Kp过小逐步增大Kp响应慢稳态误差大增大Kp直到出现小幅震荡Kp过大逐步减小Kp震荡剧烈不稳定减小Kp直到稳定Ki过小逐步增大Ki稳态误差消除慢增大Ki加快消除静差Ki过大逐步减小Ki积分饱和超调量大减小Ki增加积分限幅Kd过小逐步增大Kd超调量大震荡增大Kd抑制超调Kd过大逐步减小Kd响应迟缓高频噪声敏感减小Kd2. 系统校准// 电压校准函数voidVoltage_Calibration(void){floatmeasured_voltage;floatactual_voltage;// 设置输出电压为10.00Vset_voltage10.00f;Delay_ms(2000);// 等待稳定// 读取实际电压用高精度万用表测量actual_voltage10.00f;// 假设实际测量值为10.00Vmeasured_voltageactual_voltage;// 计算校准系数floatcalibration_factoractual_voltage/measured_voltage;// 保存校准系数到EEPROMEEPROM_WriteFloat(CALIB_VOLTAGE_ADDR,calibration_factor);}3. 保护功能测试测试项目测试方法预期结果过压保护逐步增加设定电压超过30V电源自动关断显示OVP过流保护输出端短路电流限制在5A以内显示OCP过温保护加热散热片至85℃降低输出功率或关断显示OTP短路恢复短路后移除短路自动恢复正常输出参考代码 基于STM32的多功能数控电源设计原理图、PCB、程序源码等www.youwenfan.com/contentcst/123512.html五、扩展功能1. 高级功能扩展预置参数存储存储常用的电压/电流组合一键调用定时开关机设置定时开启/关闭电源适合长时间实验软启动功能输出电压缓慢上升避免冲击负载远程控制通过USB/蓝牙/WiFi实现远程监控和控制数据记录记录电压、电流、功率随时间的变化曲线2. 安全增强设计双重保护硬件比较器软件PID双重过压过流保护故障自检开机自检关键电路异常时禁止输出输出使能增加物理使能开关防止误操作散热管理智能温控风扇温度过高时强制散热六、总结基于STM32的多功能数控电源通过PID闭环控制实现高精度稳压稳流同步Buck拓扑保证高效率多重保护机制确保使用安全。