最近在调一套触觉反馈方案,主控板上两颗料让我印象深刻:一颗丝印是C1026B002F,另一颗是R7KA8D2KFLCAC。查遍公开资料都没有像样的 datasheet,只能靠样品实测和典型应用电路反推。就是在这种“半猜半验证”的状态下,我把这套 ERM 电机控制系统从“会转”做到了“振得舒服”,整个项目做下来,对电机控制的理解比翻十篇论文都深。
ERM 是 Eccentric Rotating Mass 的缩写,偏心旋转质量电机,说白了就是一个直流电机转轴上挂了块偏心铁,转起来靠离心力产生振动。手机振动、游戏手柄反馈、智能手环提醒,用的基本都是这类执行器。很多人觉得 ERM 驱动简单,给个 PWM 就行,但要做“提升用户体验”的先进控制,里面的坑一点不少:启动延迟、停止拖尾、电压波动导致的振动忽大忽小、PID 调参震得整个结构件嗡嗡响。这篇文章就把我这套基于 C1026B002F 和 R7KA8D2KFLCAC 的完整方案拆开讲清楚,从硬件驱动电路、控制算法到量产标定,适合嵌入式工程师、硬件开发者,以及所有想把振动反馈做出高级感的从业者。
1. 项目概述与控制需求拆解
1.1 ERM电机是什么,为什么“先进控制”值得做
ERM 的物理原理不复杂:转子转动时,偏心块产生周期性的离心力,这个力通过电机外壳传递到产品结构上,人 perceiving 到就是振动。相比线性马达 LRA,ERM 的优点是成熟、便宜、驱动电路简单,而且低频段振感厚实,特别适合做通知提醒和按键反馈。缺点是响应慢,从给电到稳定振动通常要几十到一两百毫秒,断电之后转子还要靠惯性转一阵子,振感收不干净。
很多人说那直接把 ERM 换成线性马达不就行了?成本、结构、驱动电压全要改,产品早就过审了,改执行器等于推翻重来。所以在这个项目里,目标是在不换执行器的前提下,通过优化驱动和控制算法,把响应速度、振动稳定性、启停干脆程度做到接近 LRA 的体验。
顺便说一句,热搜里出现“PMSM 电机控制”,那是永磁同步电机,需要 FOC 矢量控制,换向逻辑、坐标变换、SVPWM 一堆复杂算法。ERM 作为直流有刷电机,控制模型要简单得多,核心就两件事:管住电压/电流,管住转速。所谓“先进”,不是堆算法,而是在简单模型上把细节做到位。
1.2 两颗神秘料号C1026B002F与R7KA8D2KFLCAC到底扮演什么角色
先泼一盆冷水:C1026B002F 和 R7KA8D2KFLCAC 大概率不是通用器件型号,而是项目定制丝印、晶圆代工编码或者某厂商的内部料号。公开渠道查不到完整数据手册,是这类项目里的常态。我的做法是先通过引脚功能、外围典型应用和上电时序反推器件角色,再设计外围电路。
结合这整套系统的功能需求,下面是我在项目里对这两颗料的定位:
- C1026B002F:功率级驱动器件。内部等效为双半桥或 H 桥结构,集成 MOSFET 和续流二极管,输入侧兼容 PWM/逻辑电平,输出侧直接驱动 ERM 电机。它的作用是把 MCU 或前级控制芯片的小信号 PWM 变成能驱动电机的功率信号,同时提供过流保护。
- R7KA8D2KFLCAC:信号链与控制协同器件。带有霍尔传感器接口或编码器输入,能采集电机转速/位置;内置电流采样放大,能将电机电流转换为模拟或数字信号;通过 I2C/SPI 接口与 MCU 通信,内部也可能集成了 PID 预处理逻辑。
注意,这个定位是我的项目推断,如果你的板上同样丝印的料功能不同,外围电路要以实际测试为准。但整篇文章讲的驱动、闭环、调参思路是通用的,换任何驱动芯片和信号调理芯片都适用。
1.3 系统总体架构与信息流
整个系统可以画成一条单向+反馈的信息链:MCU 是决策大脑,通过 I2C/SPI 把目标振感指令发给 R7KA8D2KFLCAC;R7KA8D2KFLCAC 根据内部算法生成 PWM 信号,输出到 C1026B002F;C1026B002F 完成功率放大,驱动 ERM 电机旋转。同时,R7KA8D2KFLCAC 通过霍尔传感器/编码器采集转速,通过采样电阻采集电流,把反馈量送回 MCU 或内部闭环调节器,最终稳定电机的振动强度。
电源部分要单独关心:ERM 启动瞬间电流可以达到稳态电流的 2~4 倍,所以供电不能直接怼一个 LDO,要用低 ESR 钽电容或陶瓷电容做储能,必要时加软启动。保护电路上,TVS 管防静电、采样电阻用于限流、NTC 或芯片内置过温保护用于防止连续高烈度振动时驱动过热。
这套架构的好处是层次清晰:功率级只管功率,信号级只管检测,算法在 MCU 侧灵活调整。如果后续要换电机、换驱动,只需要改参数和外围,不需要重写算法。
2. 驱动电路与功率级设计
2.1 从三极管驱动到专用驱动器件,省掉的不只是几个元件
先说说以前的做法。很多低成本方案用一个 NPN 三极管 + 续流二极管驱动 ERM 电机,MCU 的 PWM 直接接三极管基极,集电极接电机,发射极接地。这种电路能转,但问题明显:三极管在开关过程中处于放大区时功耗很大,PWM 频率稍微提高就发热;没有过流保护,堵转时电流一路飙升,容易烧管烧电机;三极管的一致性差,批量生产时每台设备的振动强度都不一样。
所以项目里我没有用分立三极管方案,而是把功率驱动交给 C1026B002F 这类集成驱动器件。它内部是专门的 MOSFET,低导通电阻 RDS(on),开关速度快,自带续流二极管和过流保护。相比之下,三极管控制电机只适合那种“能转就行”的场景,要做闭环、要做 PWM 精细调节、要做长时间连续振动,专用驱动器件是底线。
2.2 PWM频率、死区与续流:三个最容易被忽略的参数
PWM 频率的选择要权衡三件事:噪声、开关损耗、控制分辨率。ERM 电机的电气时间常数一般在毫秒级,PWM 频率太低,比如 1kHz,电流纹波大,电机换相噪声明显,而且容易和产品结构件产生共振异响;频率太高,比如 100kHz,MOSFET 开关损耗增大,驱动芯片发热。我实测下来,20kHz~40kHz 是甜点区间,既能避开人耳敏感区,又不会让驱动过热。项目里最终定在 25kHz。
死区时间针对 H 桥上下管。如果 C1026B002F 内部是半桥或 H 桥结构,上下管切换时如果没有死区,瞬间直通短路,轻则电流尖峰,重则炸管。虽然很多集成驱动芯片内部已经做了死区,但我在软件里仍然限制了 PWM 占空比的最大值,不做到 100%,留出 2%~3% 的余量,双保险。
续流问题。ERM 是感性负载,电流不能突变。MOSFET 关断瞬间,电感会通过续流二极管续流,否则会产生高压尖峰击穿器件。C1026B002F 内部如果已经有体二极管,外部仍然建议并联一个快恢复二极管或者肖特基二极管,就近跨接在电机两端,缩短续流回路,减少 EMI。
2.3 倒顺开关、H桥正反转与ERM电机的快速刹车
热搜里有“如何利用倒顺开关控制单相电机正反转”,那是工频电机的老办法,用倒顺开关换相。对直流 ERM 电机来说,正反转同样由 H 桥实现,但 ERM 正常工作时只需要单向旋转,H 桥在这里的最大价值是“快速刹车”。
刹车原理:电机的负载是偏心块,惯性不小。停止驱动后,转子还会继续转几百毫秒,振感拖泥带水。快速刹车有两种方式,一是反接制动,在要停止时给电机一个反向电压,让转子快速停下来;二是动态制动,把电机两端短路,用电机自身的反电动势产生制动扭矩。动态制动更温和、冲击小,我在系统中就是通过 H 桥同侧下管同时导通实现的。
H桥逻辑很简单:正向旋转时 A 管和 D 管导通;反向旋转时 B 管和 C 管导通;刹车时下管 A 和 B 同时导通,电机两端被短路。这个过程和倒顺开关换相的思路一脉相承,只是从手动变成了 MCU 控制。代码里要注意状态切换顺序,先关所有管,再开目标管,避免直通。
2.4 电源、限流与保护电路的摆放位置
电源设计的核心是应对启动冲击。ERM 冷态启动时,转子从静止到转动需要克服静摩擦力矩,电流可能冲到额定电流的 3 倍以上。假设额定电流 80mA,启动峰值可能到 250mA 甚至更高,持续几毫秒到几十毫秒。如果电源响应慢,电压会被拉低,MCU 或者传感器供电都会受影响。
实际操作中,我在电机电源输入端放了一颗 100μF 的低 ESR 钽电容和一颗 0.1μF 陶瓷电容并联,就近放置。采样电阻放在驱动器件和电机之间的低边,阻值要小,一般 0.05Ω~0.1Ω,太大了会分压影响电机电压,太小了电流信号难采集。采样电阻两端用差分走线连到 R7KA8D2KFLCAC 的电流检测引脚,避免地平面噪声干扰。
保护电路方面,TVS 管跨接在电源正负极之间,选型时击穿电压要比最高工作电压高 20% 以上;如果电机持续堵转,电流检测超过阈值,算法里要立即关断 PWM,进入错误状态,不能靠硬件扛。
3. 控制算法与PID调参实操
3.1 为什么开环PWM不够用
开环控制就是 MCU 直接给一个固定占空比,期望得到某个振动强度。问题在于电机转速不仅取决于占空比,还取决于供电电压和负载。电池满电 4.2V 和快没电 3.5V,同样 50% 占空比,转速能差 20%,用户感知就是振动一下重一下轻。温度变化也会让轴承润滑脂黏度改变,摩擦力变化,转速漂移。
用一个生活类比:你开车下坡,如果想保持 80km/h,不能一直踩同一个油门深度,得根据坡度实时调整油门。ERM 就是那个车,电压波动是坡度,PID 就是那个帮你调整油门的司机。要让用户体验一致,必须闭环。
3.2 从霍尔传感器到转速/电流反馈:R7KA8D2KFLCAC的数据获取路径
闭环的前提是反馈。这个项目里反馈有两路:转速反馈和电流反馈。
转速反馈用霍尔传感器实现。电机后轴装一个多极磁环,霍尔传感器输出随磁极变化的方波信号,频率与转速成正比。每转输出脉冲数 P 由磁环极对数决定,比如 8 极磁环对应每转 8 个脉冲。转速计算公式:
n = f / P × 60
其中 f 是霍尔信号频率(Hz),n 是转速(RPM)。例如 1 秒内数到 80 个脉冲,P=8,转速就是 80/8×60=600RPM。
测量方法分 M 法和 T 法。M 法是在固定时间窗口内数脉冲,适合高转速;T 法是测量两个脉冲之间的时间间隔,适合低转速。ERM 常规工作范围 3000~12000RPM,用 M 法就足够,采样周期一般 10ms~20ms。
电流反馈通过采样电阻进入 R7KA8D2KFLCAC 的 ADC 或专用电流检测放大器。电流内环响应快,可以抑制电压波动带来的扭矩突变;速度外环响应慢,保证稳态转速一致。项目中我用速度环做主环、电流环做内环,两环都用 PI 控制,D 项基本不用,因为转速反馈本身有滞后,微分容易引入噪声。
3.3 增量式PID的代码实现
增量式 PID 是嵌入式里最常用的形式,因为它输出的是控制量的增量,不会出现积分项导致的累加饱和飞车问题,而且执行器(PWM 寄存器)天然支持增量修改。
下面这段代码我在多个项目里复用,直接可以抄:
typedef struct { float Kp; float Ki; float Kd; float integral; float prev_error; float output; float output_max; float output_min; } PidController; void pid_init(PidController *pid, float kp, float ki, float kd, float out_max, float out_min) { pid->Kp = kp; pid->Ki = ki; pid->Kd = kd; pid->integral = 0.0f; pid->prev_error = 0.0f; pid->output = 0.0f; pid->output_max = out_max; pid->output_min = out_min; } float pid_update(PidController *pid, float setpoint, float feedback) { float error = setpoint - feedback; /* 积分分离,误差过大时停止积分,防止积分饱和 */ if (fabsf(error) < pid->output_max * 0.3f) { pid->integral += error; /* 积分限幅 */ if (pid->integral > pid->output_max) pid->integral = pid->output_max; if (pid->integral < pid->output_min) pid->integral = pid->output_min; } pid->output = pid->Kp * error + pid->Ki * pid->integral + pid->Kd * (error - pid->prev_error); if (pid->output > pid->output_max) pid->output = pid->output_max; if (pid->output < pid->output_min) pid->output = pid->output_min; pid->prev_error = error; return pid->output; }注意两点:一是积分分离,误差很大的时候不积分,避免积分饱和导致响应迟钝;二是输出限幅,PID 输出是占空比,必须在 0~100 范围内。霍尔编码器电机 PID 控制和这里完全一样,只是反馈值从霍尔脉冲数换算成 RPM 或者直接归一化。
3.4 调参顺序与现场整定方法
先给结论:ERM 这类执行器,我几乎没有用过 Kd,PI 就够用,D 项在信号有毛刺时会放大噪声。
调参顺序,我的习惯是:
- 开环标定。给电机一个固定占空比,比如 30%、50%、70%,记录对应的转速/电流,知道执行器的基本特性。
- 只加 P。从 0 开始慢慢加大 Kp,观察转速响应。如果转速在目标值附近来回震荡,说明 Kp 太大;如果响应慢、静态误差大,说明 Kp 太小。
- 加 I 消除静态误差。Ki 从 Kp 的 1/10 开始调,观察稳态转速是否落在目标值附近。I 太大也会震荡,而且震荡周期比 P 导致的震荡更长。
- 在目标转速突变时观察超调量。比如从 0 直接给 6000RPM 的目标,如果转速冲过 7000 再回落,说明 P 和 I 偏大,需要减小。
现场整定一定要看波形。我习惯用示波器同时看两路信号:霍尔转速经 DAC 输出的模拟量(或者直接看速度环误差量)和 PWM 输出。转速上升是一条平滑斜坡,说明参数合适;如果是锯齿状上下跳,基本就是反馈信号噪声大或者 PID 增益过高。
4. 用户体验优化的工程细节
4.1 波形包络设计:让振动“有层次”
同样的硬件,为什么有的产品振动“咚咚”有力,有的就像“蚊子叫”?核心在波形包络。ERM 的离心力与转速的平方成正比,所以振动强度与占空比不是线性关系。设计波形时,先把占空比和用户主观感受做一个标定曲线,得到“占空比→振感等级”的映射表。
实际波形分几类:按键确认用短脉冲,10ms 加速到 60% 占空比保持 30ms,然后刹车停止;来电提醒用连续渐强渐弱包络,像呼吸灯一样,1.5 秒一个周期;游戏打击感用猛烈的“攻击波形”,快速拉升到 90%,短暂保持后立即刹车。每一类波形都对应一张包络表,MCU 按表输出目标转速,PID 去逼近。
刹车在这里特别关键。没有刹车的短脉冲,电机会“嗡嗡”拖尾 300ms,有刹车的短脉冲,振动干脆利落,用户体感完全两个档次。
4.2 启停延迟、刹车与动感补偿
ERM 存在固有的启动延迟,从 PWM 输出到转速上升为稳定值的 63%,这个时间称为机械时间常数,通常在 30ms~100ms 之间。对于按键反馈这类场景,100ms 延迟是明显可感的。怎么办?预驱动补偿:在正式波形开始前 20ms,先给一个短促的高占空比脉冲,把电机“踹”起来,然后再回到目标占空比。这样用户按下的瞬间,振动已经起来了。
停止延迟靠刹车解决。H 桥短路制动可以在 20ms 内把转速降下来,但刹车太猛会导致偏心块冲击结构件产生“咔哒”声。我的做法是分级刹车:先反接制动 5ms,再进入短路制动,最后自由滑行,兼顾速度和噪声。
4.3 噪声、EMI与信号完整性
ERM 的噪声主要有三类:机械噪声,来自偏心块轴承和结构共振;电磁噪声,来自 PWM 开关切换产生的 di/dt;信号噪声,来自电机引线耦合到霍尔或 I2C 线上的干扰。
机械噪声靠结构和波形优化解决,比如 PWM 频率避开结构共振点,或者在振动目标附近增加柔性的启动斜坡。电磁噪声靠布线和吸收解决:电机线双绞,靠近电机端加磁珠;PWM 驱动的输出加 RC 吸收电路;电源入口加 π 型滤波。信号线上的霍尔脉冲和 I2C 时钟,都建议串 100Ω~1kΩ 电阻,减小振铃。
我踩过一个坑:霍尔传感器信号线紧挨着电机驱动线,结果电机一启动,转速数据全是毛刺,PID 直接发散。把霍尔线挪到远离驱动线的一侧,再加一颗 4.7nF 电容滤波,问题立刻消失。做电机控制,布局和滤波的优先级不比算法低。
4.4 量产标定与一致性控制
同一批 ERM 电机,个体差异能到 ±15%。如果每台设备用同一套 PID 参数和占空比映射,用户买到两台手机,振动手感可能不一样。所以在产线上增加一道标定工序:用标准电压驱动电机到某个占空比,测量实际转速和电流,将结果写入设备的 Flash。控制算法启动时读取这些标定参数,用来修正目标转速和输出占空比。
温度补偿也是量产必须要做的。ERM 转子轴承在低温下润滑脂黏度增大,负载变大,同样占空比下转速会降低。我在系统里放了一个 NTC 温度传感器,测量电机附近温度,查表修正目标转速。低温时适当提高 PWM 上限,高温时限制最大占空比防止电机过热。
5. 常见问题与排查技巧实录
5.1 现象—原因—对策速查表
| 现象 | 可能原因 | 排查方法 | 解决对策 |
|---|---|---|---|
| 电机完全不转 | 供电异常、PWM无输出、驱动芯片损坏 | 示波器测PWM引脚、测电机两端电压 | 检查电源、检查使能引脚、更换驱动 |
| 电机转速忽快忽慢 | PID参数不当、转速反馈噪声 | 观察转速波形、检查霍尔信号 | 调小P/I增益、加滤波电容 |
| PWM频率有啸叫 | PWM频率落在音频范围内 | 用示波器FFT或人耳判断 | 提到20kHz以上 |
| 驱动芯片严重发热 | 频率太高、死区不够、散热不良 | 测驱动芯片表面温度、看电流波形 | 降频、检查死区、加散热铜皮 |
| 振动停止拖尾长 | 未启用刹车 | 看停止时电机两端电压波形 | 启用H桥动态制动 |
| 转速信号全是毛刺 | 霍尔线受到电机驱动线干扰 | 示波器看霍尔线波形 | 远离干扰源、串电阻并电容滤波 |
| 电池电压波动导致振感变化 | 只有开环控制 | 看PWM占空比固定但转速变化 | 增加电流/转速闭环 |
5.2 三个实测排查案例
案例一:转速闭环在低温环境发散。放在低温箱里测试时,电机转速在目标值附近大幅震荡。原因是低温下轴承阻力增大,PI 参数在常温下打好的余量不够,I 项积分偏大导致超调。解决办法是加入温度补偿表,低温时自动降低 Ki,并提高 PWM 输出上限。
案例二:按键波形带“尾音”。单脉冲停止后,电机转速降到 0 前持续了 400ms,听起来像“嗡”了一声。通过示波器看到停止时 PWM 直接切到 0,电机自由滑行。改代码在波形结束位置插入动态制动状态,30ms 内转速归零,问题解决。
案例三:两块板子同样代码同样参数,振动强度差了 20%。核对发现两块板子的电机不是同一批次,个体差异大。这就是前面说的量产标定问题。给产线做了 5 点占空比标定,把每台设备的标定系数写入 Flash,出厂的振动一致性明显提升。
5.3 没有数据手册时,怎么确认料号功能
C1026B002F 和 R7KA8D2KFLCAC 查不到手册,就得靠实测和反推。我的方法分三步:
第一步,看外围。板上电感电容电阻的规格和位置基本能告诉你芯片类型。如果芯片旁边有采样电阻和大电流走线,多半是功率驱动;如果旁边有晶振、I2C 上拉电阻、传感器接口,多半是控制/信号链芯片。
第二步,测引脚。用万用表测各引脚对地对电源的阻抗,电机驱动引脚和电源脚之间通常是低阻或二极管特性;I2C 引脚在上拉电阻存在时对地有一定阻值。上电后用示波器抓引脚波形,看是否有 PWM、时钟或数据信号。
第三步,找原厂或者代理商的 FAE。定制料号尽管公开查不到,但只要不是绝密项目,供应商通常能通过丝印批次追到原始规格。我最后就是从代理商那里拿到了一份引脚定义简表,外围设计才真正定了下来。
这套项目做下来,我最深的体会是:ERM 电机控制看起来简单,但每个环节都会影响最终手感。驱动级决定能不能稳住功率,反馈级决定看不看得清状态,PID 决定跟不跟得上目标,波形设计决定用户感觉好不好。如果只是转起来,开环 PWM 就够了;但如果你想让振动反馈成为产品的加分项,闭环和细节优化一步都省不了。
最后分享两个小技巧:调 PID 时,先用示波器把转速反馈的波形调干净,再开始调参,否则每一步都会被噪声误导;另外,别把 PWM 输出上限设到 100%,给刹车和电压波动留一点余量,实际效果会稳定很多。这套方案在正式项目里跑了几千块板子,整体稳定性我是有底的。