自制直驱方向盘(Direct Drive)的核心机密:USB HID PID 力反馈协议深度
前言在传统的单片机控制中我们习惯了发送具体的数值比如“转到 90 度”或者“以 500RPM 旋转”。但在模拟赛车领域直驱方向盘如 Simucube 或开源的 OpenFFBoard的工作逻辑完全不同。PC 游戏端绝对不会傻傻地给单片机发送电机的 PWM 占空比。它们之间使用的是一套极其复杂的标准协议USB HID PID (Physical Interface Device)。理解了这套协议你就能打通虚拟物理引擎与真实物理电机之间的桥梁。一、 游戏端发来的到底是什么物理效果描述符在 HID PID 协议中PC 游戏把方向盘视为一个“物理力场生成器”。游戏通过 USB 发送的是一个个独立的物理效果Effects恒定力Constant Force方向盘一直被往左或往右掰。比如车辆过弯时的离心力。弹簧力Spring方向盘偏离中心越远阻力越大就像方向盘上挂了根弹簧。阻尼力Damper你转动方向盘的速度越快阻力越大。用于模拟轮胎和地面的黏滞感。摩擦力Friction只要你转动方向盘就会有一个恒定的阻力。周期力Periodic正弦波、方波等。比如你压到了路肩路缘石游戏会发送一个高频震动的效果。二、 STM32 的地狱级任务效果叠加与渲染Rendering当 STM32 收到这些 USB 报文后真正的挑战开始了。游戏可能会在同一时刻要求方向盘同时具备“弹簧回中”、“路肩震动”和“过弯恒定力”。这就要求 STM32 内部必须跑一个至少 1000Hz 的高频渲染循环。它的工作流程如下读取状态读取当前方向盘的高精度编码器角度和角速度。公式计算遍历所有当前处于“激活”状态的物理效果。比如当前有一个弹簧效果STM32 就要计算Spring_Torque (Current_Angle - Center) * Spring_Coefficient。比如当前有一个阻尼效果STM32 就要计算Damper_Torque Current_Velocity * Damper_Coefficient。力矩合成把所有算出来的 Torque扭矩加在一起得到一个总的Target_Torque。输出给 FOC把这个最终的扭矩作为 $I_q$交轴电流的目标值喂给底层的 FOC 电流环。三、 为什么 DIY 直驱容易出现“打手”和“共振”很多玩家在移植了开源固件后发现方向盘像发疯一样左右剧烈震荡甚至会把手腕打伤。这在控制系统里叫正反馈发散。原因USB 通信有延迟FOC 电流环也有延迟。当游戏要求产生一个阻尼力来抑制转动时如果 STM32 算得太慢或者滤波做得不好这个阻力给晚了就会从“阻尼”变成“推力”。解法在固件底层加入硬件级的低通滤波器biquad filter来平滑目标电流同时在 FOC 环内加入额外的速度前馈抑制甚至利用摩擦力补偿来对抗机械系统的不可控震动。四、 总结写一套优秀的力反馈底层固件是一次对 USB 协议栈、多线程实时计算以及无刷电机高频电流环的综合大考。当你感受到路面的一颗小石子通过 STM32 丝滑地传递到你手心时那种创造物理规则的快感是普通点灯项目绝对无法比拟的。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2569927.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!