1. 项目概述本项目是一个面向嵌入式控制初学者的PID算法实践平台以TI MSPM0G3507微控制器为核心构建一个具备闭环控制能力、参数可调、状态可视化的电机控制系统。系统通过霍尔编码器实时采集电机转速与位置信息运行离散化PID控制算法驱动直流减速电机实现两种典型控制模式定速控制Speed Hold与定距控制Distance Hold。所有控制参数、实时反馈量、目标设定值及动态响应曲线均通过1.8英寸TFT彩屏直观呈现形成“感知—计算—执行—显示”完整闭环。该设计不追求工业级精度或高动态性能而聚焦于控制理论的工程落地验证从硬件信号链搭建、ADC采样配置、PWM输出时序控制、编码器正交解码到PID参数整定方法、抗积分饱和处理、控制输出限幅等关键环节均采用可读性强、调试友好的实现方式。所有功能模块均基于MSPM0G3507片上外设原生支持未依赖第三方库或抽象层便于开发者逐行理解底层机制。2. 硬件系统架构2.1 整体拓扑结构系统采用分层供电与功能隔离设计硬件链路由五大子系统构成电源管理子系统12V输入 → DC/DC降压 → 5V分配主控与人机交互子系统MSPM0G3507核心板 5按键 TFT显示屏电机驱动子系统TB6612FNG双H桥驱动芯片 JGB37-520电机反馈传感子系统JGB37-520内置霍尔编码器A/B相正交输出信号调理与接口子系统电平匹配、滤波、ESD防护各子系统间通过明确的电气接口连接无模拟信号长线走线避免噪声耦合。PCB布局遵循“功率路径短、数字地与模拟地单点连接、高频信号包地”原则虽为开发板形态但已体现基本EMC设计意识。2.2 电源管理设计系统输入为标称12V锂电池实际工作范围为10.5V–12.6V。电源路径分为两条独立支路支路负载电压关键器件设计要点主电源MSPM0G3507核心板、TFT屏、按键、编码器5VMP1584EN固定5V输出模式输入端并联47μF钽电容100nF陶瓷电容输出端采用22μF钽电容10μF陶瓷电容组合滤波FB分压电阻按数据手册推荐值配置确保±2%稳压精度电机直驱TB6612驱动芯片逻辑侧VM除外5V同MP1584EN输出与主电源共用但通过0Ω跳线或磁珠与电机功率地隔离注TB6612的VM引脚直接接入12V电池不经过MP1584EN。该设计使电机绕组获得全电压驱动能力同时将大电流开关噪声严格限制在功率地平面避免污染数字地。MP1584EN仅承担5V逻辑供电负载电流约300mA远低于其1.5A额定输出能力留有充分裕量。电源指示电路由1个绿色LEDλ525nm与1kΩ限流电阻串联组成接在MP1584EN的5V输出与GND之间。经计算流过LED电流约为4.3mA在保证可见亮度的同时降低静态功耗。2.3 主控单元MSPM0G3507资源配置MSPM0G3507是TI推出的基于Arm Cortex-M0内核的超低功耗MCU主频最高64MHz集成丰富模拟与数字外设。本项目对其资源进行如下针对性配置外设模块引脚分配配置参数工程目的GPIOP1.0–P1.4上拉输入10ms软件消抖五向独立按键上/下/左/右/停ADCA0 (P0.0)12位采样周期16参考电压VDD5V编码器供电电压监测非必须用于故障预警CAPTC0/C1 (P0.2/P0.3)正交编码器模式4x计数直接解析JGB37-520的A/B相信号免去软件查表解码开销PWMPWM0A/PWM0B (P0.4/P0.5)互补输出死区时间200ns频率20kHz驱动TB6612的PWMA/PWMB实现双极性调速UARTU0TX/U0RX (P1.6/P1.7)115200bps8N1预留调试串口未在本项目启用但原理图保留SPISCLK/MOSI/MISO (P0.6/P0.7/P1.1)4MHzCPOL0, CPHA0驱动1.8寸TFTST7735S控制器8-bit并口模式需额外IO故选用SPI节省引脚特别说明CAPT模块配置为正交编码器输入模式后硬件自动完成A/B相边沿检测、方向判别与计数累加计数值存于CAPT_CNT寄存器。相比通用GPIO中断状态机软件解码方案此方式CPU占用率趋近于零且无丢步风险是中低速电机测速的最优解。2.4 电机驱动与执行机构驱动芯片选用东芝TB6612FNG其关键特性与本项目匹配点如下双H桥结构可独立驱动两个直流电机本项目仅使用CH A通道IN1/IN2/PWMA/OUT1/OUT2逻辑电平兼容VM12V时VCC5V即可可靠驱动与MP1584EN输出完美匹配内置续流二极管与过热关断简化外围电路提升可靠性最大持续电流1.2ATa25℃JGB37-520空载电流100mA堵转电流≈1.8A短时留有安全余量电机选型JGB37-520为12V直流减速电机标称转速520rpm空载减速比1:36配备双霍尔元件输出正交方波A/B相周期对应1转。其机械时间常数约80ms电气时间常数约5ms属于典型的机电惯性系统非常适合PID教学——响应足够慢以便观察又足够快以体现控制效果。TB6612与MCU连接关系如下PWMA←→ MSPM0G3507 PWM0A占空比调制AIN1←→ GPIO P1.5高电平有效正转AIN2←→ GPIO P1.4高电平有效反转STBY←→ GPIO P1.3高电平使能上电默认拉高关键设计细节STBY引脚未使用外部上拉而是由MCU初始化为推挽输出并置高。此举避免上电瞬间驱动芯片误动作同时便于软件实现“软启停”——停机时先置PWMA0再拉低STBY彻底切断电机能量通路。2.5 反馈传感霍尔编码器接口JGB37-520编码器输出为开漏Open-Drain结构A/B两相信号需外接上拉电阻至5V。原理图中采用10kΩ贴片电阻R13/R14符合以下考量上拉阻值过大如100kΩ上升沿缓慢高速时波形畸变CAPT模块可能漏捕边沿上拉阻值过小如1kΩ静态电流达5mA/相增加功耗且无必要10kΩ在编码器最高输出频率≈5kHz对应520rpm×36 18720脉冲/分钟 ≈ 312Hz下上升时间τRC≈10k×10pF0.1μs远小于信号周期3.2μs波形质量优异信号路径中未添加RC低通滤波因霍尔传感器本身具有较强抗干扰能力且CAPT模块内置数字滤波可配置4~16个时钟周期滤波足以抑制开关噪声。实测在电机满载启停瞬间编码器计数无丢步、无误增。2.6 人机交互TFT显示屏与按键2.6.1 TFT显示子系统1.8英寸TFT模组ST7735S控制器采用SPI四线制SCLK/MOSI/DC/CS/RES分辨率为128×160。其与MSPM0G3507连接关系如下TFT引脚MCU引脚功能说明SCLP0.6SPI时钟4MHzSDAP0.7SPI MOSIDCP1.2数据/命令选择高数据低命令CSP1.1片选低有效RESP1.0复位低电平有效显示内容分为上下两区域上区域128×80双色实时波形图绿色曲线当前速度/位置归一化至0–127红色曲线目标速度/位置同归一化X轴为时间轴每帧刷新代表100msY轴为数值轴下区域128×80文本信息区第一行当前模式SPEED / DISTANCE第二行Kp / Ki / Kd 参数值三位小数第三行当前值CV与目标值SV第四行控制输出OP0–100%波形绘制采用增量式刷新策略每帧仅更新最右侧一列像素左侧127列数据缓存于RAM避免全屏重绘导致的闪烁与延迟。2.6.2 按键输入子系统五个独立按键UP/DOWN/LEFT/RIGHT/STOP均采用上拉输入设计未使用外部中断而采用10ms定时扫描方式。按键状态判定流程如下// 伪代码按键扫描核心逻辑 static uint8_t key_state[5] {0}; // 0释放1按下2长按 static uint16_t key_press_cnt[5] {0}; void Key_Scan(void) { uint8_t read_val (~GPIO_ReadPort(P1)) 0x1F; // 读取P1.0–P1.4低电平有效 for(uint8_t i0; i5; i) { if(read_val (1i)) { if(key_state[i] 0) { key_state[i] 1; // 刚按下 key_press_cnt[i] 0; } else if(key_state[i] 1) { key_press_cnt[i]; if(key_press_cnt[i] 50) { // 500ms key_state[i] 2; // 长按 key_press_cnt[i] 0; } } } else { key_state[i] 0; // 释放 } } }此设计兼顾了响应速度短按10ms内识别与抗抖动能力需连续5次采样确认且长按功能用于快速参数调节如Kp每次±0.5提升操作效率。3. 软件系统设计3.1 主程序框架系统采用前后台架构Foreground-Background无RTOS主循环Background负责显示刷新与按键响应定时中断Foreground承担核心控制任务SysTick中断100Hz执行PID计算、编码器计数读取、PWM占空比更新CAPT溢出中断可选当计数值超32位时触发本项目因电机最高速度对应计数率远低于溢出阈值故未启用主循环while(1)调用LCD_Refresh()、Key_Handler()、Mode_Display()等非实时函数该架构简洁可靠避免了多任务调度开销符合入门项目定位。3.2 PID控制算法实现本项目实现位置式PIDPosition Form与增量式PIDIncremental Form双模式由按键切换定距模式DISTANCE采用位置式PID直接输出目标脉冲数对应的PWM占空比定速模式SPEED采用增量式PID对速度误差微分项敏感抗扰动能力强3.2.1 位置式PID定距模式// 定距模式控制目标为总脉冲数距离 int32_t error target_pulse - current_pulse; // 位置误差 int32_t p_out (int32_t)(kp * error); int32_t i_out i_sum (int32_t)(ki * error); int32_t d_out (int32_t)(kd * (error - last_error)); // 抗积分饱和i_sum限制在[-10000, 10000] if(i_out 10000) i_out 10000; else if(i_out -10000) i_out -10000; int32_t output p_out i_out d_out; last_error error; i_sum i_out; // 输出限幅映射至0–100% if(output 10000) output 10000; else if(output -10000) output -10000; pwm_duty (uint16_t)((output 10000) / 200); // 0–10000 → 0–1003.2.2 增量式PID定速模式// 定速模式控制目标为RPM需将编码器计数转换为速度 // 每100ms采样一次计数差值即为速度脉冲/100ms int32_t speed_now (current_count - last_count) * 10; // 转换为 脉冲/秒 int32_t error target_rpm - speed_now; int32_t delta_p (int32_t)(kp * (error - last_error)); int32_t delta_i (int32_t)(ki * error); int32_t delta_d (int32_t)(kd * (error - 2*last_error last_last_error)); int32_t delta_output delta_p delta_i delta_d; output delta_output; // 累加输出 // 输出限幅 if(output 10000) output 10000; else if(output -10000) output -10000; pwm_duty (uint16_t)((output 10000) / 200); last_last_error last_error; last_error error; last_count current_count;关键参数说明kp/ki/kd为浮点型变量存储于RAM按键可修改范围Kp∈[0.1, 5.0], Ki∈[0.001, 0.1], Kd∈[0.01, 1.0]所有中间计算使用int32_t避免浮点运算开销MSPM0G3507无FPUki系数已隐含采样周期T0.1s即实际Ki_calc Ki_user × T3.3 显示驱动与波形绘制TFT驱动基于ST7735S初始化序列关键步骤包括软件复位0x01设置行列地址0x2A/0x2B设置内存访问控制0x36RGB顺序BGR0设置像素格式0x3A16bit RGB565开启显示0x29波形绘制采用环形缓冲区Ring Buffer技术#define WAVE_WIDTH 128 uint8_t wave_cv[WAVE_WIDTH]; // 当前值波形绿 uint8_t wave_sv[WAVE_WIDTH]; // 目标值波形红 uint8_t wave_idx 0; // 当前写入索引 void Wave_Update(int16_t cv, int16_t sv) { // 归一化0–127 uint8_t y_cv (cv 0) ? 0 : (cv 127) ? 127 : cv; uint8_t y_sv (sv 0) ? 0 : (sv 127) ? 127 : sv; wave_cv[wave_idx] y_cv; wave_sv[wave_idx] y_sv; wave_idx (wave_idx 1) % WAVE_WIDTH; } void LCD_Draw_Wave(void) { for(uint8_t x0; xWAVE_WIDTH; x) { uint8_t y1 wave_cv[x]; uint8_t y2 wave_sv[x]; // 绘制垂直线段从y1到y2 if(y1 y2) { LCD_Draw_VLine(x, y2, y1-y21, RED); LCD_Draw_Pixel(x, y1, GREEN); } else { LCD_Draw_VLine(x, y1, y2-y11, GREEN); LCD_Draw_Pixel(x, y2, RED); } } }此方案内存占用仅256字节刷新一帧波形耗时8msSPI 4MHz完全满足100Hz控制周期要求。4. BOM清单与器件选型依据序号器件名称型号/规格数量选型依据备注1主控芯片TI MSPM0G35071Cortex-M0内核集成CAPT正交解码成本低资料完善“天猛星”开发板已集成2DC/DC降压模块MP1584EN固定5V版1输入4.5–28V输出5V/1.5A效率90%价格低廉必须按丝印方向焊接反接即损坏3电机驱动TB6612FNG1双H桥逻辑电平兼容5V内置保护封装SOIC-16易焊接钽电容朝上插入丝印标识4直流减速电机JGB37-520带霍尔编码器112V520rpm空载36:1减速A/B相正交输出仅焊“电机2”接口焊“电机1”会导致TFT白屏电源冲突5TFT显示屏1.8 ST7735S128×1601SPI接口RGB565自带背光驱动IC成熟需匹配8-bit并口或SPI本项目选SPI节省IO6按键独立轻触开关6×6×5mm5行程清晰寿命10万次成本0.1元/颗上拉至5VMCU读取低电平7LED指示灯Φ3mm绿色LED1发光波长525nm视角120°VF2.1V串联1kΩ电阻电流4.3mA8电源接口DC-0055.5×2.1mm1标准12V输入接口接触可靠与12V焊盘并联提供双输入路径5. 调试与参数整定指南5.1 基础功能验证流程上电检查绿色LED亮起TFT显示初始化画面若白屏检查“电机2”接口是否误焊编码器测试手动旋转电机轴观察TFT下区域“CV”值是否变化确认CAPT模块正常工作PWM输出验证用万用表直流档测量TB6612的OUT1/OUT2间电压应随按键调节呈0–12V线性变化按键响应按“STOP”应立即停机“UP/DOWN”在参数设置界面可增减数值5.2 PID参数整定步骤Ziegler-Nichols临界比例度法设置Ki0, Kd0逐步增大Kp直至系统出现等幅振荡临界稳定记录此时Kp值记为Ku与振荡周期Tu单位秒按公式计算初始参数定速模式增量式Kp 0.6×Ku, Ki 1.2×Ku/Tu, Kd 0.075×Ku×Tu定距模式位置式Kp 0.5×Ku, Ki 0.4×Ku/Tu, Kd 0.125×Ku×Tu微调优化超调过大 → 减小Kp或增大Kd响应过慢 → 增大Kp或Ki稳态误差 → 增大Ki但需注意积分饱和实测JGB37-520在定速模式下Ku≈2.8Tu≈0.8s推荐初始值Kp1.68, Ki4.2, Kd0.17。用户可通过“左/右”键切换参数项“上/下”键修改数值实时观察波形变化。6. 典型问题与解决方案现象可能原因解决方法TFT白屏误将电机线焊至“电机1”接口导致5V与12V短路断电拆除错误焊点仅使用“电机2”接口电机不转TB6612STBY引脚未置高或AIN1/AIN2电平错误用万用表测STBY是否为5V检查AIN1/AIN2是否一高一低编码器计数卡死霍尔信号上拉电阻虚焊或CAPT引脚配置错误检查R13/R14焊接确认P0.2/P0.3配置为CAPT_C0/C1波形抖动严重电机供电与逻辑供电未隔离或编码器信号受干扰确保TB6612的VM直接接12V电池而非MP1584EN输出按键失灵上拉电阻脱焊或GPIO初始化为浮空输入检查P1.0–P1.4是否配置为上拉输入模式本项目所有设计决策均服务于一个核心目标让初学者在最小认知负荷下亲手触摸PID控制的每一个物理环节。从拧紧一颗螺丝固定电机到阅读寄存器手册配置CAPT模块从手写一行PID计算代码到在屏幕上亲眼见证曲线收敛——这种“全栈式”实践体验远胜于任何仿真软件中的理想波形。当电机第一次平稳地停在目标位置示波器探头夹在PWMA引脚上看到干净的20kHz方波TFT屏幕中绿色曲线紧紧跟随红色目标线起伏……那一刻控制理论便不再是纸上的微分方程而成为指尖可感、耳畔可闻、眼前可见的鲜活现实。