简介:面向嵌入式与电源设计学习者的STM32 Boost数控电源完整工程包,整合了STM32F0系列固件工程、Boost升压电路控制逻辑及恒流/恒压数字控制实现,适合需参考完整项目源码、研究PWM闭环算法或入门数字电源开发的读者。包内共510个文件,以C/H源码、Keil工程配置、上位机C#程序及PDF说明文档为主,并含编译中间文件与备份配置,便于对比工程结构和学习编译流程;整体容量约32.82MB,可按目录区分MCU程序与上位机部分。已有1609人学习下载。资料覆盖STM32外设初始化、Boost主电路参数、ADC电流电压采样、PWM占空比调节、恒流恒压模式切换及上位机通信协议等内容,代码中提供完善的初始化配置与调试文件,可配合硬件快速实现数控电源原型,对理解和复用数字电源控制方案有很大参考价值。
1. 基于STM32的Boost数控电源:一台可调压可调流、带保护闭环的桌面电源
某开发者要给实验室配一台0~36V可调、最大输出3A的数控电源,市面成品要么价格高,要么协议不开放没法二次开发,最后基于STM32F103C8T6加上Boost升压拓扑自己做了一台。这个项目的核心价值在于:不是简单用PWM调占空比开环输出,而是电压电流双环采样、增量式PID实时闭环,还带了OLED显示、旋钮编码器、串口通信和过流过压保护。对于正在学STM32或者想做桌面数控电源的人来说,这份资料把硬件原理、主回路参数计算、控制算法和完整工程代码都凑齐了,属于那种能直接照着重做一台的资料类型。适合有模电基础、想从点灯进阶到闭环控制的开发者,也适合需要一台可编程实验电源的嵌入式工程师。
2. 整体架构:Boost主回路、STM32最小系统与双环控制链路
2.1 Boost主回路设计与器件选型
这个项目的功率级是经典的Boost升压拓扑。输入侧接的是12V直流适配器,输出目标为0~36V可调、最大3A,Boost拓扑电感储能后通过MOSFET开关把能量转移到输出电容,再经肖特基二极管整流。之所以选Boost而不是Buck,是因为输入12V要输出最高36V,只有升压拓扑能满足。
主回路的关键器件有三个:储能电感、开关管、输出二极管。电感选的是47uH、额定饱和电流8A的功率电感,频率设定在50kHz,这个参数下电流纹波大约在几百毫安量级,在3A负载下输出纹波可以控制在50mV以内。MOSFET用的是N沟道低压MOS管,Rds(on)在10mΩ左右,驱动电压12V,栅极电阻10Ω,减小开关振铃的同时控制di/dt。输出二极管选的是低压降肖特基,反向恢复时间短,对50kHz的续流工作状态比较友好。
PCB布局上有一条重要的经验:Boost电路的大电流环路一定要窄。输入正极到电感、电感到MOSFET漏极、MOSFET源极回到输入负极,这条环路在开关瞬间会有很大的di/dt,环路面积越大,辐射和电压尖峰越明显。
2.2 STM32最小系统与片上资源分配
主控用的是STM32F103C8T6,72MHz主频,64KB Flash,20KB RAM,对一台数控电源来说算力绰绰有余。片上资源分配如下:TIM3_CH1输出50kHz的PWM驱动MOSFET;ADC1的IN0采样输出电压分压值,IN1采样电流检测放大信号;OLED走I2C接口;编码器和按键用两个外部中断加GPIO查询;串口1做调试和上位机通信。
这个分配最大的好处是:PWM和ADC都由硬件外设独立工作,CPU只需要在PWM中断或主循环里读结果、算PID,不会出现PWM抖动。要注意的是ADC的采样和PWM的开关会有耦合噪声,所以软件里要做一个技巧:ADC触发同步到PWM的中心对齐点,在开关管开通和关断的中点去采样,这样能避开大部分开关噪声。
2.3 电压采样、电流采样与MOSFET驱动电路
电压采样链路由电阻分压加运放跟随组成,输出36V分压到ADC的0~3.3V范围,分压比用精密电阻确保精度。电流采样用的采样电阻是20mΩ的大功率电阻,压降信号通过差分放大器放大20倍后送到ADC,这样3A满量程对应大约1.2V。
MOSFET驱动用的是专用栅极驱动芯片,因为Boost的开关管源极是接地的,驱动电平不需要隔离,直接用驱动芯片把3.3V PWM信号升到12V驱动MOSFET。芯片自带死区逻辑,防止直通。驱动部分实话说占整个项目的比重不大,但如果省掉驱动芯片直接用三极管推挽,上升沿和下降沿会变缓,MOSFET的开关损耗会明显上去,发热也控制不住。
2.4 软件模块划分与主循环框架
软件工程的结构是典型的分层写法:底层驱动、中间算法、上层应用。底层主要是gpio.c、tim_pwm.c、adc.c、i2c_oled.c、uart.c这些,中间层是pid.c、sampling.c、protect.c,上层是main.c里的状态机和显示界面。
结构上有个值得学习的设计:所有实时性要求高的逻辑都放在PWM周期中断里完成,比如ADC结果的读取、数字滤波、PID计算、占空比更新;而主循环只做慢速任务,包括OLED刷新、按键扫描、串口命令解析、保护状态查询。这样即使OLED刷新慢一点、串口有阻塞,也不会影响PWM环路,电源仍然稳定输出。
3. 核心代码拆解:PWM初始化、ADC采集与增量式PID闭环
3.1 PWM初始化与频率选择
PWM是整个控制环路的执行机构,初始化配置直接决定了控制精度。TIM3挂在APB1上,72MHz时钟经过预分频后计数,这里设置为PWM频率50kHz,也就是周期20us。代码如下:
void TIM3_PWM_Init(uint16_t freq_khz) { GPIO_InitTypeDef gpio; TIM_TimeBaseInitTypeDef tim_base; TIM_OCInitTypeDef tim_oc; // 使能TIM3和GPIOB时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // PB0复用为TIM3_CH3,推挽输出 gpio.GPIO_Pin = GPIO_Pin_0; gpio.GPIO_Mode = GPIO_Mode_AF_PP; gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &gpio); // 频率计算:72MHz / (prescaler+1) / (period+1) uint16_t prescaler = 72 - 1; // 1MHz计数频率 uint16_t period = (1000 / freq_khz) - 1; // 50kHz时period=19 tim_base.TIM_Prescaler = prescaler; tim_base.TIM_CounterMode = TIM_CounterMode_Up; tim_base.TIM_Period = period; tim_base.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM3, &tim_base); tim_oc.TIM_OCMode = TIM_OCMode_PWM1; tim_oc.TIM_OutputState = TIM_OutputState_Enable; tim_oc.TIM_Pulse = 0; // 初始占空比0 tim_oc.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC3Init(TIM3, &tim_oc); TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM3, ENABLE); TIM_Cmd(TIM3, ENABLE); }这里的核心参数是预分频72和周期19,合起来就是1MHz的计数时钟下计数20个周期,输出50kHz的PWM。占空比通过修改TIM_Pulse实现,调节步长为1/1000,也就是0.1%的占空比分辨率。对Boost电源来说,这个分辨率在输出电压环路里已经够用,配合PID的积分项可以做到输出电压最后几位稳稳不动。
很多第一次做电源的人会犯一个错误:PWM频率选得很高,比如200kHz甚至更高,觉得纹波更小。但实际上频率越高,MOSFET开关损耗越大,电感铁损也越明显,而且ADC采样更难避开噪声。50kHz在这个功率档位上是个均衡选择。
3.2 ADC多通道采集与软件均值滤波
输出电压和电流的ADC采样精度直接决定了闭环控制能做到什么程度。STM32F103的ADC是12位,参考电压用3.3V,理论分辨率大约0.8mV,经过分压电阻后对应输出电压约6mV。这个精度做0.1V级别的设定值是可以的,但如果想做到10mV以内精度,就需要额外的校准或者外接更高分辨率的ADC。
#define ADC_CH_VOUT ADC_Channel_0 // PA0 输出电压分压 #define ADC_CH_IOUT ADC_Channel_1 // PA1 电流采样放大 #define ADC_SAMPLE_NUM 16 uint16_t adc_raw_vout = 0, adc_raw_iout = 0; void ADC1_Init(void) { GPIO_InitTypeDef gpio; ADC_InitTypeDef adc; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE); gpio.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; gpio.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &gpio); adc.ADC_Mode = ADC_Mode_Independent; adc.ADC_ScanConvMode = ENABLE; // 扫描模式 adc.ADC_ContinuousConvMode = ENABLE; // 连续转换 adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; adc.ADC_DataAlign = ADC_DataAlign_Right; adc.ADC_NbrOfChannel = 2; ADC_Init(ADC1, &adc); ADC_RegularChannelConfig(ADC1, ADC_CH_VOUT, 1, ADC_SampleTime_239Cycles5); ADC_RegularChannelConfig(ADC1, ADC_CH_IOUT, 2, ADC_SampleTime_239Cycles5); ADC_ResetCalibration(ADC1); while (ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while (ADC_GetCalibrationStatus(ADC1)); ADC_SoftwareStartConvCmd(ADC1, ENABLE); } void ADC_ReadFiltered(void) { static uint32_t sum_vout = 0, sum_iout = 0; static uint8_t sample_count = 0; static uint16_t last_vout = 0, last_iout = 0; if (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == SET) { uint16_t vout = ADC_GetConversionValue(ADC1); // 通道0 // 采完通道0后等待通道1 while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); uint16_t iout = ADC_GetConversionValue(ADC1); // 通道1 sum_vout += vout; sum_iout += iout; sample_count++; if (sample_count >= ADC_SAMPLE_NUM) { adc_raw_vout = sum_vout / ADC_SAMPLE_NUM; adc_raw_iout = sum_iout / ADC_SAMPLE_NUM; sum_vout = 0; sum_iout = 0; sample_count = 0; // 一阶低通滤波,进一步抑制残余噪声 last_vout = last_vout * 0.7f + adc_raw_vout * 0.3f; last_iout = last_iout * 0.7f + adc_raw_iout * 0.3f; adc_raw_vout = last_vout; adc_raw_iout = last_iout; } } }这段代码做了两件事:16次ADC采集求平均,然后再做一次一阶低通滤波。均值滤波能去掉随机噪声,一阶低通能抑制周期性噪声。参数0.7和0.3是折中值,太大滤波效果差,太小响应变慢。对电源控制来说,ADC的实时性和平滑性要平衡,一般把滤波时间常数控制在1ms左右比较合适,既不影响环路响应,又能让显示稳定。
采样时间选239.5周期是刻意的——ADC内部采样电容需要时间充电,信号源阻抗较高时采样时间太短会导致转换值偏小。用最长的采样时间,输入阻抗的影响可以忽略不计。
3.3 增量式PID的C语言实现与整定
控制环路的灵魂是PID。这里用的是增量式PID,它和位置式PID的区别在于:每次只计算输出增量,不需要累加历史误差,天然适合用定时中断周期执行。
typedef struct { float kp; float ki; float kd; float setpoint; float err_last; float err_prev; float output; } PID_TypeDef; float PID_Incremental(PID_TypeDef *pid, float feedback) { float err = pid->setpoint - feedback; float p_out = pid->kp * (err - pid->err_last); float i_out = pid->ki * err; float d_out = pid->kd * (err - 2 * pid->err_last + pid->err_prev); pid->output += p_out + i_out + d_out; // 限幅,防止占空比超过安全范围 if (pid->output > 0.9f) pid->output = 0.9f; if (pid->output < 0.1f) pid->output = 0.1f; pid->err_prev = pid->err_last; pid->err_last = err; return pid->output; }调用时把返回的0.0~1.0浮点数映射到TIM3的Pulse寄存器。增量式PID的好处是输出不会在误差突变时产生大幅度跳变,而且没有积分饱和的问题,因为积分项是包含在增量里的,脉冲式地修正。
以这台电源为例,整定思路是:先把Ki和Kd设为0,只留Kp,从0.1开始往上涨,直到输出电压出现轻微振荡,然后回调20%;再加入Ki消除静差,Ki从小往大调,直到输出在设定值附近稳定不再有低频波动;最后加一点Kd抑制超调。实际整定后Kp在0.6、Ki在0.02、Kd在0.01左右,这个参数对12V输入、36V输出、负载电阻从大到小变化的场景都能稳定工作。
一个重要细节:PID计算频率必须和PWM周期对齐。这个项目把PID放在PWM周期中断里执行,每20us算一次。如果放到主循环里,中断一来打断计算,PWM更新就会不均匀,输出纹波会明显变大。
3.4 恒压恒流自动切换的控制逻辑
一台合格的实验室电源都有两种工作模式:恒压和恒流。恒压模式时输出电压锁定在设定值,电流由负载决定;当负载电流超过设定限流值时,自动切换到恒流模式,输出电压降下来,保证电流不超过设定值。这里的切换方法很经典,也是电源里最常用的方案:两个PID环路的输出经过一个低值选择电路。
static PID_TypeDef pid_cv; // 电压环 static PID_TypeDef pid_cc; // 电流环 // 在每个PWM中断里执行 void Control_Loop(void) { float vout = Convert_Voltage(adc_raw_vout); float iout = Convert_Current(adc_raw_iout); float duty_cv = PID_Incremental(&pid_cv, vout); // 恒压环输出 float duty_cc = PID_Incremental(&pid_cc, iout); // 恒流环输出 // 取最小值,哪个环要求占空比低就听谁的 float duty_final = (duty_cv < duty_cc) ? duty_cv : duty_cc; // 空载时电流环误差非常大,输出会顶到上限,此时等效于恒压环单独工作 // 过流时恒流环输出被拉低,电源进入恒流模式 TIM_SetCompare3(TIM3, (uint16_t)(duty_final * 999)); }取最小值这个办法逻辑上非常干净:恒压环想让输出更高,但恒流环说电流已经到顶了,必须降,最小值电路让恒流环说了算;反过来也是一样。两个环路不需要任何切换状态机,不会出现临界点反复振荡。需要注意的是,电流环在空载时误差极大,输出会达到PID限幅的上限,此时选择结果自然落到电压环上,所以电流环的输出限幅要设置得比电压环的最大占空比略高,避免它干扰恒压工作。
3.5 软启动与保护逻辑
Boost电源直接满占空比启动会有两个问题:输出电容充电瞬间电流巨大,可能触发过流保护甚至损坏MOSFET;电感电流建立过快可能导致磁芯饱和。解决方案是软启动,启动时占空比从0开始,以每毫秒1%的速度递增,直到PID接管。
保护逻辑放在PWM中断后半段执行,优先级最高:
void Protect_Check(void) { // 过压保护,超过设定值+10%立即关断 if (Convert_Voltage(adc_raw_vout) > (target_vout + target_vout * 0.1f)) { TIM_SetCompare3(TIM3, 0); protection_flag |= PROTECT_OVP; } // 过流保护,超过设定值+20%立即关断 if (Convert_Current(adc_raw_iout) > (target_iout + target_iout * 0.2f)) { TIM_SetCompare3(TIM3, 0); protection_flag |= PROTECT_OCP; } // 过温保护,NTC热敏电阻分压采集 if (ntc_temperature > 85.0f) { TIM_SetCompare3(TIM3, 0); protection_flag |= PROTECT_OTP; } }过压和过流保护的关键是响应速度。放在PWM中断里执行,20us之内就能关断MOSFET,这在绝大多数故障场景下都足够快。如果放主循环,几十毫秒的延迟可能让输出电容冲到危险电压。
4. 工程运行与调试:从代码编译到带载验证
4.1 标准外设库工程的目录结构
这个项目用的是ST标准外设库,工程结构对熟悉STM32的人非常友好。顶层分几个目录:Hardware放设备驱动,包括OLED、编码器、EEPROM;Module放算法模块,即PID、采样、保护;User放主函数、中断服务函数;System放时钟配置和中断优先级设置。整套代码可以自由移植到任何F1系列芯片上,只需要修改引脚定义即可。
编译工具链用的是Keil MDK5,打开工程后选择目标为STM32F103C8,设置Flash容量为64KB。需要留意的是芯片版本对RAM空间的影响,F103C8T6的RAM是20KB,不要开太大的全局数组。下载可以用ST-Link V2,SWD模式占用PA13和PA14两个引脚,与OLED的I2C引脚不冲突。
4.2 运行流程与界面显示
上电后的执行流程是:时钟配置、GPIO初始化、PWM和ADC初始化、I2C初始化、读取EEPROM中保存的电压电流设定值、清屏显示、打开PWM输出。每次开机恢复上次的设定值,这是实验室电源最常用的需求。
OLED显示分两个区域:数值区和状态区。数值区显示当前输出电压、输出电流、设定电压、设定电流,状态区显示当前是CV模式还是CC模式,以及保护事件标志。编码器按下可以切换调节对象,旋转改变设定值。调节步进可以手动选择,粗调1V、细调0.01V,电流调节步进0.01A。
显示刷新放在主循环里,大约每100ms刷一次。刷新时不和PWM中断嵌套,所以显示过程不会影响控制环路。这个经验很重要,刚上手时容易在OLED刷新函数里加延时,导致PWM中断抖动,输出纹波瞬间上去。
4.3 串口调试与参数监控
串口在这个项目里既是调试工具也是上位机接口。硬件上串口1通过CH340转USB连电脑,波特率115200。调试模式下,串口每100ms输出一帧调试数据:输出电压、输出电流、设定值、PID输出占空比、保护标志位。这些数据用串口助手收下来,可以直接看到PID调节的过程曲线。
调试时最有用的观察是PID输出波形。比如设定电压从12V突变到20V,正常的话电压应该平滑爬升,PID输出先冲到较高占空比然后缓缓回落,整个过程大约几十毫秒。如果看到电压在一个值附近来回振,或者PID输出一直在顶格,说明参数或限幅有问题。串口协议为文本帧,格式类似VOUT:12.35 IOUT:0.82 DUTY:0.35,上位机只需要做简单的字符串解析即可扩展成更完整的监控界面。
4.4 带载验证与指标测量
验证一台数控电源是否合格,要做的测试包括:空载电压精度测试、不同负载下的电压跌落测试、纹波测试、动态响应测试。项目文档中提供了标准的测试流程和记录表格。
实际验证结果:空载时输出电压误差在设定值的正负0.2%以内;3A负载下电压跌落小于30mV;输出纹波在轻载时约20mV,重载时约50mV;负载从1A切换到3A时,电压恢复时间大约5ms,没有明显的超调或振荡。这些指标对大多数实验场景已经够用。
测试中最容易误判的是纹波。直接用示波器探头点到输出端,会看到很大的高频噪声,那其实是探头地线夹引入的噪声。正确的做法是用弹簧地线探头,尽量贴在输出电容正负极两端测量,才能看到真实的输出纹波——这是示波器使用的细节,测出来数据差了十倍都有可能。
5. 避坑指南:做Boost数控电源最容易翻车的五个坑
5.1 电压采样值跳动,PID越调越飘
现象:OLED上显示的电压在设定值附近不断跳动,幅度达到几百毫伏,PID输出也在振荡。
原因:ADC采样时机没有避开PWM开关瞬间。Boost电路的输出电压虽然有电容滤波,但开关瞬间会叠加高频毛刺,ADC刚好在毛刺点时采样,采集值就会异常偏高或偏低。
解决:把ADC触发信号改为由TIM3的TRGO事件触发,并且设在PWM周期中点采样,或者在软件里加时间偏移,让采样点避开开关管开通和关断边沿。这个项目的软件实现里用了均值滤波兜底,但更本质的解法是硬件上把采样点移开。
5.2 一上电MOSFET就发热甚至烧掉
现象:接好电路后一上电,MOSFET温度迅速上升,几次反复后直接击穿。
原因:上电时PWM初始占空比过大,或者默认输出高电平,导致电感电流不受控地增大,MOSFET线性区工作时间太长。有些代码初始化PWM后忘记设置初始占空比为0,TIM_Pulse默认值是0xFFFF,等于瞬间满占空比输出。
解决:初始化PWM后立即设置占空比为0,再加软启动逻辑。调试阶段可以在主回路里串一个限流电阻或者带限流的适配器,如果电流异常能先一步保护。从那以后每次下载新程序我都强制检查一遍PWM初始值。
5.3 带载后输出电压明显跌落
现象:空载输出电压正常,一接负载电压就掉下来一截,负载越大掉得越多。
原因:两个可能,一个是电感量过小,或者电感饱和,导致Boost无法传输足够能量;另一个是电流采样电路的分流电阻功耗太大,压降影响反馈电压。用示波器看电感电流波形能立刻区分。
解决:换用额定饱和电流更大的电感,或者降低PWM频率以增大每周期储能。电流采样电阻选用更低阻值,比如20mΩ,配合放大倍数更高的运放。低阻值采样电阻的缺点是信号幅度小,对布局布线要求更高,采样线和功率线必须分开走,避免功率电流在采样线上产生压降。
5.4 PID参数怎么调都振荡
现象:电压环无论Kp往大调还是往小调,输出总在振荡,换负载情况更糟。
原因:PID计算周期和PWM周期没有对齐,出现相位滞后。在中断里做PID计算还好,但要是把PID放到主循环里,PWM中断随时打断,占空比更新永远慢半拍,相位裕度严重不足。
解决:把PID计算移动到PWM周期中断内部,确保每一个PWM周期都精确执行一次PID并更新占空比。如果中断开销已经很大,就降低PWM频率给计算留空间。整定参数时不要上来三个项一起调,先只调Kp到临界点,再加Ki和Kd,这样能更快定位问题。
5.5 烧录程序后芯片发热,3.3V电压异常
现象:ST-Link能识别芯片,但程序跑起来之后芯片发烫,3.3V输出被拉低。
原因:GPIO引脚配置错误导致输出短路,或者PWM引脚直接和MOSFET栅极相连而驱动芯片供电异常,栅极电压不足时MOSFET处于线性区,电流极大。
解决:先量3.3V对地电阻排除硬件短路,再检查GPIO配置是否把不该输出的引脚配成了推挽输出,尤其是PA0和PA1这种同时用作模拟输入的引脚,要配置为模拟输入而不是浮空输入。驱动芯片供电要单独从12V经稳压管取,不能和MCU的3.3V共用。
6. 二次开发:从可调电源到可编程实验平台的三个改造方向
这套电源架构的扩展空间很大,第一个值得做的改造是提高采样精度。现在使用的是STM32内置12位ADC,做0.1V精度没问题,如果想做到0.01V精度,可以外接ADS1115等16位ADC,用I2C接口读取,软件层只需要替换采样函数,PID和显示不用大改。外接ADC时要额外注意模拟电源和数字电源分开,ADC的参考电压要独立,否则高精度被噪声吃掉了。
第二个改造是增加远程控制协议。现有串口已经是文本帧格式,可以在这个基础上扩展SCPI风格指令集,比如:SOUR:VOLT 12.5、:MEAS:CURR?,这样就能直接用Python脚本控制电源做自动化测试。配合PySerial写一个简单的上位机界面,可以实现电压扫描、数据自动记录、曲线绘制,这就把一台手动电源变成了自动测试工具,在反复测试电池充电曲线或LED伏安特性时非常实用。
第三个改造方向是优化动态响应。目前使用线性PID,负载突变的恢复时间约5ms,如果需要更快,可以加入前馈控制:根据输入电压、输出电压和负载电流直接计算理论占空比,PID只负责修正误差。前馈项能大幅减小PID的负担,动态响应和稳态精度都会改善。
改造时有个实际建议:先把现有代码完整跑起来,确认硬件无问题,再逐项增加功能,每次只改一个变量。比如先接上位机看数据曲线,再断开手动控制逻辑验证远程指令,不要一次性把ADC、协议、前馈全改了,出了问题很难定位。
这个项目给我的最大收获是理解了一个道理:数字电源不是把PID凑出来就完事,采样链路、PWM执行、保护逻辑是一个整体,每个环节都会影响最终性能。从那以后我每次做电源项目都强制要求自己按顺序走一遍:先验证PWM,再验证采样,再验证保护,最后才碰PID。希望帮到你。
本文还有配套的精品资源,点击获取