PFS173闭环电机控制器开发:编码器反馈、PID位置环与SPI通信
一颗低成本应广单片机,能否完成编码器计数、位置闭环、PWM调速和上位机通信?本文不只回答“能不能”,还把硬件边界、PID整定、失控保护、调试顺序和量产验证拆成可执行的工程步骤。
PFS173可以实现单轴直流电机的基础闭环位置控制:PFS173读取增量式编码器A/B相、计算位置误差、执行PID算法并输出PWM与方向信号;电机电流必须由外部H桥驱动器承担。这个方案适合功能固定、成本敏感的单轴执行器,但在量产前必须验证最大编码器边沿频率、定位误差、堵转保护、温升、EMI以及PFS173的供货生命周期。
PFS173闭环电机控制器解决什么问题?
开环控制只规定电机“以多大功率、向哪个方向转”,却不知道负载变化后是否真正到达目标位置。闭环控制增加编码器反馈,把“命令”变成“可测量、可纠偏、可停止”的控制过程。
- 接收目标位置或位移命令
- 读取编码器A/B相状态
- 累加或递减当前位置
- 计算目标与当前位置误差
- PID生成控制输出
- 转换为方向与PWM占空比
- 异常时停机并上报故障
因此,真正的开发重点不只是“让电机转起来”,而是让控制器在反转、负载突变、通信占用、堵转和掉电重启时仍保持可预测行为。
公开项目实际实现了哪些功能?
公开的PFS173 MotorController项目使用带光电编码器的喷墨打印机直流电机,完成了一个可由外部主控下发目标位置的闭环控制器。项目说明与公开代码仓库可以证明以下功能路径具备可行性:
- 读取增量式编码器A/B相并判断方向;
- 维护当前位置计数,支持相对位置与绝对位置命令;
- 执行位置PID并输出PWM和方向信号;
- 通过软件SPI与Arduino Uno通信;
- 使用MAX14870一类外部驱动器承担电机功率输出。
系统由哪些硬件模块组成?
| 模块 | 主要任务 | 设计时必须确认 |
|---|---|---|
| PFS173 | 编码器计数、控制周期、PID、PWM、通信和状态管理 | 边沿处理能力、程序与RAM余量、引脚复用、定时器资源 |
| 直流电机 | 执行旋转或位移动作 | 额定电压、启动电流、堵转电流、机械惯量 |
| 增量式编码器 | 提供位置增量和方向信息 | 供电电压、输出类型、每转脉冲数、最高边沿频率 |
| 外部H桥 | 放大PWM与方向信号,驱动电机电流 | 峰值电流、续流路径、过温/过流保护、逻辑电平 |
| 上位主控 | 下发目标位置、模式和限幅,读取状态 | 协议、超时、校验、故障恢复 |
| 测试设备 | 观察A/B相、PWM、电流和控制周期 | 示波器、逻辑分析仪、限流电源、电流探头 |
PFS173不能直接驱动直流电机。 MCU引脚只负责逻辑控制。若把电机直接接到IO口,启动电流、反电动势和感性尖峰都可能造成复位、计数错误甚至器件损坏。
如何识别未知电机的编码器接口?
拆机电机最容易出现的错误,是凭线色猜测电源和信号。正确方法应先测量,再接入PFS173:
- 断开原功率输出,确认电机端与编码器端没有共用未知高压节点;
- 沿PCB走线或用万用表通断档寻找编码器地线与电源线;
- 使用限流电源从低电压开始供电,观察静态电流是否异常;
- 手动缓慢转动电机轴,用示波器同时观察两个候选信号;
- 确认两路波形是否近似方波,并存在约90°相位差;
- 交换旋转方向,验证A/B领先关系是否反转;
- 测量高电平是否兼容PFS173输入,必要时增加分压、限流或电平转换;
- 确认无过压与负压后,再连接MCU并进行低速计数测试。
PFS173如何判断位置和方向?
增量式编码器的A、B两路信号相位相差约四分之一周期。A领先B表示一个方向,B领先A表示相反方向。程序在状态变化时比较“上一状态”和“当前状态”,据此让位置计数加一或减一。
工程中还要处理计数溢出、毛刺、漏计数、快速反转、齿轮间隙和掉电后位置丢失。只有把这些边界写进状态机,位置值才不只是“能变化”,而是可以用于闭环控制。
怎样判断编码器处理能力是否足够?
不要只看电机转速,还要把编码器分辨率和解码倍频一起计算:
测试必须在最高转速下同时开启PID、软件SPI和故障判断,再与低速人工计数或外部计数器比较。若通信一忙就出现位置漂移,问题通常不是PID,而是编码器服务优先级或临界区过长。
PID位置环如何控制电机?
- Kp:误差越大,推动电机越强;过大容易振荡。
- Ki:消除持续的静差;过大容易积分饱和和回弹。
- Kd:根据误差变化提前制动;过大可能放大编码器噪声。
参数不能从其他项目直接复制。电机惯量、减速比、负载、供电、电流限制、机械间隙和控制周期任一变化,最佳参数都会改变。
建议采用什么PID整定顺序?
- 先限制最大PWM,并关闭积分与微分;
- 从较小Kp开始,确认方向正确且系统能够靠近目标;
- 逐步提高Kp,直到响应足够快但尚未持续振荡;
- 加入少量Kd抑制过冲和目标附近摆动;
- 最后加入Ki消除稳态误差,并设置积分限幅;
- 根据齿隙与编码器分辨率设置合理死区,避免反复微动;
- 在空载、额定负载、低电压、高低温和堵转恢复条件下复测。
相对位置和绝对位置模式有什么区别?
相对位置
以当前位置为起点移动指定计数,适合送料、点动和重复位移。它不要求系统知道机械零点,但累计误差仍需控制。
绝对位置
移动到统一坐标系中的指定位置,适合阀门、滑台和转台。增量式编码器掉电后会丢失位置,因此必须回零或保存并校验位置。
PFS173没有硬件SPI怎么办?
公开项目使用软件SPI完成与Arduino Uno的通信。软件SPI能够满足低速、短帧、低占空比通信,但它会占用CPU时间。如果在收发期间长时间关闭中断或执行阻塞等待,可能错过编码器边沿或延迟控制周期。
| 字段 | 用途 | 建议 |
|---|---|---|
| 帧头 | 识别有效数据起点 | 选用不易与数据混淆的固定值 |
| 命令 | 位置、停止、回零、读取状态 | 保留版本和扩展空间 |
| 模式 | 相对/绝对、制动/滑行 | 非法组合必须拒绝执行 |
| 目标位置 | 期望计数或位移 | 定义字节序、范围和符号 |
| 输出限幅 | 限制PWM或速度 | 上电使用保守默认值 |
| 状态 | 到位、运行、超时、堵转、编码器故障 | 状态应可锁存与清除 |
| 校验 | 发现传输错误 | 至少使用校验和或CRC |
软件结构应该怎样划分?
- 编码器层:只做快速状态读取、合法跳变判断和位置增减;
- 固定控制周期:读取位置快照、计算误差和PID;
- 电机输出层:处理正反转、PWM限幅、最小启动输出和制动;
- 通信层:接收缓冲、帧校验、命令解析和状态回复;
- 保护层:监测超时、堵转、编码器无反馈、欠压和异常命令。
关键原则是:编码器处理短而快,PID周期固定,通信不长时间阻塞,任何故障都能走到确定的安全输出。
PFS173闭环电机控制器怎样调试?
- 只调编码器:手动转轴,确认方向和计数稳定;
- 只调开环输出:低占空比验证方向、PWM和H桥温升;
- 只调通信:电机不通电时验证帧、超时和错误命令;
- 只开比例环:低输出限幅确认反馈符号正确;
- 逐步加入D和I:记录每次参数与响应,不凭感觉反复修改;
- 做异常测试:拔掉编码器、堵转、通信中断、低电压、快速反转和重启。
常见故障怎样快速判断?
| 现象 | 优先怀疑 | 快速验证 | 处理方向 |
|---|---|---|---|
| 高速失控 | 编码器方向或误差符号相反 | 手转轴观察位置正负 | 统一坐标、PWM方向和误差符号 |
| 目标附近持续振荡 | Kp过高、Kd不足、机械间隙 | 降低Kp并观察变化 | 重调Kp/Kd,设置合理死区 |
| 低速不动 | 静摩擦、最小PWM不足 | 缓慢增加PWM | 增加启动补偿,避免长期大积分 |
| 带载到不了位置 | 输出限幅、驱动电流或供电不足 | 比较空载与带载电流 | 检查电源、H桥、机械阻力和限幅 |
| 高速位置漂移 | 编码器漏计数 | 高低速累计计数对比 | 提高编码器服务优先级,缩短临界区 |
| 通信时控制变差 | 软件SPI阻塞 | 暂停通信后复测 | 缩短帧、分时处理、减少关中断时间 |
| 堵转后持续发热 | 缺少超时或堵转保护 | 观察PWM与位置是否持续不变 | 限时停机、限流并锁存故障 |
| 重启后位置错误 | 增量编码器没有回零 | 断电重启检查坐标 | 增加原点传感器和回零流程 |
量产前必须验证哪些指标?
| 验证项目 | 至少记录什么 | 为什么重要 |
|---|---|---|
| 定位性能 | 误差、稳定时间、过冲、重复性 | 决定控制指标是否真的满足产品需求 |
| 最大编码器频率 | 最高转速下的漏计数和CPU余量 | 防止实验室低速正常、量产高速失控 |
| 堵转与卡滞 | 检测时间、峰值电流、停机方式、温升 | 避免电机、驱动器和结构件持续过热 |
| 通信压力 | 连续指令、错帧、超时、重连表现 | 验证软件SPI不会破坏实时控制 |
| 供电安全 | 上电、掉电、欠压、反接和浪涌行为 | 防止异常电源状态下误动作 |
| 环境与EMI | 温度、电机干扰、EFT/ESD后的状态 | 确认整机环境中不会复位或累计误差 |
| 烧录追溯 | 程序版本、配置、校验值、批次记录 | 避免量产文件和样机版本错位 |
PFS173还适合新项目吗?
Free-PDK的PFS173资料页将该器件标注为已停产,并把PFS123列为潜在替代候选;同时,应广科技当前F系列MTP产品目录未列出PFS173。两项信息都不足以证明某个渠道已经无货,但足以说明新项目不能仅凭旧案例决定长期量产选型。
对已经量产的设计,是否继续使用取决于可追溯库存、稳定供货、烧录工具、源代码与最终量产文件是否齐全,以及替代验证成本。对新项目,应先向供应方确认器件状态、批次和交期,再完成样片与整机验证。
工程师先确认
- 最大编码器频率与控制周期;
- 程序、RAM和定时器余量;
- 通信、保护和回零需求;
- 温度、EMI及整机安全边界。
采购人员再确认
- 型号状态、交期、批次与追溯;
- 受控规格书和烧录工具;
- 样片、试产和长期供货承诺;
- 候选替代料的验证成本。
逐高电子可根据电机参数、编码器分辨率、最高转速、供电、通信和年用量,协助进行应广单片机选型与采购评估。最终决定仍应以当前受控规格书、样片测试、完整烧录流程和整机验证结果为准。
哪些项目不适合使用PFS173?
- 高分辨率编码器与高速电机叠加,边沿频率接近处理能力上限;
- 多轴、多环或需要复杂轨迹规划和前馈控制;
- 必须依赖硬件正交编码器接口或高速硬件通信外设;
- 涉及严格功能安全、冗余监测或认证要求;
- AC阻容降压、高EFT环境且保护、隔离与抗扰设计不足。
这个方案适合哪些应用?
在速度和精度边界经过验证后,可用于小型送料机构、阀门执行器、玩具执行机构、摄像转台、电子锁、旋钮模拟器、小型滑台和简单机器人关节等固定功能的单轴位置控制。
常见问题
PFS173可以直接驱动直流电机吗?
不可以。PFS173只输出逻辑级PWM和方向信号,电机电流必须由外部H桥或专用驱动器承担。
PFS173可以运行PID算法吗?
可以实现基础的定点或简化PID位置环,但能否满足项目要求取决于控制周期、编码器频率、通信负载和程序资源。
软件SPI会导致编码器漏计数吗?
有可能。若软件SPI阻塞时间过长或长时间关闭中断,可能错过编码器边沿,必须在最高转速和最大通信负载同时出现时验证。
电机为什么在目标位置附近振荡?
常见原因包括Kp过高、Kd不足、机械间隙、编码器分辨率有限以及死区设置不合理,应结合位置、电流和PWM波形逐项判断。
怎样避免编码器断线后电机失控?
监测PWM持续输出时位置是否在合理时间内变化;若没有反馈,应立即关闭驱动、锁存故障并等待明确的复位或重新回零。
PFS173适合新的批量项目吗?
需要谨慎。公开器件资料将其列为旧型号/停产状态;新项目应先确认真实供应、工具链和生命周期,并同步评估可持续供货的候选型号。
PFS173 的 PID 控制周期设定为多少比较合适?
建议设定在 1ms 到 5ms 之间(即 200Hz~1000Hz)。判断依据:假设电机最高转速 3000 RPM,编码器 100 线(4 倍频后为 400 脉冲/圈),则最高脉冲频率为 20kHz。若控制周期设为 1ms,每次采样约有 20 个脉冲变化,分辨率足以计算微分;若周期过长(如 50ms),系统响应会严重滞后,导致振荡甚至失控。
驱动电机的 PWM 频率应该设为多少?
建议设定在 15kHz 到 20kHz 之间。判断依据:人类听觉上限为 20kHz,低于 15kHz 电机可能产生刺耳的高频啸叫;高于 20kHz 虽静音,但会增加 H 桥开关损耗,导致驱动器发热。PFS173 主频通常在 8MHz~16MHz,需平衡 PWM 分辨率(建议 8 位以上)与频率的关系。
PFS173 没有硬件浮点运算单元,PID 计算怎么办?
必须使用定点数(Q格式)替代浮点数。判断依据:PFS173 是 8 位架构,一次单精度浮点乘法可能需要数百个指令周期(耗时数十微秒)。若控制周期为 1ms,浮点运算极易阻塞编码器中断。使用 16 位或 32 位定点数运算,可将计算时间压缩至几微秒,确保实时性。
PID 积分项容易饱和(Windup),在 PFS173 中怎么处理?
采用遇限停止积分(Anti-windup)策略。判断依据:由于 PFS173 的 RAM 较小,积分项若不加限制,极易导致 16 位或 32 位整数溢出。当 PID 输出 \(u(k)\) 达到最大 PWM 限幅值(如 1000),且误差 \(e(k)\) 仍在增加方向时,应停止累加积分,防止电机退饱和时的巨大超调。
PFS173 最多能处理多少线数的增量式编码器?
建议不超过 500 线(2000 脉冲/圈)。判断依据:假设电机 3000 RPM(50 转/秒),500 线 4 倍频后就是 100,000 脉冲/秒(100kHz)。这意味着外部中断间隔仅 10 微秒。对于 8 位的 PFS173,若中断服务程序执行时间超过 5 微秒,CPU 将无法处理其他任务。超过 500 线必须评估超频或换用带硬件编码器接口的 MCU。
PID 输出很小但电机不转,输出变大又冲过头,怎么解决?
这是典型的静摩擦(死区)问题,需设置最小启动 PWM。判断依据:普通有刷电机的启动电压通常占额定电压的 10%~20%。可在代码中设定:当 PID 输出绝对值小于阈值(如满占空比的 15%)时强制输出 0;超过阈值时,直接加上基础启动补偿,以克服静摩擦力。
电机一启动/停止,PFS173 就死机或复位,有什么解决办法?
这是典型的 EMI(电磁干扰)问题。判断依据:直流电机碳刷换向时会产生数百伏的高频尖峰。对策:必须在电机引脚两端并联 0.1uF 瓷片电容;PFS173 的 VDD 和 GND 之间紧贴 0.1uF 退耦电容;编码器输入引脚串联 1kΩ~4.7kΩ 电阻限流。
用软件 SPI 通信时,如何保证通信不拖慢 PID 控制?
必须采用非阻塞(中断或状态机)方式收发数据。判断依据:若 SPI 速率 1Mbps,发送 16 字节需 128 微秒。若控制周期为 1ms,若用死等(Blocking)方式,CPU 会被占用 12.8% 的时间。推荐每次进中断只处理 1 个字节(约 8 微秒),将长帧分散处理,避免阻塞编码器边沿捕获。
PFS173 定时器资源紧张,编码器计数和 PWM 如何分配?
采用硬件 PWM + 外部中断 + 软定时器。判断依据:将硬件定时器固定用于生成 PWM 载波;编码器 A/B 相直接接外部中断进行边沿捕获;利用 PWM 周期中断提供一个 1ms 的基准节拍(软定时器),在主循环中判断该标志位执行 PID 和通信。这样可避开定时器不够用的窘境。
断电重启后,增量式编码器位置丢失,如何实现绝对位置?
增量式编码器断电必然丢失位置。解决数据判断:1. 增加光电/霍尔原点传感器,上电后先执行低速回零动作;2. 若使用断电不丢位置的绝对值编码器,PFS173 可通过 I2C/SPI 读取(例如 AS5600,分辨率 12 位),但会增加成本;3. PFS173 若有 DATA EEPROM,可在掉电瞬间(利用电源大电容)紧急保存位置,但擦写寿命仅约 10 万次,不适合频繁掉电场景。
参考资料与说明
- Repurposing the Encoder Counter
- Padauk MotorController 开源项目
- The Three Cent Motor Controller
- Free-PDK PFS173 器件资料
- 应广科技产品页面
本文根据公开项目、代码仓库和器件资料形成原创工程分析。公开项目证明了PFS173完成编码器计数、位置控制和软件SPI通信的可行性,但没有提供可直接套用的PID参数、最大编码器频率、定位精度或量产可靠性结论。目标产品应以当前官方规格书、实际电机参数和整机验证结果为准。
