ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

国产三相半桥驱动EG2133+STM32的BLDC电机驱动方案详解

国产三相半桥驱动EG2133+STM32的BLDC电机驱动方案详解 这几年做电机驱动项目基本绕不开 BLDC 无刷电机以及一堆国产功率器件。以前做方案习惯性选国外大厂的整套芯片贵、交期长、赶上缺货的时候还卡脖子。后来在一个风机控制器项目里我把驱动部分从分离元件方案换成国产 EG2133 三相半桥驱动芯片整个电路物料成本直接下来一截调试时间反而缩短了。这颗料很适合 STM32F103C8T6 这类中小型 MCU 加 MOSFET 搭三相桥的电机控制场景稍微配点霍尔传感器、编码器或者 PID 闭环算法就能把一个完整的电机调速项目落地。这篇文章就围绕 EG2133 展开从芯片定位、外围电路设计到 STM32 配置 PWM、六步换相、PID 调速、红外遥控联调把一套可以直接参考的方案讲透也把调试中容易踩的坑一并列出来。先说一个总体感受EG2133 这类三相半桥驱动芯片本质上就是把电机控制里“最麻烦的那一层”给封装好了。MCU 负责算、负责出逻辑功率管负责干重活而栅极驱动芯片夹在中间干的是“电平转换电流放大保护”的活。选对这颗芯片整个驱动板的设计难度会降一个档次。1. 把 EG2133 放回整个电机驱动系统里看1.1 三相半桥驱动到底解决了什么问题BLDC 电机要转起来需要三相绕组里按照一定顺序通电产生旋转磁场。常用的功率电路是一个三相全桥也就是三个半桥的组合。所谓半桥就是上下两个 MOSFET 串联起来中间抽头接电机相线。上管导通、下管关断该相接到电源正下管导通、上管关断该相接到电源负。三个半桥一组合就能在电机三根相线上产生可变的通电状态。但 MCU 的引脚直接驱动不了功率 MOSFET。这里有几个硬性原因。第一电平不够。STM32F103C8T6 的 GPIO 输出是 3.3V想让 N-MOS 完全导通栅源电压 Vgs 通常要 10V 以上3.3V 远远不够。第二驱动能力不足。MOSFET 栅极是一个电容开关瞬间需要瞬时大电流去充放电MCU 引脚只能输出几个毫安开关速度会非常慢导致 MOSFET 长期工作在放大区发热爆炸。第三高侧 MOSFET 的源极是悬浮电位需要一个悬浮电源去驱动这是 MCU 没法直接提供的。EG2133 这类三相半桥驱动芯片就是专门解决这些问题的。输入侧是 3 组 HIN/LIN 六路信号直接接受 3.3V 或 5V 逻辑电平输出侧是三组高、低侧驱动配合自举电路能给高侧 MOSFET 提供合适的栅极驱动电压同时提供足够的灌拉电流能力。芯片内部还有防直通逻辑再配合 MCU 输出的互补 PWM 和死区时间就能安全可靠地驱动三相 MOSFET 桥。1.2 EG2133 的典型应用场景与选型逻辑从实际接触的项目看EG2133 最常见的应用场景是家电和工业小功率设备变频空调外机风机、变频水泵、空气净化器风机、电动工具、小型电动自行车电机等。这些应用有共同点母线电压不算太高电机功率基本在几十瓦到几百瓦控制方式以方波驱动为主部分会升级到 FOC 磁场定向控制。选型的时候很多工程师会纠结是买进口驱动芯片还是国产芯片。拿同样定位的产品比美系、日系品牌的老牌芯片确实在参数一致性、文档完善度上有优势但国产芯片这几年的进步非常明显尤其是像 EG2133 这种成熟的三相半桥驱动工艺稳定、价格便宜、供货周期短而且很多引脚定义和电气参数做到了兼容二次开发门槛低。如果你手头有 MF324 或其他国产三相驱动芯片的数据手册可以放在一起对比着看。选型看几个关键维度耐压等级、逻辑输入阈值、内置死区时间、UVLO 欠压锁定阈值、封装形式、是否支持 3.3V 逻辑。不同批次的芯片手册可能会微调参数我这里的建议是不管用什么芯片务必以你手头那本最新数据手册为准尤其是额定电压和最大电流这两个硬参数千万别拍脑袋定。1.3 “高性价比”到底体现在哪里很多朋友一听“国产芯片”就下意识觉得是低端货其实完全不是。EG2133 的高性价比体现在几个具体方面。第一一颗料替代三路分离驱动。如果用光耦加图腾柱驱动管的方式搭三相驱动电路至少需要六组匹配、十几个元件PCB 面积大、一致性差。而用 EG2133一颗芯片加少量外围电容电阻就搞定BOM 精简贴片环节也省事。第二外围器件要求不算苛刻。主要是自举电容、自举二极管、栅极电阻、电源去耦电容这些都是常规物料成本很低而且芯片本身的逻辑接口简单MCU 端不需要额外做电平转换。第三内置保护逻辑降低系统风险。防直通逻辑和欠压锁定能在一定程度上保护功率管对研发阶段的调试非常友好至少不会因为一个误操作就把一板管子全带走。我算过一个 24V、额定电流 1A 的小风机驱动板功率级物料成本不算 MCU 和控制板大概能做到几块钱人民币级别这个成本结构在小家电行业里非常有竞争力。2. EG2133 外围电路设计细节决定稳定性的关键2.1 引脚定义与输入输出逻辑EG2133 内部包含三个通道的半桥驱动输入侧有 HIN1、HIN2、HIN3 和 LIN1、LIN2、LIN3输出侧对应 HO1、HO2、HO3 和 LO1、LO2、LO3另外有 VCC、GND、VB1-3、VS1-3。常规逻辑是高电平有效HIN 为高时对应的 HO 输出高电平驱动上管导通LIN 为高时LO 输出高电平驱动下管导通。这就带来一个非常关键的设计点同一相上下管的输入信号不能同时为高否则输出会同时打开上下管母线直接通过两个 MOSFET 短路也就是“直通”现象瞬间烧毁功率管。实际使用中MCU 的高级定时器一定要配置成互补 PWM 输出并插入足够的死区时间让上下管轮流导通中间留一段“都关断”的时间。EG2133 的数据手册里通常会写内部是否集成死区控制。哪怕芯片有内置防直通逻辑我也强烈建议 MCU 端照样把互补死区配置好不要省这一步。软件层和外设层双保险比只靠某一个功能更靠谱。2.2 自举电路高侧驱动的关键供电方式高侧 MOSFET 的源极是悬浮的它的栅极电压必须高于源极电压 10V 左右才能完全导通。这个悬浮电源绝大多数三相驱动芯片用的都是自举电路。原理不复杂芯片内部有一个高侧驱动模块正常情况下由 VB 和 VS 之间的电容供电。当下管导通时VS 被拉到接近地VCC 通过自举二极管给自举电容充电等下管关断、上管要开通时自举电容上存的电能供高侧驱动使用把 HO 拉到比 VS 高出一截的电平。自举电容的选择是很多新手容易踩坑的地方。电容太小高侧驱动电压跌落太多MOSFET 不能完全导通损耗大而且可能因为欠压保护无法工作电容太大充电时间又太长高占空比下可能充不满。计算思路可以这样自举电容上需要的电荷至少要等于 MOSFET 栅极总电荷 Qg 加上芯片高侧驱动自身的静态消耗。假设一个中小功率 MOS 的 Qg 是 30nC高侧静态电流按 0.3mA 算在 16kHz 的 PWM 周期内高侧导通半个周期消耗约 10nC总电荷大约 40nC。如果允许自举电压跌落 0.5V那么 C Q / ΔV 40nC / 0.5V 80nF。考虑到电动转换的宽范围实际取 0.1μF 到 1μF 都是合理的我一般直接上 1μF X7R 陶瓷电容留足余量。注意自举二极管一定要选快恢复或超快恢复二极管反向恢复时间太慢的二极管在高压母线场合会导致额外损耗甚至损坏芯片。常规做法是选 200V 以上的快恢复二极管比如 ES1D 这类不建议用普通整流二极管硬顶。2.3 栅极电阻与 MOSFET 选型速查栅极电阻是串联在驱动芯片输出和 MOSFET 栅极之间的电阻。它的作用有两个限制栅极充放电电流避免开关瞬态电流过大导致振铃抑制栅极电压过冲减小 EMI。阻值太小波形振铃严重甚至可能出现桥臂上下管因为栅极振荡而误开通阻值太大开关速度变慢开关损耗增加电机高速时容易掉扭。常规取值在 10Ω 到 47Ω 之间具体要看 MOSFET 的 Qg 大小和期望的开关速度。MOSFET 选型有一个基本公式思路。耐压方面建议取母线电压的 1.5 到 2 倍余量。比如 24V 系统选 60V 的 MOSFET 就很稳48V 系统选 100V 的。电流方面要按电机堵转电流或启动峰值电流来选再加上散热条件一般取额定工作电流的 3 到 5 倍余量。对于一套 24V、额定 1A 的小功率驱动板选一颗 60V、Id 10A 左右的 N-MOS 就很够用Qg 尽量小一点驱动压力也小。另外栅极电阻的功率等级也别忽略。虽然个别时候平均功耗不大但在高压大电流场景栅极驱动电流脉冲峰值可能不小建议至少用 0805 封装的电阻不容易被脉冲打坏。2.4 电源去耦与 PCB 布局三条铁律EG2133 的工作电压 VCC 常规接 12V 或 15V 驱动电源逻辑输入端可以直接由 3.3V MCU 控制。VCC 引脚旁边必须放去耦电容通常是一个 0.1μF 陶瓷电容紧贴芯片引脚再并一个 10μF 左右的电解电容或钽电容。这个组合能应对驱动瞬间的电流尖峰保证芯片供电稳定。PCB 布局上我总结三条铁律照着做基本不会出大问题。第一条驱动回路尽量短。自举电容、栅极电阻都贴近芯片引脚不要让驱动信号绕大圈再去 MOSFET 栅极回路面积越小振铃越小EMI 越容易过。第二条功率地和控制地单点连接。电机相电流很大回流路径上会有很大的 dv/dt 和 di/dt如果控制地、信号地和功率地大面积混在一起干扰会直接耦合到 MCU导致 PWM 信号异常甚至复位。我一般把功率地单独走一块在母线电容附近和信号地单点汇合。第三条母线电容放在 MOSFET 桥臂附近。母线电容到三相桥的电源、地环路要短粗否则功率管开关瞬间会产生很高的尖峰电压这个尖峰一旦超过 MOSFET 耐压器件直接击穿。3. 让电机转起来STM32F103C8T6 EG2133 完整实操流程3.1 硬件连接架构这套方案的硬件连接非常清楚STM32F103C8T6 的 TIM1 输出六路互补 PWM接到 EG2133 的 HIN1-3 和 LIN1-3EG2133 的六路输出分别接三相全桥的六个 MOSFET 栅极三相桥的输出端接 BLDC 电机三根相线。电机内部或外部安装霍尔传感器霍尔信号接到 STM32 的普通 GPIO用于检测转子位置。如果要做闭环调速还可以接霍尔编码器到 STM32 的定时器编码器模式测出实际转速。电源方面24V 母线直接接到 MOSFET 桥臂12V 驱动电源给 EG2133 的 VCC 供电5V 或 3.3V 给 MCU 和霍尔传感器供电。要注意上电顺序先上控制电和驱动电让 EG2133 和 MCU 进入确定状态再上母线电。如果母线电先上、控制电后上MOSFET 栅极可能处于不确定电平容易半导通发热甚至直接击穿。3.2 生成六路互补 PWM 的关键配置BLDC 方波驱动里核心就是 STM32 的高级定时器 TIM1。这里示范怎样把它配置成 16kHz 的互补 PWM 输出边沿对齐模式占空比初值设在能启动的水平同时使能自动输出。void MX_TIM1_Init(void) { TIM_ClockConfigTypeDef sClockSourceCfg {0}; TIM_MasterConfigTypeDef sMasterCfg {0}; TIM_OC_InitTypeDef sConfigOC {0}; TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeCfg {0}; htim1.Instance TIM1; htim1.Init.Prescaler 0; // 不预分频直接按 72MHz 计数 htim1.Init.CounterMode TIM_COUNTERMODE_UP; // 边沿对齐 htim1.Init.Period 4499; // 72MHz / (44991) 16kHz htim1.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter 0; htim1.Init.AutoReloadPreload TIM_AUTORELOAD_PRELOAD_ENABLE; HAL_TIM_PWM_Init(htim1); sBreakDeadTimeCfg.OffStateRunMode TIM_OSSR_ENABLE; sBreakDeadTimeCfg.OffStateIDLEMode TIM_OSSI_ENABLE; sBreakDeadTimeCfg.LockLevel TIM_LOCKLEVEL_OFF; sBreakDeadTimeCfg.DeadTime 100; // 约 100 个系统时钟周期72MHz 下约 1.4us sBreakDeadTimeCfg.BreakState TIM_BREAK_DISABLE; sBreakDeadTimeCfg.BreakPolarity TIM_BREAKPOLARITY_HIGH; sBreakDeadTimeCfg.BreakFilter 0; sBreakDeadTimeCfg.AutomaticOutput TIM_AUTOMATICOUTPUT_DISABLE; HAL_TIMEx_ConfigBreakDeadTime(htim1, sBreakDeadTimeCfg); // 配置 CH1、CH2、CH3 为 PWM1 模式 sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 2250; // 50% 占空比初值后续按控制逻辑调整 sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity TIM_OCNPOLARITY_HIGH; sConfigOC.OCFastMode TIM_OCFAST_DISABLE; sConfigOC.OCIdleState TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState TIM_OCNIDLESTATE_RESET; HAL_TIM_PWM_ConfigChannel(htim1, sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_ConfigChannel(htim1, sConfigOC, TIM_CHANNEL_2); HAL_TIM_PWM_ConfigChannel(htim1, sConfigOC, TIM_CHANNEL_3); // 启动三路互补 PWM 输出 HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_1); HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_2); HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_3); HAL_TIMEx_PWMN_Start(htim1, TIM_CHANNEL_1); HAL_TIMEx_PWMN_Start(htim1, TIM_CHANNEL_2); HAL_TIMEx_PWMN_Start(htim1, TIM_CHANNEL_3); // 高级定时器需要使能主输出 MOE __HAL_TIM_MOE_ENABLE(htim1); }这里关键的地方在于死区设置。在 72MHz 主频下DeadTime 参数每增加 1大约对应 13.9ns。我示例填的 100约等于 1.4μs 死区对大多数中小功率 MOSFET 来说足够。死区设大了不会出大问题最多波形上多一段全关断时间死区设小了上下管重叠导通那才是真正的灾难。所以初调阶段宁大勿小。3.3 霍尔反馈与六步换相表用方波驱动 BLDC 时需要根据转子位置决定当前应该给哪两相通电。霍尔传感器就是干这个的三个霍尔元件间隔 120° 安装输出三个数字信号组合起来有 6 个有效状态正好对应 6 个通电区间。六步换相的意思就是一个电周期内分为 6 步每 60° 电角度切换一次导通组合。任意时刻只有两个导通组合再看当前状态决定用哪两只 MOSFET 导通。我做过一个表按霍尔信号常见的格雷码序列排列霍尔状态 H1H2H3导通的上下管组合通电相101Q1 Q6AB-001Q1 Q2AC-011Q3 Q2BC-010Q3 Q4BA-110Q5 Q4CA-100Q5 Q6CB-这个表是示意实际霍尔安装位置、电机绕线方式、转向不同都会影响对应关系。我常用的办法是先用开环强制一步步换相手动转电机把霍尔状态和对应反电动势的顺序摸清楚再生成自己的换相表。脚本自动遍历霍尔状态并记录比自己凭感觉试省事太多而且几乎不会错。启动流程也不能上来就按霍尔闭环跑。低速或静止时霍尔信号有毛刺而且反电动势还没有建立容易误判。常规做法是先施加一个固定通电状态让转子对齐到已知位置然后强制按换相表跑一小段时间等反电动势频率和霍尔信号稳定后再切入霍尔闭环换相。这个“先对齐、再开环强拉、最后闭环”的三段式启动法我实测下来成功率非常高。3.4 PID 闭环调速把转速稳住如果只需要电机转起来开环给个固定占空比就行但负载一变转速就飘。要稳定转速就得闭环。测速可以用霍尔传感器脉冲、霍尔编码器或者无感的反电动势过零检测。这里拿霍尔编码器测速举例因为 STM32 的定时器直接支持编码器模式一个定时器就能同时解出转速和方向。测速思路是配置定时器为编码器模式定时器计数会随编码器 AB 相脉冲增加或减少读计数值乘以比例系数就能得到转速。如果霍尔编码器每圈 13 个脉冲实际每个机械周期产生 13 个计数沿通过捕获单位时间内的计数变化就能换算成 RPS 或 RPM。PID 控制是最常规的转速稳定方法。最基础的位置式 PID 公式是输出 Kp × 误差 Ki × 误差积分 Kd × 误差微分。电机调速场景我更喜欢带积分限幅的位置式 PID或者直接用增量式 PID因为增量式输出的是 PWM 修正量天然规避积分饱和问题。typedef struct { float Kp; float Ki; float Kd; float integral; float lastError; float integralLimit; } PID_t; float pid_update(PID_t *pid, float target, float actual) { float error target - actual; pid-integral error; if (pid-integral pid-integralLimit) pid-integral pid-integralLimit; if (pid-integral -pid-integralLimit) pid-integral -pid-integralLimit; float output pid-Kp * error pid-Ki * pid-integral pid-Kd * (error - pid-lastError); pid-lastError error; return output; }整定参数时我的习惯先只给 P从小到大加看到转速出现轻微持续振荡时记录那个 Kp 值然后退回到它的一半左右。接着加 Ki让它消除带负载时的静态误差。Kd 在电机测速噪声比较大的时候基本不用如果用也要很小否则速度反馈的一点点抖动就会被放大成电压波动电流纹波变大电机反而发热。3.5 红外遥控联调把整个系统串起来一个完整的电机控制项目总得有个人机交互入口。红外遥控是最简单、最便宜的方式之一。38kHz 的接收头模块连接在 STM32 外部中断引脚上收到红外信号时会输出一串脉冲常见的是 NEC 协议9ms 引导码加 4.5ms 间隔然后地址码和命令码按位发送每一位由 560μs 的脉冲加短/长间隔区分。解码思路是利用输入捕获或外部中断加定时器测量脉冲宽度。先识别引导码然后连续测量 32 位的每一位时长短间隔判 0长间隔判 1最后拼出命令码。这套状态机不复杂但要注意接收头输出的信号是反相的测量时要把逻辑反过来。拿到命令码以后就可以把它映射成目标转速档位。比如拿到“”键命令目标转速在 0 到 3000 RPM 之间递增拿到“-”键命令就递减。在主循环里把目标转速喂给 PID 函数PID 输出对应 PWM 占空比修正量去更新 TIM1 的三对通道占空比。整个逻辑就闭环了红外设置目标编码器测实际转速PID 不断修正 PWM让实际转速向目标逼近。实测下来在 24V 风机平台上转速波动能控制在几个 RPM 以内这个效果已经能满足绝大多数风机、水泵类应用。4. 实测中的常见问题与排查技巧实录4.1 问题速查表调试过程中踩过的坑我整理成一张速查表可以在项目卡壳时对着排查。现象排查思路解决办法上电瞬间 MOSFET 炸掉死区是否够驱动电源时序是否正确加大死区先上逻辑电再上母线电检查母线电容耐压和极性电机不转PWM 波形正常芯片输入侧是否和 MCU 共地VCC 是否正常自举电容有没有充电确认共地测量 VB-VS 电压换大自举电容电机抖动、启动困难换相表对不对启动流程是否合理用开环方式重新学习换相表按“先对齐、再强拉、后闭环”启动高速掉扭、噪音大母线电容不足栅极电阻太大PWM 频率偏低加大母线电容减小栅极电阻PWM 频率提高到 20kHz 以上芯片异常发烫开关频率太高驱动回路地干扰严重VS 尖峰过高降低 PWM 频率优化 PCB 驱动回路检查自举电容布局示波器测 HO 波形全是毛刺探头地线接法不对高侧测量要相对 VS 测最好用差分探头或隔离通道4.2 调试顺序与示波器测量技巧我调试这套电路有个固定顺序每次都按这个走能省大量时间。第一步不装 MOSFET先给 EG2133 输入 PWM 信号确认芯片逻辑侧有响应。第二步装上 MOSFET 但断开母线电量 HO/LO 对应 MOSFET 栅源极波形确认上下管是互补带死区的关系。第三步上小电压母线电不加负载手动给一个低占空比看相电流是否正常。第四步再接电机做开环启动。最后才切闭环调速和远程遥控。示波器测量这里有个很大的坑。测量低侧 MOSFET 的栅极波形探头地线夹系统 GND 就可以测量高侧 MOSFET 栅极也就是 HO 处的波形探头地线绝对不能夹系统 GND因为 HO 的参考点是 VS两个点之间是悬浮的高压电位差。正确做法是探头地线夹在 VS 端探针点 HO 输出端有差分探头最好没有差分探头时这样测也能看到正确的波形。4.3 从 STM32 到 DSP28379高性能玩法值不值得上热词里经常出现 dsp28379很多做过风机、水泵的朋友也会问要不要上 DSP 平台做电机控制。这个问题的答案取决于控制策略和成本预算。如果只是 BLDC 方波控制加 PID 调速STM32F103C8T6 完全够用价格还便宜开发难度也低不需要上 DSP。但如果要做 FOC 磁场定向控制或者双电机控制、伺服级动态响应那 STM32F103 的性能就吃力了。DSP28379 这个级别的芯片有浮点单元、CLA 协处理器、高精度 ADC跑 FOC 电流环可以做到非常高的带宽适合高精度伺服、机器人关节、多电机联动这些场景。这里要特别说明一点EG2133 是功率级栅极驱动芯片它和 MCU 是解耦的。不管前面是 STM32、GD32、DSP28379 还是其他 MCU只要输出六路带死区的 PWM 信号EG2133 这边都能接。所以先拿 STM32 加 EG2133 把这套驱动电路、换相逻辑、PID 整定跑熟后面真要换 DSP 做 FOC功率级这一层基本可以原样保留只需要改 MCU 端的控制和算法。根据我个人的实际体会做这类电机驱动项目最重要的不是追求“用多贵的芯片”而是把功率级的地基打牢。EG2133 这层电路稳定了、换相表测准了、PID 手感调出来了后面不管换什么 MCU、上不上 DSP、做不做 FOC都不会再翻车。最后再分享一个小技巧新项目起步时先用 24V 小功率电机把整套逻辑跑通跑稳再往 48V 甚至更高母线上迁移迁移时重点补强 MOSFET、母线电容和 PCB 布线控制代码基本不用动。这个习惯帮我避开了很多高压段才暴露出来的问题你可以试试。
返回列表