数控恒流恒压电源锂电池充电器陶晶驰串口屏程序源码纯资料产品拆解一个数控恒流恒压充电器项目时发现核心难点总在如何让STM32的PWM输出和串口屏参数设置实现动态联动。前两天刚给陶晶驰TJC4827T043_011串口屏写了个骚操作——用三组滑动条控件同步调节电压电流参数结果发现触摸屏的数值刷新率和主控芯片的响应速度直接决定了充电波纹系数。数控恒流恒压电源锂电池充电器陶晶驰串口屏程序源码纯资料产品来看段关键代码主控通过USART3接收串口屏指令后触发DMA中断自动更新PWM占空比。这里有个坑用标准库的TIM_OCInitStructure配置PWM通道时必须手动清除CCR寄存器的预装载位否则在快速切换恒流/恒压模式时会出现数值跳变。// PWM动态调整核心代码 void PWM_SetDuty(TIM_TypeDef* TIMx, uint32_t Channel, uint16_t duty) { TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCStructInit(TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse duty; TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCIdleState TIM_OCIdleState_Reset; TIM_OCInitStructure.TIM_OCPreload TIM_OCPreload_Enable; // 重点在这 TIM_OCxInit(TIMx, TIM_OCInitStructure); TIM_OCxPreloadConfig(TIMx, Channel, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIMx, ENABLE); // 必须配合ARR预装载 }串口屏这边更刺激触摸事件处理函数里我埋了个彩蛋——当同时按住和-按钮三秒会激活工程师模式解锁隐藏的涓流充电参数。这种骚操作在HMI开发软件里需要配置双事件叠加触发条件用Lua脚本实现状态机判定local engineer_mode 0 function on_control_notify(screen, control, value) if screen 2 and control 3 then -- 主界面参数调节区 if get_bit(value, 0) 1 and get_bit(value, 1) 1 then engineer_mode engineer_mode 1 if engineer_mode 60 then -- 持续3秒(60*50ms) send_command(page 9) -- 跳转到隐藏页面 end else engineer_mode 0 end end end调试时发现个魔幻现象当恒压模式下负载突变时ADC采集的电压值会出现毛刺。后来发现是PWM频率(20kHz)和ADC采样率(1MHz)产生了谐波干扰。解决方式很暴力——在运放反馈端并联10nF瓷片电容同时给ADC采样代码加了移动均值滤波#define FILTER_LEN 8 uint16_t adc_filter(uint16_t new_val) { static uint16_t buf[FILTER_LEN] {0}; static uint8_t index 0; uint32_t sum 0; buf[index] new_val; if(index FILTER_LEN) index 0; for(int i0; iFILTER_LEN; i){ sum buf[i]; } return (sum FILTER_LEN/2) / FILTER_LEN; // 四舍五入 }这个项目最爽的时刻是把充电器接上电子负载测试时看着串口屏上的实时曲线完美跟踪设定值那种数字与模拟世界的精准对话比喝红牛还提神。源码包里藏着个未公开的BMS通讯协议解析模块下次可以聊聊怎么用状态预测算法实现充电策略动态优化。