1. 项目背景与核心功能直流电机控制是嵌入式系统开发的经典课题而结合PID算法和TFTLCD实时监控的解决方案在工业自动化、智能小车等领域有广泛应用。这个项目最吸引我的地方在于它完美融合了硬件控制PWM输出、算法实现PID调节和人机交互屏幕显示串口调试三大要素。实际开发中我遇到过几个典型问题电机启动时的超调震荡、负载突变时的速度波动、屏幕刷新导致的控制周期不稳定。经过反复调试最终实现了一套响应速度在200ms内、稳态误差小于3%的闭环控制系统。整套方案的成本控制在200元以内非常适合学生竞赛或小型自动化设备开发。系统运行时你能直观看到这些数据流动编码器脉冲→速度计算→PID调节→PWM输出→电机转动→编码器反馈。这种闭环控制在TFTLCD上以两种形式呈现顶部区域显示实时转速数值比如1250r/min下方绘制动态折线图每0.2秒更新一个速度坐标点。当通过串口发送S1500时曲线会清晰地展示系统从当前速度过渡到1500r/min的调节过程。2. 硬件架构设计要点2.1 关键器件选型经验STM32F103ZET6是我多次验证过的选择它的定时器资源丰富TIM2生成10kHz PWM电机驱动、TIM3编码器模式测速、TIM6产生200ms中断控制周期。有次尝试改用F407芯片虽然性能更强但引脚分配时发现FSMC和定时器通道存在冲突反而增加了布线难度。L298N驱动模块要注意散热问题。实测发现当PWM占空比持续超过70%时散热片温度会升至60℃以上。后来我在电机电源端并联了0.1μF电容有效抑制了电刷火花带来的电压毛刺。编码器建议选择1000线以上分辨率AB相输出最好经过74HC14施密特触发器整形避免长线传输的波形畸变。2.2 电路连接避坑指南TIM2_CH1(PA0)输出PWM到L298N的BLA端时一定要串联100Ω电阻我有块开发板就是直连导致PWM波形被拉低。编码器接口推荐用TIM3因为它的CH1(PA6)和CH2(PA7)正好在开发板同一排针上布线方便。特别注意L298N的逻辑供电5V必须与STM32共地否则会出现电机转速随机跳变的现象。FSMC驱动TFTLCD时PB0背光控制引脚容易被忽略。有次调试发现屏幕能初始化但无显示查了三小时才发现是漏配了这个GPIO。建议在CubeMX里先将所有用到的引脚标记颜色这样能直观检查是否有功能冲突。3. 软件实现关键技术3.1 增量式PID的工程化实现传统PID算法在电机控制中容易产生积分饱和我采用的增量式PID结构体包含三个关键变量typedef struct { float ActualSpeed; // 编码器反馈值 float error; // 当前偏差 float lasterror; // 前次偏差 int_least16_t PWM; // 输出PWM(-7200~7200) } PID;调节KP时有个技巧先设为0逐渐增大直到出现轻微震荡然后取该值的60%作为初始参数。比如测试时震荡临界KP是8.5实际使用5.1效果最佳。对于12V直流电机KI建议范围0.01~0.05KD取0.1~0.3。注意每次修改参数后要调用PID_init()清零历史误差。3.2 编码器测速的精度优化1000线编码器在4倍频模式下理论分辨率是4000脉冲/转。我的速度计算公式为motorspeed (short)__HAL_TIM_GET_COUNTER(htim3)*0.075;这个0.075的系数来源于(60秒/0.2秒采样周期)/4000脉冲。特别注意类型转换当电机反转时TIM3计数器从65535递减强制转为short会得到负值因此需要abs()处理。为了抑制噪声我添加了滑动滤波保留最近5次采样值去掉最大最小值后取平均。3.3 TFTLCD动态显示方案屏幕刷新是最耗时的操作要特别注意两点一是将静态元素网格、标题与动态数据分层绘制二是使用DMA传输减轻CPU负担。我的实现方案是初始化时调用LCD_SpeedDrawLine()绘制坐标网格每200ms中断中仅更新LCD_DrawPoint(ntime, motorspeed/Speed_n());当ntime达到479时整屏清除重绘。显示曲线时将4000r/min映射到240像素高度每个像素对应16.67r/min。实测这个比例既不会丢失细节又保证曲线不过于敏感。4. 交互调试技巧4.1 串口协议设计心得我定义了一套简洁的调试协议S1500设置目标转速为1500r/minP2.1设置KP2.1I0.05设置KI0.05D0.2设置KD0.2在HAL_UART_RxCpltCallback()中通过判断首字母来区分参数类型。特别注意浮点数解析时要处理小数点位置我写的Get_PIDDate()函数就包含这个逻辑for(i1;iUart1_Rx_Cnt;i) { if(RxBuffer[i].) { ni; //记录小数点位置 break; } }4.2 实时监控的工程价值这套监控系统帮我发现了多个隐蔽问题有一次发现曲线出现周期性波动检查发现是L298N供电不足另一次看到转速显示偶尔跳变最终排查出是编码器接线接触不良。建议调试时重点关注两个特征阶跃响应的超调量应10%、稳态波动范围应5%。通过串口打印的PWM和速度对应关系还能估算电机负载特性。比如当PWM4000时转速2000r/min突然降为1800r/min说明负载转矩增大了约10%。这些数据对后续的机械结构优化非常有帮助。