ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

TC78B043FNG与STM32F107联合实现三相BLDC电机驱动方案

TC78B043FNG与STM32F107联合实现三相BLDC电机驱动方案 做工业控制和机器人项目绕不开三相无刷直流电机BLDC。前阵子我基于东芝 TC78B043FNG 和 STM32F107VCT6 搭了一套三相 BLDC 驱动方案硬件上由专用预驱动芯片负责换相和栅极驱动软件上用 STM32 跑速度闭环和通信逻辑。这篇把整套方案从架构选型、硬件接法、软件设计到调试排障完整整理出来适合正在做工业电机驱动、机器人关节或自动化设备的人参考。TC78B043FNG 这种专用电机预驱动芯片把 BLDC 最麻烦的换相逻辑做进了硬件STM32F107VCT6 则是 Cortex-M3 内核的通用 MCU接口丰富、定时器多、CAN 和以太网都有。两者配合等于把“功率级控制”和“上层控制”分成两层系统边界清楚代码量小稳定性和可维护性都比纯 MCU 硬啃换相好不少。下面的内容全部基于我实际调试的板子涉及具体引脚和功能的地方也请和你手里的官方数据手册交叉核对。1. 为什么要用“驱动芯片MCU”这套架构1.1 TC78B043FNG 到底替你干了什么先说芯片侧。TC78B043FNG 是东芝面向三相 BLDC 电机推出的预驱动 IC内部集成了霍尔信号处理、换相逻辑、PWM 驱动和栅极驱动电路。你在外面只需要接六颗 MOSFET 组成三相全桥芯片负责把霍尔信号译成上下管的开关时序再以 PWM 方式输出到栅极。速度指令从 VSP 引脚进来方向由方向引脚数据手册里通常标作 F/R 或 DIR控制片内还带过流、过压、欠压、过热和堵转保护。很多第一次接触的人会把 TC78B043FNG 当成“H 桥驱动芯片”一类的东西其实差别很大。普通 H 桥芯片里面直接把功率管集成好了电机电流流过芯片本体而 TC78B043FNG 属于 pre-driver功率管放在外面芯片只负责控制外部 MOSFET 的栅极。好处是功率管可以按电机电流和电压等级自由选几十瓦到几百瓦都能覆盖坏处是栅极驱动、自举电容和 PCB 布局都得你自己负责。这个分工决定了整个硬件设计的思路后面我会展开讲。1.2 STM32F107VCT6 在这套方案里管什么既然换相和栅极驱动都交给 TC78B043FNGSTM32F107VCT6 就专心做上层控制。以我这次项目为例MCU 负责四件事产生速度指令 PWM、读取 FG 转速反馈、跑 PID 闭环、处理通信和故障逻辑。STM32F107VCT6 主频虽然只有 72MHz但对这种两层架构来说完全够用200 微秒一个速度环控制周期跑起来绰绰有余还能留出大量资源给通信协议。我选中这颗芯片还有一个现实原因工业现场要接主站、机器人总线上要连控制器STM32F107 自带 CAN、USART、Ethernet 接口不用再外扩一堆接口芯片。项目前期用串口调试上线后用 CAN 通信后期真要接以太网也有余地硬件不用改版。这种“一辆车多个用途”的余量在项目规划阶段挺重要真等到现场才缺接口改板子成本和周期都很痛。1.3 为什么不直接上 FOC 或 MCU 自换相这个问题没有标准答案但每个做电机控制的人都会问。如果项目要求低速大扭矩、动态响应极强、全速度范围都要高效率那 FOC 是更好的选择很多产品直接用 STM32F4 或者 DSP 做三电阻采样、单电阻采样。但 FOC 的调试门槛高电流环、位置解算、PI 调参、观测器这些环节没有几个月很难稳定而且对硬件布局、采样精度要求也高。反过来看如果电机本身是带霍尔的三相 BLDC应用场景是风机、泵、输送带、机器人关节的常规速度闭环用 TC78B043FNG 这种硬件换相方案能省掉大量开发时间。它内部把霍尔信号到换相输出这一整套逻辑都处理好了MCU 只需要给速度和方向外部引脚配置一下驱动模式就能转。我这次的目标是“可控、稳定、能交付”不是做论文级控制所以选了这套两层架构。我的观点一直很明确方案没有绝对好坏只有适不适合当前项目的成本、周期和性能要求。2. 硬件设计从哪下手2.1 功率级六管全桥和 MOSFET 选型TC78B043FNG 是预驱动功率部分完全由外围 MOSFET 决定。以 24V/5A 这个常见工业电压平台为例我留了 1.5 到 2 倍电压余量和 2 倍电流余量选 60V/10A 左右的 N-MOSFET。选型时重点看 RDS(on)、Qg 和 Ciss 三个参数RDS(on) 决定发热Qg 决定驱动能力要求Ciss 决定开关速度。预驱芯片的输出能力有限如果管子 Qg 很大、栅极电阻又加得很大开关损耗会明显上升反过来 Qg 太小也不一定是好事快速开关产生的高 dv/dt 会在 PCB 寄生电感上引起振铃。我实际用下来栅极电阻在 5 到 22 欧姆之间调整比较舒服既能控制开关斜率又不会太拖慢速度。上管驱动要用自举电路。TC78B043FNG 这类预驱芯片的栅极驱动输出拓扑一般依赖自举电容外围需要自己放电容到引脚附近具体容量按 PWM 频率和栅极电荷量来算。常见做法是上下管各放一组 100nF 加 1uF 陶瓷电容并联尽量贴近芯片引脚。电容太大充放电慢太小又存不了足够的栅极电荷高频时上管驱动电压会跌波形一眼就能看出来。电机接线长或者现场干扰多的场景还建议在电机端子处加共模、差模滤波不然后面 EMC 测试会非常难受。2.2 芯片外围霍尔、速度、方向引脚的接法TC78B043FNG 的霍尔输入一般是三个比较器输入口分别接霍尔传感器的 A、B、C 信号。霍尔器件通常做成开漏输出所以输入引脚上要加上拉电阻上拉电压根据芯片的霍尔电源域来选我习惯用 5V 或者 3.3V具体看数据手册。信号线上串一个几百欧到 1k 欧的电阻再在芯片引脚处并联 100pF 电容到地可以滤掉来自电机侧的共模干扰。这个看似不起眼的滤波对长线霍尔信号的稳定性帮助非常大。速度指令 VSP 可以用模拟电压也可以由 MCU 直接输出 PWM 后经过 RC 滤波再送进来具体支持哪种方式要看数据手册。模拟电压的优点是线性度好、响应平滑缺点是长线传输时容易被干扰。PWM 方式的好处是 STM32 用定时器直接输出就行省掉一路模拟器件。我这次为了简化 PCB让 STM32 输出 20kHz 左右的 PWM 到 VSP外接一级 RC 低通滤波时间常数大约 1ms转速指令平滑又跟手。方向引脚和使能引脚我的经验是方向切换必须加软件时序保护不要在电机高速运转时瞬间反转否则过流保护很容易触发严重一点甚至烧功率管。2.3 STM32F107 与驱动芯片的信号连接STM32F107VCT6 和 TC78B043FNG 之间的连接其实很简洁核心就是下面几类信号定时器 PWM 输出到 VSP速度指令GPIO 到方向引脚正反转控制GPIO 到使能/待机引脚软启停FG 输出到 STM32 定时器输入捕获转速反馈故障输出到 STM32 外部中断异常处理FG 信号如果是开漏输出MCU 侧也要加上拉。我建议把 FG 接到 STM32 的 TIM2 或 TIM3 输入捕获通道测量两个上升沿的时间间隔换算转速。为了输入端更干净MCU 引脚前加 1k 欧串联电阻和 1nF 电容防止 FG 线在电机启停瞬间串入毛刺、触发误中断。霍尔信号本身可以不接 MCU但我的建议是做一个硬件预留把 A/B/C 三路霍尔同时引一份到 MCU 的输入捕获引脚上。后面如果想升级位置控制、做更精细的转速估算这三根线就用上了。改版比多接三根线的成本高得多这个账要算清楚。2.4 电源、电流采样和保护电路整套系统的电源一般分三路电机主电源 VM、芯片逻辑电源、MCU 数字电源。VM 电压范围要覆盖电机额定电压入口处加极性反接保护和电解电容、陶瓷电容组合的滤波电路电解电容负责储能陶瓷电容负责滤高频。这里有个细节我踩过坑VM 的地和控制地要做星形单点接地不要在板子上大面积共地否则功率地在电机换相瞬间产生的噪声能把 FG 信号和霍尔信号全部污染掉查起来极其痛苦。电流采样如果只做保护用 TC78B043FNG 的电流限制功能就够了外部一个采样电阻设定阈值比较器输出接 MCU 做故障输入。如果应用还要扭矩限制需要把采样信号引到 STM32 的 ADC 上实时读到电流值。经验分享采样电阻放在下桥低端和地之间用开尔文接法单独走一对检测线到芯片或 ADC 的采样引脚和主功率走线分开不然采样电阻上的压降会被功率路径误差淹没。过流阈值不要正好卡在额定电流上要留 20% 到 30% 余量因为工业电机堵转瞬间峰值电流是额定的好几倍阈值太紧会在正常脉冲负载下频繁误报。3. 软件与控制逻辑实现3.1 定时器资源规划和 PWM 初始化STM32F107VCT6 的定时器很多建议先把定时器用途规划好不然等代码写多了到处抢定时器很烦。我的分配是这样TIM1产生 VSP 速度指令 PWM配置为 20kHzTIM2输入捕获 FG 信号测周期算转速TIM3扫按键、指示灯这类非实时逻辑的时基USART2、CAN和上位机、主站通信PWM 初始化核心代码大概这样的思路注意用标准外设库实现。TIM1 是 16 位定时器ARR 不能超过 65535还要记得高级定时器需要单独使能主输出TIM_TimeBaseInitTypeDef TIM_InitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // 72MHz 时钟预分频 71 - 1MHz // 计数周期 49 - 1MHz/50 20kHz RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); TIM_TimeBaseStructInit(TIM_InitStructure); TIM_InitStructure.TIM_Prescaler 71; TIM_InitStructure.TIM_Period 49; TIM_InitStructure.TIM_ClockDivision 0; TIM_InitStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, TIM_InitStructure); TIM_OCStructInit(TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse 0; TIM_OC1Init(TIM1, TIM_OCInitStructure); TIM_CtrlPWMOutputs(TIM1, ENABLE); TIM_Cmd(TIM1, ENABLE);注意使用 TIM1 这类高级定时器时必须调用 TIM_CtrlPWMOutputs 才会真正输出波形。我第一次用这块芯片的时候漏了这一行程序怎么看都没问题示波器上就是没输出排查了半个多小时。另外别忘了配置对应 GPIO 为复用推挽输出并打开 GPIO 和 AFIO 时钟。3.2 FG 测速从脉冲周期换算转速FG 信号是转子每转输出若干个脉冲具体个数取决于电机极对数以及驱动芯片有没有做分频。换算公式不复杂转速值r/min 60 × 每秒脉冲数 / 每转脉冲数。举个例子如果电机是 4 对极、芯片每转输出 60 个脉冲那么输入捕获频率 500Hz 时转速就是 500 × 60 / 60 500 r/min。用输入捕获测量两个上升沿间隔时间直接算比外部计数器累加再定时读取延迟更小对动态过程更友好。输入捕获中断里可以这样处理uint32_t lastCounter 0; void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_CC2) ! RESET) { uint32_t now TIM_GetCapture2(TIM2); uint32_t delta now - lastCounter; lastCounter now; // 假设输入捕获计数时钟 1MHz500Hz 对应 delta 2000 if (delta 0) { uint32_t freqHz 1000000UL / delta; // 再根据每转脉冲数换算转速作为速度环反馈 } TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); } }这里有个很实际的坑电机转速很低时相邻两个上升沿间隔很长用定时器最大计数值去量很容易溢出。低速时我改成了固定时间窗口内统计脉冲个数的方式中高速继续用周期法两者之间按转速自动切换并且在切换点加滞回。这个逻辑后面第 5 节我会专门说一个案例。3.3 速度环 PID 和启停时序MCU 跑速度环最基础的就是一个 PID。我这次没有做复杂的自整定直接增量式 PID输出限幅到 PWM 占空比范围。参数粗调经验是这样的先只给比例系数做阶跃响应看超调量逐渐加大积分系数消除静差微分系数在电机这种大惯性负载上通常给很小甚至直接不用。另外PWM 占空比不能随随便便直接给 100%启动瞬间占空比过大会触发芯片过流保护还会冲击负载机械结构。我加了约 1 秒的 S 曲线软启动让占空比从 0 缓升到目标值对机械和电气都有好处。启停时序我坚持一个原则先使能驱动芯片再给速度指令先停速度指令再禁能。反过来操作会出现一个很危险的状态——电机被负载拖动旋转但驱动已经禁能扭矩瞬间丢失对带负载的工业设备存在安全隐患。方向反转前我在软件里严格做减速、停止、换向、再加速的流程整个过程由状态机控制绝不在运行态直接翻转方向位。3.4 状态机和 CAN/串口通信为了让这套系统在工业现场能稳定运行我把控制逻辑做成了状态机上电检测、待机、软启动、运行、减速停车、故障停机、故障恢复。每个状态都有明确的进入条件和退出条件故障无论发生在哪个状态都会强制跳转到故障停机只有异常解除并且收到复位命令后才能回到待机。这套状态机的核心价值是把程序流程可视化出了问题看状态字就能定位不用靠猜。通信层我配了 CAN 和串口两套接口CAN 接设备主站串口留作调试和参数修改。CAN 报文主要传目标转速、当前转速、启停命令和故障码串口则处理 PID 参数在线修改和曲线记录。开发阶段用串口看日志、改参数量产阶段切到 CAN互不干扰。STM32F107VCT6 自带 CAN 控制器外围只需要加一个收发器成本很可控这也是我选这颗芯片的原因之一。4. 调试步骤与波形现场4.1 上电前的检查清单电路板打样回来不要直接上高压。我的习惯是先用万用表测电源正负极有没有短路、MOSFET 方向对不对、芯片方向对不对确认之后再上电。上电顺序也有讲究先只给 MCU 供电烧录一个最简单的 GPIO 翻转程序验证最小系统再给 TC78B043FNG 的逻辑电源用示波器看供电引脚是否稳定最后才给 VM 上电。每一步都确认正常了再进入电机调试。强烈建议准备一个可限流的直流电源一开始把电流上限设到电机额定电流的 30% 左右。万一接线错误或者程序里 PWM 输出异常限流电源可以把故障损坏限制在最小范围。这一步真的不能省我见过不少同事直接上额定电压大电流炸管之后只能拆板子量损坏元件一查就是半天时间和物料损失都不小。4.2 开环跑通再闭环第一次上电让电机转我不会直接挂 PID 闭环而是用开环手动给定占空比的方式。在待机状态通过串口发送一个 5% 左右的固定 PWM 占空比观察电机是否转动、有没有异响、电流是否正常。确认转向正确后再逐步增加占空比记录不同占空比对应的 FG 频率变化顺便验证测速算法。这一步能同时验证功率级、芯片配置和 FG 通道三个模块。开环能转、FG 测速也稳定之后我再切进闭环。闭环首次调试时PID 输出限幅要设得很窄我用 5% 到 20% 的可调范围起步避免意外飞车。目标转速也从低速开始300 r/min、500、800、1000 这样逐步往上加每个速度点都观察相电流波形和 FG 波形是否干净。每次改 PID 参数只改一个系数改完记录阶跃响应这样问题好定位。4.3 示波器要看的几个关键点调这种电机驱动系统示波器比万用表信息量大得多。我的探头上场顺序大概是VSP 引脚 PWM、某相上管栅极波形、某相下管栅极波形、输出相电压、FG 信号、相电流波形。VSP 引脚看占空比是否随指令变化、有没有毛刺上下管栅极波形看驱动电压幅值是否正常、有没有严重振铃、死区是否足够相电压包络能反映换相节奏带霍尔的正弦波驱动下相电压包络应该是比较平滑的正弦形状如果波形有明显的台阶或者毛刺多半是霍尔信号或者换相逻辑有问题FG 信号看边沿是否干净相电流用电流探头看峰值是否在设计范围、有没有尖峰。这些波形排查到哪一步卡住了问题基本就能定位到具体模块。相比只看程序逻辑这种“波形找问题”的方式效率高非常多调试新板子的时候我几乎不看代码先看波形。5. 常见问题与排查实录5.1 问题速查表这里整理一份问题速查表都是实际项目中比较容易遇到的情况现象可能原因排查优先级电机完全不动VSP 无信号、使能未拉高、电源未到位先测电源和使能电机抖动但转不起来霍尔接线错误、缺相、VSP 占空比过低查霍尔三路波形某相 MOS 温度明显偏高栅极驱动异常、自举电容失效测上管栅极波形过流保护频繁触发电流阈值太紧、MOS 开关速度太慢查采样电阻和栅极电阻FG 读数跳动FG 线有毛刺、测速算法在切换点抖动加滤波、改测速逻辑转速误差大PID 参数不合适、PWM 分辨率不足先调 Ki 再调 Kp5.2 几个印象深刻的坑第一个坑就是前面反复提到的高级定时器主输出使能。程序逻辑看起来完全没问题但 PWM 就是没有输出差点以为芯片坏了。后来查标准外设库才发现 TIM1 需要额外调 TIM_CtrlPWMOutputs这是一个非常经典的 STM32 高级定时器坑。如果你用的也是标准外设库建议把这个调用写进初始化函数免得后面自己踩。第二个坑是霍尔传感器线束太长。我最初为了结构布局方便把霍尔线走到了 50 厘米结果电机低速时偶尔失步而且没有固定规律。用示波器看霍尔输入引脚边沿明显有抖动和振铃。处理方法是信号线串 470 欧电阻、芯片引脚处并 100pF 电容把线束重新整理并远离功率线。霍尔线确实不能太长长距离传输要么加屏蔽要么干脆考虑差分霍尔方案一步到位避免后续烦恼。第三个坑和测速算法切换有关。我在周期法和固定窗口计数法之间做了切换但切换点附近转速读数忽高忽低系统在这个临界区域容易来回震荡。最后处理是在切换点加了滞回窗口比如 300 r/min 以上用周期法250 r/min 以下用计数法中间区域两种方法交替读取然后做平滑问题才解决。这种边界条件如果不设滞回程序里的状态就可能在两个测速方法之间反复横跳曲线很难看控制效果也不好。6. 从速度控制到机器人关节应用扩展6.1 位置控制和扭矩限制怎么加如果机器人关节需要位置闭环可以在现有速度环外面再加一层位置环。MCU 通过霍尔信号或者外部编码器获取机械角度位置环输出作为速度环的目标值。STM32F107VCT6 的 64KB SRAM、256KB Flash 对这类算法来说足够我用过位置环加速度环双环结构控制周期 1ms运行很稳定。TC78B043FNG 内部硬件换相保证了扭矩输出比较平滑位置闭环做起来比方波驱动顺畅很多。扭矩限制也不难把电流采样信号送 STM32 的 ADC软件里做电流峰值判断。一旦采样电流超过阈值就把速度环输出限幅压低相当于一个软扭矩限制。真要精确扭矩控制还是得靠 FOC但在很多协作机器人辅助关节、自动导引车这类应用里速度环加软扭矩限制已经能满足基本安全需求成本却低很多。6.2 多轴扩展和 CAN 总线组网STM32F107VCT6 有两路 CAN配合 TC78B043FNG单板控制两个关节绰绰有余。如果一台设备轴数更多可以采用一主多从的 CAN 网络每个从节点负责一个关节主控制器发布目标位置和速度各从节点本地闭环。这种架构的突出优势是单点故障隔离好某一个关节驱动出问题不会把整台机器拖垮。总线上注意加 120 欧端接电阻拓扑尽量采用菊花链或者星形工业场景下通信可靠性优先级很高。6.3 什么时候该换 FOC最后说句公道话。TC78B043FNG 这套方案的局限在于它始终是“硬件换相加正弦波近似”的驱动方式对无感零速启动、超低速大扭矩、六轴工业机械臂这类高性能伺服场景实在力不从心。如果产品后面要走高性能伺服路线那还是趁早规划带电流环的 FOC 方案该花的调试周期跑不掉。但如果是风机、水泵、AGV 轮毂、协作机器人辅助关节、自动化产线输送机构这类场景这套方案已经足够好而且开发成本和量产稳定性更有优势。选方案就像选工具我向来建议按需求边界来不为用不到的性能多掏钱。做这个项目给我最大的体会是很多时候我们容易被“方案先进性”带着走看到一个控制难点就本能想上更复杂的算法。但工业项目评估的最终标准永远是稳定、可维护、成本可控。TC78B043FNG 加 STM32F107VCT6 的组合核心价值就是让换相这种脏活累活交给硬件把上层逻辑留在 MCU 里软件结构清晰出了问题容易定位。如果让我再选一次只要没有极端动态性能需求我大概率还会选这个架构只不过从设计第一天就会把霍尔信号完整引到 MCU为后续升级位置控制留好后路。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进