四电机控制器实战(一):系统架构与硬件设计 电子说
一个从零做到量产的四腿电动升降桌控制器:CH32L103 裸机固件 + 4 路 HT8251A H 桥驱动 + 霍尔编码器位置闭环。本文是这个系列的第一篇,讲清楚整体硬件拓扑、引脚分配和软件分层,为后面几篇(电机驱动、同步算法、位置反馈、异常检测、工程化)打底。
一、需求与硬件选型
四腿电动升降桌的核心诉求是:四根桌腿的电机要"同速同高"地升降,桌面不能歪、不能卡。看似简单,但四台电机天然存在负载差异和个体差异,这才是真正的难点。
硬件清单如下:
| 器件 | 型号 | 数量 | 作用 |
| 主控 MCU | CH32L103C8T6(RISC-V RV32,96MHz,64K Flash / 20K SRAM) | 1 | 全部控制逻辑 |
| 电机驱动 | HT8251AREZ(TI DRV8251A 国产兼容,N 沟 H 桥,4.5~48V,4.1A 峰值) | 4 | 每路驱动一台有刷直流电机 |
| 位置反馈 | 霍尔传感器(每电机 2 个,HAL1/HAL2 正交对) | 8 | 方向 + 位置 + 测速 |
| 电流反馈 | HT8251A 内置 IPROPI 电流镜(1575µA/A) | 4 | 堵转/过流检测 |
| 外部存储 | BL24C512A(512Kbit EEPROM,I2C2) | 1 | 配置双备份 |
| 电源 | 30V 母线 → KP52140x LDO(5V/3.3V) | — | 电机供电 + 逻辑供电 |
| 调试 | WCH-LinkE(SWD) | 1 | 烧录 + 串口 |
选型的两个关键决策:
MCU 用 CH32L103 而不是 STM32:RISC-V 内核 + 国产供货稳定,96MHz 跑裸机闭环绰绰有余。
驱动用 HT8251A(DRV8251A 兼容)而不是分立 MOSFET:内置电荷泵 + 电流镜(IPROPI),省掉外部采样电阻,4 路电机只需 4 颗 SOP8 芯片。
二、系统框图
flowchart TB
subgraph MCU["CH32L103C8T6 (96MHz)"]
TIM2["TIM2 PWM
(M1/M2)"]
TIM4["TIM4 PWM
(M3/M4)"]
EXTI["EXTI 霍尔中断
(8路)"]
ADC["ADC1 电流采样
(4路, DMA+EMA)"]
I2C["I2C2 EEPROM"]
UART["UART1 双协议"]
CDC["USB CDC 调试"]
ALG["运动控制
同步算法/异常检测"]
end
TIM2 -- >|"IN1/IN2 ×2"| DRV1[HT8251A ×2]
TIM4 -- >|"IN1/IN2 ×2"| DRV2[HT8251A ×2]
DRV1 -- >|"IPROPI"| ADC
DRV2 -- >|"IPROPI"| ADC
DRV1 -- > M1[M1/M2 有刷电机]
DRV2 -- > M2[M3/M4 有刷电机]
M1 -- >|"霍尔 ×4"| EXTI
M2 -- >|"霍尔 ×4"| EXTI
EXTI -- > ALG
ADC -- > ALG
ALG -- > TIM2
ALG -- > TIM4
I2C -- > EEPROM[BL24C512A]
UART -- > PC[上位机工具]
UART -- > HC[手控器]
CDC -- > LOG[调试日志]
三、引脚映射
一张表看清全部资源分配(CH32L103C8T6 共 32 个可用 IO,这里几乎用满):
| 引脚 | 功能 | 备注 |
| PA0~PA3 | M1_IN1/M1_IN2/M2_IN1/M2_IN2 | TIM2 CH1~CH4,PWM 输出 |
| PB6~PB9 | M3_IN1/M3_IN2/M4_IN1/M4_IN2 | TIM4 CH1~CH4,PWM 输出 |
| PA4~PA7 | M1~M4 电流采样 | ADC1 CH4~CH7,接 IPROPI |
| PB0/PB1 | M1 霍尔 HAL1/HAL2 | EXTI0/EXTI1 |
| PB3/PB2 | M2 霍尔 HAL1/HAL2 | EXTI3/EXTI2 |
| PB4/PB5 | M3 霍尔 HAL1/HAL2 | EXTI4/EXTI5 |
| PA8/PA15 | M4 霍尔 HAL1/HAL2 | EXTI8/EXTI15 |
| PA9/PA10 | UART1 TX/RX | 9600bps,双协议 |
| PB10/PB11 | I2C2 SCL/SDA | 接 BL24C512A |
| PA11/PA12 | USB D-/D+ | USB CDC 调试日志 |
| PA13/PA14 | SWDIO/SWCLK | 烧录调试 |
| PC13 | 状态 LED | RTC 域,开漏输出 |
| PB12~PB15 | 无线模块预留 | SPI2 复用 |
一个容易踩的坑:PB3/PB4 复位后默认是 JTAG 的 JTDI/JNTRST,会抢走 M2/M3 的霍尔输入。代码里必须把 AFIO->PCFR1 的 SW_CFG 切到 SWD-only 才能把 PB3/PB4 释放成普通 GPIO。
四、软件分层架构
固件采用裸机 + 分层设计,无 RTOS,靠 SysTick 1ms 节拍 + 主循环 10ms 调度:
| 层 | 模块 | 职责 |
| 驱动层 | motor.c / hall.c / adc.c / uart.c / eeprom_i2c.c | PWM、EXTI 计数、ADC 采样、串口、I2C |
| 运动控制层 | motion.c / pid.c / calibration.c | 组同步、斜坡、PID、校准 |
| 安全层 | handctrl.c(Live 故障检测) | 堵转/掉线/限位/越界判定 |
| 协议层 | protocol.c / handctrl.c(帧解析) | 0xAA 上位机协议 + 0xA5 手控器协议 |
| 应用层 | main.c | 主循环编排、看门狗喂狗 |
核心运行节奏:
五、核心数据结构
三块最核心的内存结构:
全局数组 MotorInfo motors[4]、HallInfo hall_info[4],配合 m_pins[4][2] 查找表,把"4 电机 × 2 输入引脚"的重复逻辑全部参数化,避免了 switch/case 满天飞。
六、配置存储设计
配置需要断电保存,采用双后端 + 三要素校验:
主存储:内部 Flash 末页 0x0800FF00(256B,packed 结构)
备份存储:外部 BL24C512A EEPROM
三要素校验:单调递增 write_count(防回滚)+ 随机 write_magic(防重复写)+ CRC32(防损坏)
一致性:上电比较两边 write_count 取最新,自动覆盖较旧后端
DeskConfig 布局(V8)节选:
| 字段 | 说明 |
| magic / version | 0x44434546 + 版本号 |
| mcu_chipid / driver_id | 安全绑定(防抄板/防替换) |
| motor_home_pos / travel / pulses[4] | 各电机行程标定 |
| motor_current_limit[4] | 电流限值 |
| group[0..3] | 组配置(掩码/方向/速度/预设高度/同步增益) |
| hall_polarity[4] | 每电机霍尔极性 |
| write_count / write_magic / write_crc | 完整性三要素 |
安全绑定用的是 CHIPID + 驱动器ID + 主密钥(0x4D4F544A),未绑定的板子无法写入配置——这在量产防呆场景很实用。
七、小结
这一篇先把骨架搭起来:一颗 96MHz 的 RISC-V MCU,配 4 颗 SOP8 的 H 桥驱动,靠 8 个霍尔传感器做位置闭环,IPROPI 电流镜做电流反馈,Flash+EEPROM 双备份存配置。
后面几篇会深入最难的部分:
第二篇:HT8251A 的 PWM 控制细节,以及一个隐藏很深的坑——它到底是用"自举电容"还是"电荷泵"?
第三篇:四电机同步算法是怎么从 PID 一路演进到"追最慢者 + 连续 CCR + PI 前馈"的。
第四篇:霍尔编码器为什么用 1× 单边沿而不是 4× 正交解码。
第五篇:堵转、掉线、限位……六道防线的故障判定体系。
第六篇:协议、烧录、打包,以及那些让人想砸键盘的环境坑。
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !