1. 项目概述
Super Dial 是一款面向桌面人机交互场景设计的力反馈电机旋钮终端设备,其核心目标是复现 Microsoft Surface Dial 的物理交互体验——通过高精度位置感知、实时力矩反馈与多模态显示输出,在 PC 端实现自然、沉浸式的旋钮操控。该项目并非概念验证原型,而是经过多轮硬件迭代与固件调优后形成的可稳定运行的工程化终端,具备完整的 HID 轮盘(HID Consumer Page: 0x0C, Usage: 0xB8 Rotary Dial)功能,可被 Windows 10/11 原生识别并映射为系统级旋钮输入设备。
与常见旋钮方案不同,Super Dial 的技术路径聚焦于“机电闭环”:以无刷电机为执行单元,以磁编码器为位置传感核心,以 ESP32-S3 为主控中枢,构建从用户施加扭矩→电机实时反向建模→编码器精确采样→主控解析意图→HID 报文生成→PC 端响应的完整信号链。该设计规避了传统电位器方案的机械磨损、线性度偏差与寿命瓶颈,同时绕开了步进电机方案的低速抖动与高频失步问题,使旋钮在任意转速下均能维持亚度级角度分辨率与毫秒级力反馈响应。
项目采用模块化硬件架构,由三块独立 PCB 与四个 3D 打印结构件构成:屏幕板(GC9A01 驱动)、电机驱动板(含 MT6701 磁编码器与 EG2133 三相预驱)、主控板(ESP32-S3-N16R8 + IP5306 UPS 电源管理)。所有板间互连通过一根 8P0.8mm 间距柔性排线贯穿电机中心轴完成,既保障信号完整性,又实现紧凑的同轴堆叠结构。整机支持 USB-C 供电/通信、锂电池续航、蓝牙 HID 无线连接三种工作模式,其中 USB-C 模式下可同时完成供电、固件烧录与 HID 数据传输,无需额外调试接口。
2. 系统架构与设计哲学
2.1 整体架构分层
Super Dial 的系统架构严格遵循嵌入式实时控制系统的分层原则,划分为物理层、驱动层、控制层与应用层四层:
- 物理层:包含 3205B 无刷电机、MT6701 磁编码器、GC9A01 圆形 TFT 屏、IP5306 电源管理 IC 及配套电池。该层负责能量转换、位置感知与人机可视化。
- 驱动层:由电机驱动电路(EG2133 + 外置 MOSFET)、SPI/I²C 总线控制器、LCD 控制器(RGB 接口)、USB PHY 与蓝牙基带组成,提供底层硬件抽象。
- 控制层:基于 ESP32-S3 的 FreeRTOS 实时内核,运行电机 PID 闭环控制、编码器数据滤波、HID 报文封装、LVGL 图形渲染等关键任务。
- 应用层:实现多级菜单导航、WiFi 热点配置、OTA 固件升级、PC 性能监控等用户功能,通过 LVGL 构建响应式 UI。
这种分层设计确保了各模块职责清晰、耦合度低,便于后续功能扩展与故障隔离。
2.2 关键设计决策解析
(1)电机选型:3205B 无刷电机的工程权衡
项目初期选用小米云台库存的 3205A 电机,后因供应链中断切换至 3205B。二者均为外转子无刷直流电机,额定电压 5V,空载转速约 8000 RPM,但关键参数存在差异:
| 参数 | 3205A | 3205B | 工程影响 |
|---|---|---|---|
| 转子惯量 | 1.2 g·cm² | 1.5 g·cm² | 影响加速度响应,需重调 PID 微分项 |
| 霍尔传感器布局 | 径向对称 | 切向偏移 | 要求重新校准编码器零点与电角度映射 |
| 轴向长度 | 14.2 mm | 15.0 mm | 需修改电机适配器与转子套结构尺寸 |
选择 3205 系列的核心原因在于其极高的功率密度(>1.5 W/g)与极低的齿槽转矩(<0.5 mN·m),这对力反馈旋钮至关重要:低齿槽转矩意味着用户在无动力介入时能获得近乎“零阻力”的顺滑旋转手感;而高功率密度则支撑快速建立反向力矩,实现 Surface Dial 级别的瞬时阻尼与点击反馈。
(2)编码器通信:I²C → SPI 的性能跃迁
早期版本采用 I²C 接口读取 MT6701 磁编码器数据,虽布线简洁,但暴露出严重时序缺陷:I²C 标准模式(100 kHz)下,单次 16 位角度读取耗时约 220 μs,叠加 ESP32-S3 的 I²C 驱动开销,实际采样周期波动达 ±80 μs。此抖动直接导致 PID 控制器输入信号跳变,表现为用户旋转时力矩忽大忽小,丧失力反馈的连续性与可信度。
解决方案是将通信协议迁移至 SPI 模式。MT6701 支持 3 线 SPI(SCLK/MISO/CS),理论最大速率 10 MHz。实测在 4 MHz SCLK 下,单次 16 位读取稳定在 4.2 μs,且时序抖动 <±0.3 μs。这一改进使控制环路采样周期从不稳定的 250 μs 提升至恒定的 50 μs(20 kHz 控制频率),完全满足无刷电机电流环的实时性要求。硬件层面,主控板与电机驱动板间的 8P 排线中,原 I²C 的 SDA/SCL 线被重定义为 SPI 的 SCLK/MISO,新增 CS 与 MOSI 线,通过优化走线长度匹配与时钟端接,彻底消除信号反射。
(3)电源架构:IP5306 UPS 电路的稳定性重构
V1 版本采用 IP5306 同时承担 USB 输入降压(5V→3.3V)与锂电池充放电管理,但在电机启动瞬间(峰值电流 >1.2 A)引发 3.3V 输出跌落至 2.8V,导致 ESP32-S3 复位。根本原因在于 IP5306 的 LDO 输出能力有限(典型值 300 mA),无法支撑电机驱动芯片 EG2133 的逻辑供电需求。
V2 版本实施三项关键改进:
- 移除 USB 输入路径上的 100 nF 旁路电容(C10/C11):该电容位于 USB 5V 输入端,其容值过大导致 USB PHY 上电握手失败,设备无法被主机识别。实测去除后,USB 枚举成功率从 30% 提升至 100%。
- 引入独立 DC-DC 降压通道:USB 5V 经 MP2153(3A 同步降压)稳压至 3.3V,专供 ESP32-S3 与外围逻辑电路;IP5306 仅负责锂电池充放电管理,其 3.3V LDO 仅作为备份。
- UPS 无缝切换设计:当 USB 断开时,MP2153 输出自动关闭,IP5306 的 LDO 启动供电,切换时间 <10 μs,确保主控持续运行。实测在 USB 热插拔过程中,HID 报文无丢包,旋钮操作无中断。
3. 硬件设计详解
3.1 主控板(ESP32-S3-N16R8)
主控板是整个系统的数据处理与协议枢纽,其核心设计围绕 ESP32-S3 的特性展开:
- MCU 选型依据:ESP32-S3-N16R8 集成双核 Xtensa LX7,主频 240 MHz,内置 512 KB SRAM 与 16 MB Flash,原生支持 USB 2.0 Device(含 HID 类)、2.4 GHz Wi-Fi 与 Bluetooth 5.0。其 USB Device 模式可直接模拟 HID 轮盘,无需额外 USB-UART 桥接芯片,大幅降低 BOM 成本与 PCB 面积。
- USB 接口设计:Type-C 接口采用 CC1/CC2 电阻下拉(5.1 kΩ),强制设备模式;D+/D- 线串联 22 Ω 电阻进行源端端接,抑制高频振铃;VBUS 引脚经 TVS(SMAJ5.0A)与 100 nF 陶瓷电容滤波,吸收插拔浪涌。
- 电源管理:MP2153 配置为强制 PWM 模式(EN 引脚上拉),开关频率 1.5 MHz,输出电容采用 22 μF X5R 陶瓷电容(0805 封装),ESR <5 mΩ,确保动态负载下电压纹波 <30 mV。IP5306 的 CHRG 引脚接 GPIO,软件可读取充电状态;BAT 引脚经 10 kΩ 分压至 ADC,实现电池电量监测。
- 未使用资源处理:原理图中标注的 2.54 mm 插针(如 UART0、JTAG)在生产中不予焊接,避免意外短路或信号干扰,符合量产硬件“最小必要接口”原则。
3.2 电机驱动板(含 MT6701 编码器)
该板集成电机驱动与位置传感两大功能,是力反馈实现的物理基础:
- 电机驱动电路:采用 EG2133 三相预驱 IC,其集成了 6 个 N-MOSFET 驱动器,最大驱动电流 2 A,支持 100% 占空比。外置 6 颗 SI2300 N-MOSFET(Vds=20 V, Id=4.2 A)构成三相全桥,栅极串联 10 Ω 电阻抑制振荡。续流二极管由 MOSFET 体二极管承担,未额外添加肖特基管以简化设计。
- MT6701 磁编码器布局:芯片紧贴电机转子磁环安装,气隙控制在 0.3±0.05 mm。PCB 上编码器焊盘采用沉金工艺,避免氧化导致接触不良;SPI 信号线(SCLK/MISO/MOSI/CS)全程包地,长度差 <5 mm,确保时序裕量。
- 8P 排线接口:采用 0.8 mm 间距 FFC 连接器,引脚定义如下表。排线穿过电机中心孔,实现屏幕板→驱动板→主控板的垂直互连,机械强度由铜柱与 M2.5 螺丝双重加固。
| 引脚 | 信号 | 功能说明 |
|---|---|---|
| 1 | GND | 系统地 |
| 2 | 3.3V | 编码器与驱动逻辑供电 |
| 3 | SPI_SCLK | 编码器时钟 |
| 4 | SPI_MISO | 编码器数据输出 |
| 5 | SPI_MOSI | 预留(当前未用) |
| 6 | SPI_CS | 编码器片选 |
| 7 | EN | 电机使能(低有效) |
| 8 | DIR | 电机方向(高:正转,低:反转) |
3.3 屏幕板(GC9A01 圆形 TFT)
屏幕板采用 GC9A01 驱动的 1.28 英寸圆形 TFT(160×160),其设计重点在于结构集成与信号完整性:
- 圆形切割工艺:PCB 板厂按 STEP 文件精密切割圆形轮廓,边缘倒角 R0.2 mm,避免锐边刮伤手指。屏幕玻璃与 PCB 间填充光学胶(OCA),消除空气间隙导致的眩光。
- RGB 接口布线:GC9A01 使用 8-bit RGB 并行接口(DE/HSYNC/VSYNC/D[7:0]),所有信号线长度严格匹配(误差 <3 mm),每组信号线旁布设完整地平面,减少串扰。DE 信号经 33 Ω 电阻端接,抑制反射。
- 铜柱安装结构:屏幕板中心预留两个 φ2.0 mm 铜柱焊盘,用于固定 8P 排线。安装时先用 M2.5 螺丝将铜柱压紧在打印件-适配器上,再进行焊接,确保铜柱轴线与电机中心线同轴度 <0.05 mm,避免排线弯折应力。
4. 软件架构与关键算法
4.1 固件整体框架
固件基于 Arduino-ESP32 开发框架,核心组件包括:
- FreeRTOS 内核:创建 4 个优先级任务:
motor_task(最高,PID 控制)、encoder_task(高,SPI 采样)、hid_task(中,HID 报文组装)、lvgl_task(低,UI 渲染)。 - LVGL 图形库:配置为
LV_COLOR_DEPTH=16,LV_MEM_SIZE=64KB,使用外部 PSRAM(ESP32-S3 内置)存储帧缓冲区,支持抗锯齿与动画效果。 - HID 协议栈:基于 ESP-IDF 的
usb_hid_device示例改造,自定义 Report Descriptor 实现 Rotary Dial 功能:
// HID Report Descriptor (Simplified) 0x05, 0x0C, // USAGE_PAGE (Consumer Devices) 0x09, 0xB8, // USAGE (Rotary Dial) 0xA1, 0x01, // COLLECTION (Application) 0x85, 0x01, // REPORT_ID (1) 0x09, 0xB8, // USAGE (Rotary Dial) 0x15, 0x81, // LOGICAL_MINIMUM (-127) 0x25, 0x7F, // LOGICAL_MAXIMUM (127) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x01, // REPORT_COUNT (1) 0x81, 0x06, // INPUT (Data,Var,Rel) 0xC0, // END_COLLECTION4.2 电机力反馈控制算法
力反馈的核心是建立“用户输入角度变化率”与“电机输出反向力矩”的映射关系。Super Dial 采用双环 PID 控制:
- 外环(位置环):接收 LVGL UI 层下发的目标角度
θ_ref,计算位置误差e_θ = θ_ref - θ_actual,输出目标转速ω_ref。 - 内环(电流环):以
ω_ref为设定值,读取电机霍尔信号计算实际转速ω_actual,计算转速误差e_ω = ω_ref - ω_actual,经 PID 运算输出 PWM 占空比D,驱动 EG2133 控制相电流。
关键参数经实测整定:
- 位置环 P=0.8,I=0.02,D=0.05(单位:rad/s per rad)
- 电流环 P=1.2,I=0.15,D=0.0(纯 PI,避免电流超调)
为提升用户体验,算法加入两项非线性补偿:
- 死区补偿:当
|e_θ| < 0.5°时,输出D=0,消除微小抖动; - 点击反馈:检测到
dθ/dt突变(如双击动作),瞬时施加D=100%反向 PWM,持续 15 ms,模拟物理按钮触感。
4.3 编码器数据处理
MT6701 输出 14 位角度值(0–16383),但原始数据含量化噪声与温度漂移。软件层实施三级滤波:
- 硬件同步采样:SPI 传输在
motor_task中以 20 kHz 固定频率触发,避免软件延时引入相位误差。 - 滑动平均滤波:对连续 8 个采样值求均值,抑制高频噪声。
- 角度解缠绕:检测相邻采样值差值
Δθ,若|Δθ| > 8192,则按Δθ = Δθ - 16384 * sign(Δθ)校正,解决 14 位计数器溢出导致的角度跳变。
最终输出角度分辨率达 0.022°(360°/16384),满足 Surface Dial 标称的 0.03° 精度要求。
5. BOM 清单与器件选型依据
| 序号 | 器件 | 型号 | 数量 | 选型依据 |
|---|---|---|---|---|
| 1 | 主控 MCU | ESP32-S3-N16R8 | 1 | 集成 USB Device、Wi-Fi、BT,Flash 容量满足 LVGL+OTA |
| 2 | 电源管理 | IP5306 | 1 | 支持锂电池充放电管理,内置 LDO,成本低于 BQ2407x 系列 |
| 3 | DC-DC 降压 | MP2153GQZ-Z | 1 | 3A 输出,1.5 MHz 开关频率,小封装(QFN-10) |
| 4 | 电机驱动 | EG2133 | 1 | 三相预驱,集成死区控制,兼容 3205 系列电机驱动时序 |
| 5 | 磁编码器 | MT6701 | 1 | 14 位分辨率,SPI 接口,-40°C~125°C 工作温度 |
| 6 | TFT 屏幕 | GC9A01 + 圆形玻璃 | 1 | 160×160 分辨率,SPI 接口,圆形切割成熟,成本可控 |
| 7 | 无刷电机 | 3205B | 1 | 高功率密度,低齿槽转矩,供应链稳定 |
| 8 | USB 接口 | UCB1218-AB-A | 1 | Type-C 插座,带 EMI 滤波,支持 3A 电流 |
| 9 | 电池 | 3.7V 500mAh 锂聚合物 | 1 | 尺寸适配底座空间,500mAh 提供 4 小时续航 |
6. 调试与维护指南
6.1 常见故障排查
- USB 无法识别:首先确认 C10/C11 电容已移除;其次检查 Type-C 插座焊接是否虚焊,D+/D- 是否短路;最后用万用表测量 VBUS 是否有 5V 输入。
- 电机不转动:测量 EN 引脚电压是否为低电平(正常应为 0V);用示波器观察 EG2133 的 HO/LO 输出波形,若无 PWM 信号,检查 ESP32-S3 的 GPIO 配置与
motor_task是否运行。 - 力反馈断续:用逻辑分析仪捕获 SPI_MISO 波形,确认 MT6701 数据是否连续;若存在丢帧,检查 SPI_CS 时序或编码器供电是否稳定。
- 屏幕显示异常:检查 GC9A01 的 RESET 引脚是否在上电时正确复位(需 10 ms 低电平);确认 RGB 信号线无短路,DE 信号是否稳定。
6.2 固件烧录流程
- USB 直连烧录(推荐):使用
flash_download_tool_3.9.2.exe,选择 ESP32-S3 芯片,Load Mode设为USB,Download Path指向super_dial_change_img.bin,Address设为0x0,选择对应 COM 口,点击Start。烧录完成后需断电重启,否则 USB HID 功能不生效。 - OTA 升级:设备启动后进入 WiFi 热点模式(SSID:
SUPER_DIAL_XXXX),手机连接后访问http://192.168.4.1,上传ota_change_img.bin。升级过程约 45 秒,期间屏幕显示旋转图标,不可断电。
7. 结构设计与装配要点
四个 3D 打印件(电机适配器、转子套、底座、屏幕支架)采用 PLA 材料,壁厚 1.2 mm(忽略切片软件提示的 0.8 mm 警告)。关键装配公差控制如下:
- 电机同轴度:电机适配器内孔与转子套外径配合公差 H7/g6,装配后电机轴线与屏幕中心线偏移 <0.03 mm。
- 排线张力控制:8P 排线在电机中心孔内预留 2 mm 弯曲半径,避免反复弯折导致断裂;铜柱焊接后,用游标卡尺测量其顶端平面度,偏差 <0.02 mm。
- 屏幕贴合:GC9A01 玻璃与 PCB 间使用 OCA 光学胶,贴合前用异丙醇清洁表面,真空袋抽气 10 分钟排除气泡。
整机组装完成后,需进行 24 小时老化测试:连续旋转旋钮,监测电池温升(≤15°C)、USB 通信丢包率(0%)、HID 报文延迟(<8 ms)。