1. 项目概述在工业自动化、精密仪器和机器人领域让一个电机无论是伺服电机还是步进电机精准、平滑地运动到指定位置从来都不是一件简单的事。这背后涉及到复杂的数学计算和实时控制传统上需要工程师用高性能的微控制器编写大量底层代码来实现PID算法和轨迹规划。而三十多年前当德州仪器TI推出LM628和LM629这两颗芯片时它们为工程师提供了一种“开箱即用”的硬件解决方案将运动控制的核心——数字PID滤波器和梯形速度轨迹生成器——集成在了一颗专用的处理器里。即使到今天理解这颗经典芯片的工作原理对于深入掌握运动控制的底层逻辑乃至设计现代基于FPGA或高性能MCU的运动控制器都有着极高的参考价值。本文就将深入拆解LM628/629的内部架构、PID滤波器的实现奥秘以及轨迹生成的核心算法并结合实际调参经验让你不仅能看懂数据手册更能真正用好它。2. 芯片架构与核心模块解析LM628和LM629可以看作是为运动控制量身定制的“协处理器”。它们独立于主控MCU运行接管了最耗费计算资源的实时控制任务让主控可以专注于更高层的逻辑和通信。2.1 整体硬件架构与数据流芯片的核心是一个专为控制算法优化的微程序控制器。其内部ROM存储了固定的控制算法指令通过一个可编程逻辑阵列PLA进行解码和执行。整个数据通路围绕一个32位的算术逻辑单元ALU和一系列32位寄存器构建以满足高动态范围和计算精度的要求。数据流是理解其工作的关键轨迹生成主控MCU通过8位数据总线向芯片的轨迹轮廓生成器写入目标位置、目标速度和加速度。生成器在每个采样周期例如256微秒计算出一个新的“期望位置”。位置反馈电机轴上安装的正交编码器A、B两相可能还有索引Z信号实时输出脉冲。芯片内部的位置解码器对这两路相位差90度的信号进行4倍频解码和方向判断驱动一个16位可逆计数器从而获得高分辨率的“实际位置”。误差计算在每个采样周期开始时一个同步脉冲Sync锁存当前16位计数器的值并将其累加到内部的32位实际位置寄存器中。随后该实际位置值与轨迹生成器计算出的期望位置在求和节点相减得到“位置误差”。PID滤波与输出位置误差送入数字PID滤波器。滤波器根据预设的比例Kp、积分Ki、微分Kd系数进行计算输出一个控制量。LM628将该控制量以8位或12位数字形式输出给外部DAC进而驱动功率放大器LM629则直接生成一个带符号的7位PWM脉宽调制信号可直接驱动H桥电路。这个闭环过程以最高3.9 kHz8MHz时钟版本的频率周而复始实现了对电机位置的实时、高精度控制。2.2 正交编码器解码原理与陷阱位置解码是运动控制的“眼睛”。LM628/629的编码器接口支持标准的正交增量式编码器。其解码逻辑不仅计数脉冲还通过判断A、B相的相对相位关系来确定方向从而实现4倍频。例如一个250线的编码器经过4倍频后每转可获得1000个计数大大提升了位置分辨率。这里有几个实操中必须注意的细节最大跟踪速度芯片解码每个编码器状态需要至少8个时钟周期。对于8MHz时钟的型号最高解码频率为1MHz。这意味着对于上述250线1000计数/转的编码器电机最高转速不能超过1,000,000 计数/秒 / 1000 计数/转 1000 转/秒即60,000 RPM。这在绝大多数工业场景下是绰绰有余的但在一些超高速主轴应用中需要核算。信号质量芯片内部只有简单的边沿同步逻辑没有内置数字滤波器。这意味着如果编码器信号线受到严重噪声干扰例如与电机动力线并行走线可能会产生误计数导致位置漂移或控制失稳。因此布线时必须将编码器信号线双绞、采用屏蔽电缆并尽可能远离噪声源。索引信号Index的使用索引信号每转出现一次用于确定机械零位。芯片会在A、B、Index三线同时为低电平时锁存当前位置值。这个功能对于上电后寻找“回家”位置Homing至关重要。在初始化流程中通常会让电机缓慢向一个方向运动直到触发Index信号然后将该点设为零位。2.3 输出接口LM628的DAC与LM629的PWM这是两款芯片的主要区别也决定了它们驱动后级电路的方式。LM628 - 数字到模拟转换DAC输出模式复位后默认为8位输出模式。通过发送PORT12命令可切换为12位模式。时序在12位模式下输出数据分时复用。低6位LSBs和高6位MSBs分两次出现在同一组引脚上并通过一个专用引脚24脚的电平来指示当前是低字节还是高字节。用户需要利用芯片提供的选通信号25脚低有效的上升沿将这两个6位数据锁存到外部的12位锁存器中再送给DAC。这是一个容易出错的硬件连接点如果锁存时序不对DAC会收到错误的数据导致电机抖动或失控。编码格式输出为偏移二进制码。零点对应数字量0x80012位或0x808位。这意味着当控制量为零时DAC应输出中间电压通常是0V或Vref/2对应电机零扭矩。LM629 - 脉宽调制PWM输出输出直接提供两路信号SIGN方向和MAGNITUDE幅值即PWM占空比。优势PWM方式非常适合直接驱动MOSFET或集成H桥驱动器如LM18293效率高无需外部DAC简化了电路。细节其PWM频率是采样频率的4倍。在8MHz时钟、3.9 kHz采样率下PWM频率约为15.6 kHz。这个频率需要权衡频率太低电机噪音大音频范围内频率太高开关损耗增加。15.6kHz是一个折中的选择通常已超出人耳听觉范围。死区时间芯片本身不产生死区时间。当使用H桥驱动时必须在外部硬件或驱动芯片中配置死区时间以防止上下桥臂直通烧毁功率管。这是使用LM629时电路设计的关键。3. 梯形速度轨迹生成器深度剖析轨迹生成器是运动控制的“大脑”它规划了电机从起点到终点的整个运动过程核心是生成一条平滑的速度-时间曲线。3.1 梯形速度曲线与参数解析LM628/629生成的是最经典、应用最广的梯形速度曲线。这条曲线分为三段匀加速段、匀速段、匀减速段减速度绝对值等于加速度。加速度决定了电机启动/停止的“急促”程度。加速度越大系统能更快达到目标速度但对机械结构的冲击也越大也可能超出电机和驱动器的扭矩能力。目标速度运动过程中达到的最高速度。目标位置整个运动过程需要走过的总位置增量计数。芯片内部的计算逻辑是它会在加速过程中实时计算已经走过的位移。当“剩余距离刚好够以当前减速度减速到零”时就会自动触发减速段开始。这意味着如果目标位置很近可能来不及加速到预设的目标速度就会直接进入减速段整个速度曲线会变成一个三角形。3.2 核心寄存器位置、速度、加速度的表示与计算理解芯片内部的数值表示是进行精确控制的基础。所有参数都以“计数”和“采样间隔”为单位。位置32位有符号整数。最高位MSB为符号位第30位是“环绕”标志位用于检测32位溢出剩余30位提供了高达±10.7亿计数的动态范围。速度32位无符号数但被解释为整数部分.小数部分的定点数。高16位是整数部分0-65535 counts/sample低16位是小数部分分辨率1/65536。这允许速度可以远小于1个计数每采样周期。例如速度值0x00010000表示1.0counts/sample而0x00008000表示0.5counts/sample。加速度同样为32位无符号定点数单位是 counts/sample²。其格式与速度寄存器相同。计算过程在每个采样周期算法执行以下操作如果处于加速/减速段则将加速度寄存器值加到速度寄存器。将速度寄存器值加到位置寄存器这是一个48位的加法32位整数位置 16位分数位置。位置寄存器的整数部分输出给求和节点与反馈的实际位置比较。分数位置的重要性假设使用8MHz时钟采样周期256μs和1000线/转的编码器4000计数/转。如果没有分数部分最小速度就是1 count/256μs约等于15.6转/秒936 RPM。这对于需要极低速平稳运行的应用如显微镜载物台是不可接受的。分数位置允许速度以极精细的步进变化是实现平滑低速运动的关键。3.3 速度模式与位置模式的区别位置模式这是主要工作模式。给定目标位置、速度、加速度后芯片自动完成从起点到终点的整个梯形轨迹规划并在到达目标位置后停止。速度模式此模式下目标位置被忽略。芯片会持续以设定的速度和加速度运行直到收到停止命令。这里有一个巨大的隐患在速度模式下轨迹生成器会不断累加“期望位置”。如果电机因故卡住堵转实际位置停滞不前但期望位置仍在飞速增长误差会急剧累积。一旦堵转解除PID控制器会试图以巨大的控制输出让电机“追上”这个巨大的期望位置差可能导致电机飞车或机械冲击。因此在速度模式下外部必须要有可靠的堵转检测和急停逻辑。4. 数字PID滤波器从理论到芯片实现PID是运动控制的心脏LM628/629将其数字化并固化在硬件中。4.1 离散PID算法在芯片中的实现芯片实现的是位置式PID算法。其差分方程可以简化为输出(n) Kp * 误差(n) Ki * 积分和(n) Kd * [误差(n) - 误差(n-1)]其中误差(n)是当前采样周期的位置误差。比例项 Kp直接放大当前误差。增大Kp能减小稳态误差提高系统刚度但过大会引起振荡。积分项 Ki累积历史误差用于消除稳态误差如恒速运行时的速度滞后、恒定负载下的位置偏差。但积分环节会引入相位滞后过量会导致系统响应变慢、超调增大甚至不稳定。微分项 Kd预测误差变化趋势提供阻尼抑制超调和振荡。它对噪声非常敏感。芯片的独特之处在于其系数缩放。数据手册和AN-706应用笔记中给出了从连续域S传递函数到离散域Z传递函数的转换公式以及芯片内部的定点数缩放因子。简单来说用户写入的Kp、Ki、Kd值并不是直接的增益系数而是需要根据采样周期和内部数据格式进行换算的整数。4.2 PID系数整定实战步骤与心得调参是PID控制的艺术。对于LM628/629建议遵循以下步骤安全检查与相位确认将所有PID系数Kp Ki Kd和积分限幅IL设为0。设置一个极小的Kp值例如Kp 1。发送STT命令启动闭环。此时电机应被微弱地“吸”在零位附近。关键操作用手轻轻转动电机轴然后松开。如果系统是稳定的电机应缓慢回到原位。如果电机反而加速向一个方向转动说明反馈极性反了即正反馈。必须立即切断电机驱动电源然后交换电机驱动器的方向信号或编码器A、B相接线。这是调试的第一步也是最重要的一步错误的相位会导致剧烈振荡损坏机械。初步建立刚度确认相位正确后逐步增大Kp例如每次增加5-10直到用手感觉电机轴有明显的“刚度”即难以转动且松开后能快速回到原位。观察电机是否有高频抖动或持续振荡。如果有说明Kp过大已接近系统固有频率需要略微降低。引入微分阻尼在现有Kp下系统可能仍有轻微振荡或过冲。此时逐步加入Kd。Kd的效果立竿见影能有效抑制超调。通常Kd的数值范围可能与Kp在同一数量级或略小。一边微调Kd一边用主控MCU读取实际位置发送一个小的位置阶跃如1000 counts观察位置响应曲线是否变得平滑且快速。引入积分消除静差在位置模式让电机执行一个长距离移动。到达目标后观察实际位置是否稳定在目标值。由于摩擦等因素可能有一个很小的静态误差。设置一个积分限幅IL例如1000然后加入一个很小的Ki值例如0.1。积分的作用是缓慢累积误差来修正输出。Ki太大会导致系统不稳定或在停止时产生低频抖动。务必谨慎调整Ki。动态测试与优化使用不同的速度、加速度和负载进行测试。利用芯片的“数据报告命令”如RDPOSRDVEL实时读取期望位置和实际位置绘制跟踪误差曲线。理想的响应是“临界阻尼”状态快速到达目标且无超调。如果响应慢可适当增加Kp如果有超调增加Kd如果到达终点后有稳态误差微调Ki。实操心得调参时优先保证稳定性再追求性能。一个轻微过阻尼响应稍慢但绝无超调的系统通常比一个临界阻尼但边界不稳定的系统更可靠。另外负载的惯量变化会极大影响PID参数。如果负载惯量会变如机械臂拾取不同工件可能需要准备多组PID参数并在负载变化时通过主机动态更新LM628/629的滤波器系数。4.3 “忙”位Busy Bit机制与可靠通信LM628/629与主控MCU通过一个8位双向数据端口和若干控制线通信。其中最关键的是“忙”位状态字节的Bit 0。工作原理每当主机发送一个命令字节或一对数据字节芯片内部的微码需要时间来处理这些指令。在此期间它会将“忙”位置1。主机在发送下一个字节无论是命令还是数据之前必须读取状态字节并检查“忙”位是否为0。为什么必须遵守如果在“忙”位为1时强行写入命令会被忽略强行读取得到的是无效数据。这会导致参数加载错误进而引发不可预知的运动。时序考量芯片的采样周期是固定的如256μs其中滤波计算、轨迹计算、输出更新会占用大部分时间。频繁地打断这些计算进行通信可能会导致控制环路计算超时引发错误。因此主机程序应优化通信策略例如只在非实时关键阶段如运动开始前设置参数进行大量数据写入在运动过程中仅进行必要的最小查询。5. 命令集详解与软件框架实现与LM628/629的交互全部通过一系列单字节命令及其附属数据完成。5.1 核心命令流程以启动一次运动为例一个典型的位置模式运动流程如下复位与初始化硬件复位或发送RESET命令。如果使用LM628且需要12位DAC输出紧接着发送PORT12命令。加载PID参数等待“忙”位为0。发送LFIL命令加载滤波器。发送滤波器控制字指定加载哪些系数。依次发送Kp Ki Kd IL的32位数据每个系数分两个16位字先高后低。每发送一对16位数据前都需检查“忙”位。加载轨迹参数等待“忙”位为0。发送LTRJ命令加载轨迹。发送轨迹控制字。这是关键一步需要按位设置。例如要加载绝对位置、绝对速度、绝对加速度则控制字应为0x0027二进制位51加载加速度位31加载速度位11加载位置。依次发送加速度、速度、位置的32位数据。同样每对数据前检查“忙”位。启动运动等待“忙”位为0。发送STT命令。此命令会将步骤2和3中加载到“缓冲寄存器”的参数一次性传递到“工作寄存器”运动立即开始。5.2 轨迹控制字的位操作精讲轨迹控制字16位的每一位都至关重要错误设置会导致运动异常。位0-位5参数加载与模式这是最常用的部分。位11表示加载位置数据位01表示该位置数据是相对于当前位置的增量相对移动位00表示是绝对位置。速度和加速度位同理。位8-位10停止命令特别注意这些位仅在LTRJ命令中与轨迹参数同时设置时才生效用于紧急停止。它们不是独立的停止命令。位81立即关闭电机输出零扭矩。电机自由滑行停止。位91以最大减速度紧急停止。芯片会瞬间将目标位置设为当前位置并开始减速。位101以当前用户设定的加速度值平滑停止。位11-位12速度模式位111使能速度模式位12决定初始方向。一个常见的错误是想在运动过程中暂停于是发送了一个带有位91的LTRJ命令但没有同时提供有效的加速度、速度数据即位5和位3为0。这样操作可能无法达到预期效果。更可靠的做法是在需要停止时发送单独的STT命令其本身会使用已加载的轨迹参数完成停止或者通过主机计算一个新的、当前位置附近的目标位置再发起一次新的LTRJSTT来实现“跳转”停止。5.3 在线参数更新与双缓冲机制这是LM628/629的高级特性能实现更复杂的运动控制。双缓冲当使用LFIL或LTRJ命令时数据首先被写入一组“影子寄存器”缓冲寄存器。只有当STT命令执行时这些数据才会被复制到真正参与计算的“工作寄存器”。在线更新利用双缓冲可以在电机当前运动尚未结束时就为下一段运动提前准备好参数位置、速度、新的PID系数。在当前运动结束的瞬间发送STT即可无缝切换到新的运动状态实现连续轨迹如多段S曲线或根据负载变化自适应调整PID。加速度更新的限制一个重要的约束加速度参数不能在运动过程中通过STT命令更新。如果尝试这样做芯片会产生一个命令错误中断。正确的方法是先发送一个带位81关闭电机的LTRJ命令和STT命令让电机停止输出然后再加载新的加速度参数并启动。6. 系统设计要点与常见故障排查基于LM628/629构建一个稳定可靠的系统硬件和软件都需要精心设计。6.1 硬件设计注意事项电源与去耦数字部分和模拟部分如果使用LM628DAC的电源要分开并尽可能靠近芯片电源引脚放置高质量的瓷片电容如100nF进行高频去耦同时并联一个电解电容如10μF进行低频滤波。编码器接口如前所述编码器信号线必须采用屏蔽双绞线。可以在信号进入芯片前增加一个RC低通滤波器如100Ω 1nF以滤除高频噪声但需注意RC时间常数不能影响对最高频率信号的响应。时钟信号外部提供的时钟CLK需稳定、干净。时钟抖动会影响采样周期的精度进而影响控制性能。LM629的PWM输出驱动SIGN和MAGNITUDE输出通常需要经过缓冲器如74HC14再驱动H桥的隔离光耦或驱动器输入以提高驱动能力和抗干扰性。务必确保H桥驱动器已正确配置死区时间。6.2 软件框架与状态管理一个健壮的主机软件应该包含以下状态机初始化状态配置I/O口复位芯片加载初始PID参数。空闲状态等待用户指令或上位机命令。参数设置状态接收新的目标位置、速度、PID参数等。运动执行状态发送LTRJ和STT命令并周期性读取状态字节检查“错误中断”、“到位中断”、“索引中断”等标志。错误处理状态一旦检测到错误中断状态字节Bit 7立即读取错误寄存器根据错误类型命令错误、轨迹错误等进行相应处理如紧急停止、报警。6.3 常见问题与排查指南下表列出了调试过程中最常见的问题及排查思路现象可能原因排查步骤电机上电后啸叫或剧烈振荡1. 反馈极性错误正反馈2. PID参数Kp过大3. 编码器信号噪声大导致位置反馈跳变1. 检查电机相序/编码器A、B相接线用极小的Kp测试相位。2. 大幅降低Kp值。3. 用示波器观察编码器信号质量检查接地和屏蔽。电机运动时抖动、不平滑1. 机械传动部件间隙大背隙2. 微分增益Kd设置不当可能过大引入噪声3. 电源功率不足或电压波动4. PWM频率处于机械共振点1. 检查联轴器、丝杠等机械连接。2. 尝试降低Kd或在前端对误差信号进行低通滤波需在主机端实现。3. 监测电机驱动电源电压。4. 对于LM629可尝试改变时钟频率以微调PWM频率。电机无法到达指定位置存在固定偏差1. 积分增益Ki为0或太小无法克服静摩擦力2. 电机扭矩不足带不动负载3. 控制输出已饱和达到DAC或PWM极限1. 适当增加Ki和积分限幅IL。2. 检查电机选型增大驱动电流。3. 读取实际误差检查PID输出是否已到极限值。高速运行时丢步或位置漂移1. 编码器计数频率超过芯片1MHz上限2. 主机通信过于频繁打断了控制计算3. 运动轨迹的加速度设定超出电机/驱动器能力1. 计算最高转速时的编码器频率确保低于1MHz。2. 优化主机代码减少在运动过程中的查询操作。3. 降低加速度设定值观察是否改善。LM628 DAC输出异常电机乱转1. 12位模式下的分时复用锁存时序错误2. DAC参考电压或运放电路有问题3. 偏移二进制码零点未校准1. 用逻辑分析仪检查D0-D5、A0字节选择、/STROBE的时序是否符合图7要求。2. 测量DAC输出端电压是否随控制量线性变化。3. 确认当控制量为0时DAC输出应为中间电压Vref/2。6.4 超越梯形实现S型曲线的思路LM628/629硬件只支持梯形速度曲线其加速度是阶跃变化的这会在启动和停止瞬间产生冲击加加速度无穷大。对于高端应用需要更平滑的S型曲线加速度连续变化。虽然芯片硬件不支持但可以通过主机MCU进行“模拟”将一段长的S型曲线离散成许多段小的梯形曲线。主机MCU实时计算下一小段的目标位置和速度。利用LM628/629在线更新速度、位置不能在线更新加速度的特性在当前段运动结束前提前将下一小段的参数通过LTRJ命令写入影子寄存器。在精确的时刻发送STT命令切换到新的小段运动。 通过足够高的分段频率可以近似实现平滑的S型曲线规划。这需要主机MCU有较强的实时计算能力和精准的定时但展示了如何利用芯片的基础功能构建更复杂的控制系统。