1. 项目缘起与整体方案拆解
1.1 为什么选这对组合:TC78B043FNG + PIC18F86J11
工业现场和机器人关节驱动里,三相 BLDC 电机的控制方案多如牛毛,从专用驱动 IC 到 DSP、再到通用 MCU 加预驱,各有各的活法。我这次选TC78B043FNG搭配PIC18F86J11,不是拍脑袋,而是踩过几次坑之后收敛出来的结果。
先说 TC78B043FNG。它是东芝那颗三相无刷电机预驱芯片,内置 1.5A 栅极驱动能力,支持 6 路 PWM 输入,带电流检测放大器和过流、过温、欠压保护。最关键的一点:它把三相桥的上下桥臂驱动逻辑、死区时间、电荷泵都集成进去了,你只需要外挂 6 颗 N 沟道 MOSFET 就能搭出完整的三相逆变桥。对于 24V~48V 母线、几百瓦级别的机器人关节电机,这个功率段用分立 MOS 加预驱,比用集成 IPM 灵活,散热也好处理。
再说 PIC18F86J11。这颗 8 位 MCU 主频 64MHz,带 12 位 ADC、多个 PWM 模块、正交编码器接口(QEI),还有 96KB Flash 和 4KB RAM。有人会问,都什么年代了还用 8 位机跑 BLDC?我的实测结论是:对于带霍尔传感器的六步换相控制,PIC18F86J11 完全够用,而且它的 QEI 模块可以直接接增量式编码器做速度闭环,省掉一路外部计数。它的 PWM 模块支持互补输出和可编程死区,配合 TC78B043FNG 的输入逻辑非常顺手。
这套组合的定位很清晰:中低压、中功率、需要霍尔换相或编码器闭环的工业与机器人三相 BLDC 驱动。适合做机器人关节、AGV 驱动轮、传送带、云台、协作机器人末端执行器这类场景。如果你要做的是三相光伏逆变那种并网级的高压大功率,这套方案不合适,那是另一条技术路线。
1.2 整体控制架构长什么样
整个系统的信号流我画不出来图(这里不用图),但可以用文字讲清楚。母线电源经过防反接和滤波后,接到三相桥的直流输入端。三相桥由 6 颗 MOSFET 组成,栅极分别接到 TC78B043FNG 的 6 路输出。TC78B043FNG 的 6 路输入来自 PIC18F86J11 的 PWM 模块,MCU 根据霍尔传感器或编码器的反馈决定换相时刻和占空比。
电流采样用一颗低阻值分流电阻放在母线负极(低端采样),信号送进 TC78B043FNG 的电流检测放大器,放大后的模拟电压再回到 MCU 的 ADC。这样既能做过流保护,也能做简单的电流环。速度反馈方面,如果电机自带霍尔,就用霍尔做换相和低速测速;如果带增量编码器,就接 QEI 做高分辨率速度闭环。
这里有个设计取舍要讲清楚:为什么用低端采样而不是相电流采样。低端采样只需要一颗分流电阻和一个放大器,成本低、布线简单,缺点是 PWM 占空比接近 100% 时采样窗口太窄。对于机器人关节这种占空比不会长期顶满的场景,低端采样完全够用。如果你要做三相维也纳 PFC 那种对电流波形要求极高的场合,那就得用相电流采样甚至隔离采样,那是另一个量级的设计。
1.3 方案选型的几个关键考量
选这套方案之前,我对比过几种常见路线。用集成 IPM(比如带驱动和 MOS 一体的模块)省事,但功率做不大,散热受限,而且一旦炸管整个模块报废。用 DSP 跑 FOC 性能好,但开发周期长,对团队要求高。用专用 BLDC 控制芯片(比如某些带换相逻辑的 IC)简单,但灵活性差,想改控制策略就抓瞎。
TC78B043FNG + PIC18F86J11 的组合,本质上是把功率级和控制级解耦。功率级交给预驱加分立 MOS,想换更大电流的 MOS 直接换,预驱不用动。控制级交给通用 MCU,六步换相、速度环、保护逻辑都能自己写,想加什么功能加什么功能。这种解耦带来的灵活性,在工业现场面对各种非标需求时特别值钱。
还有一点是供货和成本。TC78B043FNG 和 PIC18F86J11 都是成熟料号,不是那种生命周期末期的冷门货。PIC18 系列的工具链成熟,编译器、调试器、代码示例都齐全,新手也能快速上手。对于中小批量工业产品,这一点比极限性能更重要。
2. 核心细节解析与实操要点
2.1 TC78B043FNG 的引脚逻辑与死区设置
TC78B043FNG 的输入逻辑是理解整个驱动的基础。它有 6 路输入(U、V、W 各上下桥),但并不是简单的独立控制。芯片内部有防直通逻辑,但我强烈建议在 MCU 侧也设置死区,双保险。原因很简单:如果只依赖芯片内部死区,一旦输入信号有毛刺或者时序错乱,内部逻辑可能来不及反应,上下桥同时导通就是炸管。
死区时间怎么算?假设你用 IRF3205 这类 MOS,开通延迟约 20ns,关断延迟约 50ns,那么死区至少要大于关断延迟减开通延迟,再留余量。实际我设的是500ns 到 1us。在 PIC18F86J11 的 PWM 模块里,死区时间由 PWM 控制寄存器配置,计算公式是:
死区时间 = (死区计数值) × (1 / PWM 时钟频率)
假设 PWM 时钟是 64MHz,死区计数值设为 32,那么死区时间 = 32 / 64MHz = 500ns。这个值在 20kHz PWM 频率下占空比损失很小,但足够安全。
TC78B043FNG 的电流检测放大器增益是固定的(具体倍数查数据手册),输出直接进 MCU 的 ADC。这里要注意:放大器的输出范围要匹配 ADC 参考电压。如果放大器输出最大 3.3V,而 ADC 参考是 5V,那就浪费了动态范围。我的做法是把 ADC 参考设成和放大器供电一致,或者用外部基准。
2.2 PIC18F86J11 的 PWM 与 QEI 配置
PIC18F86J11 的 PWM 模块配置有几个坑。首先是PWM 时基,它可以用 Timer2 或 Timer4 作为时基。我一般用 Timer2,因为它的后分频器配置灵活。PWM 频率计算公式:
PWM 频率 = Fosc / (4 × (PR2 + 1) × 预分频)
假设 Fosc = 64MHz,预分频 = 1,想要 20kHz PWM,那么 PR2 = 64MHz / (4 × 20kHz) - 1 = 799。这个值在 16 位范围内,没问题。
QEI 模块的配置更讲究。QEI 可以工作在正交模式或霍尔模式。如果电机带增量编码器,用正交模式,4 倍频计数,分辨率直接翻四倍。如果只有霍尔,用霍尔模式,每个霍尔跳变计数一次。QEI 的计数方向自动识别,速度计算就是单位时间内的计数差值。我一般用 1ms 定时中断读一次 QEI 计数,算速度。
这里有个细节:QEI 的输入引脚要加滤波。工业现场干扰大,编码器信号线上容易串进噪声,导致计数错误。PIC18F86J11 的 QEI 输入有可编程数字滤波器,我一般设成最大滤波强度,牺牲一点响应速度换稳定性。实测下来,加了滤波之后,速度环的抖动明显减小。
2.3 霍尔换相表的生成与优化
带霍尔的三相 BLDC,换相逻辑就是一张表。三个霍尔传感器相隔 120 度安装,每个电周期产生 6 个状态,每个状态对应一组上下桥导通组合。标准换相表如下:
| 霍尔状态 (H3 H2 H1) | 导通相 | 上桥 | 下桥 |
|---|---|---|---|
| 001 | U+ V- | U | V |
| 011 | W+ V- | W | V |
| 010 | W+ U- | W | U |
| 110 | V+ U- | V | U |
| 100 | V+ W- | V | W |
| 101 | U+ W- | U | W |
这张表不是随便写的,它对应的是六步换相的固定顺序。每走一步,电机转过 60 电角度。换相时刻由霍尔跳变触发,MCU 在霍尔中断里查表,更新 PWM 输出。
但实际调试时你会发现,霍尔安装位置不可能完美 120 度,总有几个度的偏差。这个偏差会导致换相时刻提前或滞后,表现为电流波形不对称、效率下降、噪音增大。我的做法是:在霍尔中断里加一个可调的换相延迟,通过实验找到最佳值。具体操作是:固定转速,逐步调整延迟,观察母线电流,电流最小的那个点就是最佳换相点。
还有一个技巧:低速时用霍尔测速,高速时切换到编码器。霍尔每 60 电角度才跳一次,低速时测速分辨率太差。编码器每转几千个脉冲,高速时计数溢出风险大。两者结合,低速用霍尔保证换相正确,高速用编码器保证速度环精度。
3. 实操过程与核心环节实现
3.1 硬件搭建:从原理图到 PCB 的注意事项
硬件这块,我先说几个炸过管才总结出来的教训。第一,TC78B043FNG 的电荷泵电容必须靠近芯片引脚,走线越短越好。电荷泵负责给上桥驱动供电,如果电容远了,走线电感会导致泵电压不稳,上桥驱动不足,MOS 进入线性区发热炸管。我一般用 100nF 陶瓷电容,紧贴引脚。
第二,自举二极管和自举电容。TC78B043FNG 内部有自举电路,但外部自举电容还是要选好。自举电容太小,上桥驱动电压保持不住;太大,充电时间长,高频时来不及充。我一般用 1uF 陶瓷电容,配合快恢复自举二极管。实测 20kHz PWM 下,1uF 足够。
第三,分流电阻的选型。低端采样电阻的阻值决定了电流检测范围。假设你最大电流 10A,TC78B043FNG 电流放大器增益是 10 倍,ADC 参考 3.3V,那么分流电阻最大压降 = 3.3V / 10 = 0.33V,电阻值 = 0.33V / 10A = 33mΩ。但实际要留余量,我一般选 20mΩ 或 25mΩ。电阻功率 = I²R = 10² × 0.02 = 2W,所以要选 3W 以上的功率电阻,或者用两颗并联。
第四,MOS 驱动电阻。栅极串联电阻控制开关速度。电阻太小,开关快但 EMI 大;电阻太大,开关慢但发热多。我一般先用 10Ω 起步,用示波器看栅极波形,如果振铃严重就加大到 22Ω 或 33Ω。实测 20kHz 下,10Ω 到 22Ω 都能接受。
3.2 软件框架:从初始化到换相中断
软件框架我分成四层:硬件初始化层、换相控制层、速度环层、保护层。初始化层配置时钟、PWM、ADC、QEI、定时器、中断。换相控制层处理霍尔中断,查表更新 PWM。速度环层在定时中断里计算速度,跑 PI 调节器,更新占空比。保护层在 ADC 中断里检查电流,过流立即关断 PWM。
初始化顺序很重要。先配置时钟,再配置外设。PIC18F86J11 的时钟源可以用内部振荡器或外部晶振。工业场合我建议用外部晶振,精度高,温漂小。配置 PLL 到 64MHz 后,再配置 PWM 时基、QEI、ADC。ADC 要配置成自动采样,在 PWM 周期特定时刻触发,避开开关噪声。
换相中断是核心。霍尔信号接到 MCU 的外部中断引脚,三个霍尔信号经过异或后接到一个中断引脚,任何一个霍尔跳变都触发中断。中断服务程序里读三个霍尔引脚状态,查表,更新 PWM 输出。这里要注意:中断服务程序要短,只做换相,不做复杂计算。速度计算放到定时中断里。
速度环我用的是增量式 PI。公式是:
输出增量 = Kp × (误差 - 上次误差) + Ki × 误差
增量式 PI 的好处是不需要积分限幅,输出自然累加。Kp 和 Ki 的整定我一般先用经验值,然后实验调整。Kp 太大,速度超调振荡;Ki 太大,响应慢,稳态误差消除慢。实测下来,Kp 在 0.5 到 2 之间,Ki 在 0.01 到 0.1 之间,具体看电机惯量。
3.3 关键参数计算与实测记录
我拿一台 24V、100W、带霍尔的三相 BLDC 做实测。电机极对数是 4,额定转速 3000rpm,额定电流 5A。PWM 频率设 20kHz,死区 500ns,分流电阻 25mΩ。
速度计算:3000rpm = 50 转/秒,极对数 4,电频率 = 50 × 4 = 200Hz,电周期 5ms。每个电周期 6 个霍尔状态,所以霍尔跳变频率 = 200 × 6 = 1200Hz。也就是说,最高转速下霍尔中断每 0.83ms 触发一次。这个频率对 PIC18F86J11 来说毫无压力。
电流采样:最大电流 5A,分流电阻 25mΩ,压降 = 5 × 0.025 = 0.125V。TC78B043FNG 放大器增益假设 10 倍,输出 = 1.25V。ADC 12 位,参考 3.3V,分辨率 = 3.3V / 4096 = 0.8mV。电流分辨率 = 0.8mV / (10 × 0.025) = 3.2mA。这个分辨率做电流保护绰绰有余。
实测波形:空载启动,占空比从 0 慢慢加到 20%,电机开始转动。用示波器看霍尔信号和相电压,换相时刻基本对齐。加载到额定扭矩,电流稳定在 5A 左右,MOS 温升约 40 度(加散热片)。过流保护设在 8A,触发后 PWM 立即关断,电机自由停车。
这里有个实测发现:低速时(低于 100rpm),霍尔测速抖动很大,速度环输出波动。后来我把低速段的速度环带宽降低,同时用霍尔信号做换相、用编码器做测速,问题解决。如果你的电机没有编码器,低速段就只能牺牲一点速度精度,或者用无感算法估算速度,但那是另一个话题了。
4. 常见问题与排查技巧实录
4.1 电机不转或抖动:从电源查到换相表
电机不转,先查电源。母线电压有没有?预驱供电有没有?电荷泵电压有没有?这三个电压用万用表一量就知道。如果电荷泵电压不对,上桥驱动不了,电机肯定不转。电荷泵电压一般是母线电压加 10V 左右,如果只有母线电压,说明电荷泵没工作,查电荷泵电容和芯片使能引脚。
如果电源正常,电机抖动但不转,大概率是换相表错了。霍尔状态和导通相的对应关系,不同电机可能不一样。我的排查方法是:手动给一个固定霍尔状态,比如 001,然后手动导通 U+ V-,看电机是否往一个方向轻微转动。如果反转,说明换相表顺序反了,把表倒过来用。如果不动,说明霍尔状态读错了,查霍尔引脚定义。
还有一种情况是霍尔信号有毛刺,导致换相中断误触发。用示波器看霍尔信号,如果有尖峰,加 RC 滤波。我一般用 1kΩ 电阻加 100nF 电容,截止频率约 1.6kHz,对 1200Hz 的霍尔信号影响不大,但能滤掉高频毛刺。
4.2 过流保护误触发:采样时刻与滤波
过流保护误触发是常见问题。原因通常是采样时刻不对。低端采样在 PWM 周期内,只有下桥导通时才有电流流过分流电阻。如果你在 PWM 周期开始时采样,那时候下桥还没导通,采到的是零。如果你在 PWM 周期结束时采样,下桥可能已经关断了。
正确的采样时刻是PWM 周期中间,下桥导通期间。PIC18F86J11 的 ADC 可以配置成由 PWM 模块触发,触发点设在周期中间。这样每次采样都在下桥导通时,采到的电流才是真实的。
另一个原因是采样信号没滤波。开关噪声会耦合到电流信号上,导致 ADC 读数跳动。我在 ADC 输入加一个 RC 低通滤波,截止频率约 10kHz,对 20kHz PWM 的开关噪声有很好的抑制。同时软件里做多次采样取平均,我一般采 4 次去掉最大最小值再平均,效果很好。
4.3 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 电机不转 | 电源缺失 | 量母线、预驱、电荷泵电压 | 查供电电路 |
| 电机抖动 | 换相表错误 | 手动导通测试 | 调整换相表顺序 |
| 过流误触发 | 采样时刻不对 | 示波器看采样点 | 改 PWM 触发点 |
| 速度环振荡 | PI 参数不当 | 观察速度波形 | 降低 Kp,调整 Ki |
| MOS 发热严重 | 死区不足或驱动不足 | 看栅极波形 | 加大死区,减小栅极电阻 |
| 低速测速抖动 | 霍尔分辨率低 | 看速度反馈 | 低速用编码器或降带宽 |
| 高速失步 | 换相延迟不对 | 看电流波形 | 调整换相延迟 |
| 上桥不工作 | 电荷泵故障 | 量电荷泵电压 | 查电荷泵电容 |
4.4 几个独家避坑技巧
第一个技巧:上电先做自检。MCU 上电后,先不启动电机,而是依次检查母线电压、预驱故障引脚、霍尔信号状态。如果任何一项异常,直接报错,不启动。这个自检逻辑我写了不到 50 行代码,但避免了无数次上电炸管。
第二个技巧:PWM 输出先关断再配置。PIC18F86J11 的 PWM 模块在配置过程中,输出引脚可能会有毛刺。我的做法是先把 PWM 输出引脚配置成普通 IO 并输出低电平,配置完 PWM 模块后再切换成 PWM 功能。这样上电瞬间不会出现上下桥同时导通的危险。
第三个技巧:电流环和速度环分时调试。先调电流环,把电流环调稳了再调速度环。如果两个环一起调,出了问题你不知道是哪个环的问题。我一般先给一个固定占空比,看电流是否稳定,然后加电流环,最后加速度环。
第四个技巧:保留一份最小系统代码。调试过程中,我始终保持一份能跑通的最小系统代码,只做换相,不做速度环,不做保护。一旦复杂代码出问题,回退到最小系统,确认硬件没问题,再逐步加功能。这个习惯帮我省了大量时间。
5. 机器人应用场景的特别考量
5.1 机器人关节驱动的特殊需求
机器人关节和普通工业电机驱动不一样。普通工业电机往往长时间运行在固定工况,机器人关节则是频繁启停、正反转、变速。这对驱动方案提出了几个额外要求。
第一是动态响应。机器人关节要在毫秒级内响应速度指令变化,速度环带宽要够高。我的做法是把速度环采样周期缩短到 500us,PI 参数相应调整。实测下来,500us 采样周期下,速度环带宽可以做到 100Hz 以上,满足大多数关节需求。
第二是低速平稳性。机器人做精细操作时,关节可能以极低速度运行,比如 1rpm。这时候霍尔换相的分辨率就不够了,每 60 电角度才换一次相,转矩脉动大。解决方案是用正弦波驱动代替六步换相,但这需要 FOC 算法,PIC18F86J11 跑 FOC 有点吃力。折中方案是六步换相加 PWM 调制,在换相周期内用 PWM 调节平均电压,减小转矩脉动。
第三是多关节同步。一个机器人有 6 个关节,每个关节一套驱动,6 套驱动要同步。我的做法是用 CAN 总线或者 EtherCAT 做关节间通信,主控发指令,各关节驱动执行。TC78B043FNG 和 PIC18F86J11 这套方案本身不带通信接口,但 PIC18F86J11 有 SPI 和 UART,可以外接 CAN 控制器或者 EtherCAT 从站芯片。
5.2 与机器人控制器的接口设计
机器人控制器和关节驱动之间,接口设计很关键。我一般用CAN 总线,因为 CAN 抗干扰强,适合机器人这种电机多、干扰大的环境。PIC18F86J11 通过 SPI 接一颗 CAN 控制器(比如 MCP2515),实现 CAN 通信。
接口协议我定义了几个关键指令:使能、失能、设置速度、设置位置、读状态。使能指令让驱动器进入闭环模式,失能让电机自由停车。设置速度指令包含目标速度和加速度,驱动器内部做梯形速度规划。读状态指令返回当前位置、速度、电流、温度、故障码。
这里有个细节:通信超时保护。如果 CAN 总线断了,驱动器收不到指令,电机不能一直转。我的做法是设一个 100ms 超时,超时后自动失能,电机自由停车。这个保护在机器人调试时特别重要,避免通信故障导致机器人失控。
5.3 工业现场的抗干扰措施
工业现场电磁环境恶劣,变频器、继电器、接触器都在旁边,干扰无处不在。这套驱动方案要稳定运行,抗干扰措施必须到位。
电源端:母线加共模电感和 X 电容,抑制共模和差模干扰。预驱供电加 LC 滤波,防止电源噪声影响预驱逻辑。
信号端:霍尔信号和编码器信号用双绞线或屏蔽线,屏蔽层单端接地。信号线上加 RC 滤波,靠近 MCU 引脚。CAN 总线用双绞线,两端加 120Ω 终端电阻。
PCB 布局:功率地和信号地分开,单点接地。MOS 和预驱靠近,走线短而粗。晶振靠近 MCU,底下不走其他信号线。ADC 参考电压加滤波电容,远离功率区域。
软件端:所有输入信号做数字滤波,霍尔信号做消抖,ADC 做多次采样平均,通信做 CRC 校验。关键状态机加超时保护,任何一步超时都回退到安全状态。
这些措施看起来繁琐,但每一条都是踩坑换来的。我见过太多驱动器在实验室跑得好好的,一到现场就各种问题。抗干扰设计不是可选项,是必选项。
6. 调试工具与实测数据分享
6.1 必备调试工具清单
调试这套方案,几样工具少不了。示波器是第一位,至少四通道,看霍尔、PWM、相电压、电流。我用的是一台 200MHz 带宽的,够用。电流探头看相电流波形,判断换相是否正确。逻辑分析仪抓霍尔和 PWM 时序,分析换相延迟。可调电源给母线供电,限流保护,防止炸管。红外测温枪测 MOS 和预驱温度。
软件工具方面,MPLAB X IDE加XC8 编译器是 PIC18 开发的标配。PICkit 4调试器支持在线调试和烧录。串口助手看调试信息。如果做 CAN 通信,还需要CAN 分析仪。
6.2 实测数据与性能评估
我拿这套方案驱动一台 24V、100W、4 极对、带霍尔和 1000 线编码器的 BLDC,做了几组测试。
空载启动到 3000rpm,用时约 200ms,超调约 5%,稳态误差小于 1%。加载到额定扭矩,转速跌落约 3%,恢复时间约 50ms。低速 10rpm 运行,速度波动约 5%,转矩脉动约 10%。过流保护响应时间小于 10us,从检测到过流到关断 PWM,实测 8us。
效率方面,额定工况下,驱动器效率约 95%,MOS 温升约 40 度(环境 25 度,加散热片)。预驱温升约 20 度。整体效率满足工业应用要求。
对比六步换相和正弦驱动,六步换相的转矩脉动明显大一些,但实现简单,对 MCU 要求低。如果应用对转矩脉动敏感,比如机器人精细操作,建议上 FOC。但 FOC 对 MCU 算力要求高,PIC18F86J11 跑 FOC 需要优化算法,或者换更高级的 MCU。
6.3 后续扩展方向
这套方案还有不少扩展空间。通信方面,可以加 EtherCAT 从站,做多轴同步。控制算法方面,可以加位置环,做位置控制。保护方面,可以加温度传感器,做温度保护。诊断方面,可以加故障记录,方便现场排查。
如果要做无感驱动,去掉霍尔,用反电动势过零检测估算转子位置,这套硬件也支持。反电动势信号经过分压后接到 ADC,软件做过零检测。但无感驱动低速性能差,启动需要特殊算法,适合风机、水泵这类对低速要求不高的场景。
机器人应用方面,如果要做协作机器人,需要力控,那就得加力矩传感器,做阻抗控制。这又涉及到更复杂的算法,PIC18F86J11 可能不够用,需要考虑升级到 32 位 MCU。但作为入门和中等复杂度应用,这套方案已经能覆盖大部分需求。
我个人在实际操作中的体会是,这套 TC78B043FNG 加 PIC18F86J11 的组合,最大的价值在于平衡。它不像集成模块那样封闭,也不像全分立方案那样复杂。硬件上,预驱加 MOS 的架构给了你调整功率级的自由;软件上,通用 MCU 给了你实现各种控制策略的自由。对于工业现场和机器人应用,这种自由度往往比极限性能更重要。踩过的坑告诉我,稳定可靠、易于调试、方便维护,才是工业产品的核心竞争力。