ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

STC8H1K28低成本BLDC驱动方案:六步换相与过流保护实战

STC8H1K28低成本BLDC驱动方案:六步换相与过流保护实战 简介本资源是一套基于STC8H1K28单片机的三相无刷电机BLDC驱动完整实现方案面向嵌入式初学者、电机控制爱好者及工业自动化入门开发者解决无感与霍尔传感两种模式下的换相控制、电位器调速及实时响应等核心问题。压缩包共20个文件含2个核心C源码分别实现霍尔传感器捕捉中断换相、无感FOC简化方案、2个头文件含STC8Hxxx.h底层寄存器定义、Keil工程文件uvproj/uvopt、编译输出文件hex、lst、obj、m51等及关键电路原理图PDF总大小183KB结构清晰便于理解启动流程、PWM配置、霍尔信号捕获逻辑与速度闭环设计。已有391人学习下载提供可直接烧录验证的HEX固件、带注释的源码及配套硬件接口说明帮助读者快速掌握BLDC基础驱动框架、中断时序控制要点与模拟调速软硬件协同方法适用于电动工具、智能家电等中小功率电机控制实践。 去年做一个小型直流风机控制器电机是三相无刷客户给的成本红线压得很低。一开始我想上STM32G030算完物料成本还是超了只好把目光放回STC8H1K28。很多人一听“8位机驱动BLDC”就觉得不靠谱其实STC8H系列是增强型80511T流水线执行主频跑二三十兆来做六步换相完全有余量。更关键的是这颗芯片自带高级PWM、模拟比较器和多路ADC这三个外设凑在一起刚好覆盖三相无刷控制器最核心的需求PWM驱动、换相信号处理、过流保护。这篇文章就把我实际搭过的方案完整讲一遍包括硬件电路怎么搭、换相表怎么定、过流保护怎么做以及调试时踩过的几个坑。1. 先想清楚STC8H1K28这颗8位机能干什么活1.1 资源盘点不是所有8051都能干这活传统8051主频低、外设弱跑无刷驱动确实吃力。STC8H1K28虽然是8位机但内部结构已经和上世纪那批51完全不同。它采用1T流水线常规指令基本一个时钟周期完成主频配置得当的情况下算力应对六步换相这种固定状态机绰绰有余。更关键的是外设配置。三相无刷驱动需要的最小外设集合是至少6路带死区控制的PWM输出用于驱动三相全桥的6个MOS管多通道ADC用来采样母线电压、电流或者无感方案里的反电动势一个硬件比较器用来做快速过流保护这个后面单独讲几个外部中断或输入捕获通道用于读取三路霍尔信号定时器用于产生中断调度、测量转速。STC8H1K28基本都覆盖了。28脚封装看起来不多但安排完PWM输出、霍尔输入、ADC采样、串口调试之后还能富余几个IO控制继电器和指示灯。芯片内部还有EEPROM可以把电流保护阈值、启动参数、PID系数存进去掉电不丢量产调参很方便。1.2 为什么选它而不是STM32或专用电机驱动芯片先放一张对比表这是我做方案选型时习惯列的方式方案单颗物料成本开发难度灵活性适合场景STC8H1K28 外部栅极驱动 MOS低中高中小功率方波控制需要自定义保护逻辑STM32 外部栅极驱动 MOS高高高FOC、伺服等高阶控制集成电机驱动IC如单芯片方案中低低固定应用、大批量、改动少FOC这类算法需要大量乘法运算8位机确实不适合。但如果你的应用只是方波六步换相8位机的资源就是“刚刚好够用且有余量”。STM32在这个场景下属于性能溢出还要额外处理启动配置、库文件升级之类的麻烦对只想快点出活的嵌入式工程师来说反而增加负担。专用电机驱动IC灵活度低你不能随意修改保护策略、启动时序。STC8H1K28则可以把换相策略、保护策略、转速闭环全部放在自己手里想怎么改就怎么改改完烧录就完事。1.3 适合的应用场景我用这套方案做过的负载包括24V直流风机、小型水泵、云台电机、手持风扇。功率范围大概在几十瓦到两百瓦之间母线电压12V到48V。这类应用对成本敏感对转速精度要求不高方波控制加个简易PID调速就够了。如果是几百瓦以上的电动工具或电动车电机建议老老实实加外部专用驱动芯片和更大电流的MOS或者换32位平台做FOC。STC8H1K28做方波驱动电调没问题但别硬塞FOC和弱磁控制它不是干那个活儿的料。2. 硬件系统搭建三相全桥的栅极与采样设计2.1 三相全桥结构其实就是三个半桥三相无刷电机的功率级是一个三相全桥从电路结构上看就是三个半桥并联在母线上每个半桥由上管和下管两个MOS组成中间点引出接电机的一相绕组。六步换相的本质就是按照转子位置轮流让这六个MOS导通。为了保证工作稳定MOS栅极驱动不能由MCU的IO直接驱动通常需要栅极驱动芯片。驱动方式里最常见的是自举电容方案下管导通时给自举电容充电上管需要导通时利用电容上的电压维持栅极驱动。这种方式结构简单、成本低中小功率场合很成熟。栅极驱动芯片有两种选法用三颗半桥驱动芯片比如IR2101每颗负责一相上下管用一颗三相驱动芯片比如FD6288这类内部集成三路半桥驱动和自举二极管外围元件更少。我更推荐后者。FD6288这类芯片外围就几个自举电容和限流电阻PCB布局好画很多故障率也低。自举电容一般选100nF到1uF之间具体根据开关频率和MOS栅极电荷量算我习惯先用0.47uF/50V的贴片电容实测高温下如果波形有畸变再加大。2.2 MOS管与栅极电阻选型原则MOS管选型核心看四个参数漏源耐压、连续电流、导通电阻Rds(on)、栅极总电荷Qg。耐压要留至少1.5倍余量24V系统选40V或60V耐压的管子48V系统建议100V。电流参数要看实际工作电流和瞬间堵转电流别只看额定电流。Rds(on)越低发热越小但相同封装下低内阻管子的Qg往往更大栅极驱动功耗和开关损耗会上升需要平衡。我常用的是AO4404、IRFR3607这类N-MOS。在24V、10A的场合Rds(on)在10mΩ量级的管子正常运行时发热就很好控制。栅极串联电阻也很关键。它控制开关速度和EMI电阻太小开关瞬间di/dt很大容易产生振铃干扰电阻太大开关损耗增加波形圆润但效率下降。我从10Ω起步如果发现栅极波形过冲明显就加大到22Ω同时观察相电压波形的振铃衰减情况。2.3 STC8H1K28引脚分配与采样电路以我常用的28脚LQFP封装为例引脚分配大概是这样的思路功能引脚说明PWM1P / PWM1NA相上下桥PWMPWM2P / PWM2NB相上下桥PWMPWM3P / PWM3NC相上下桥PWMINT0 / INT1 / INT2接三路霍尔信号ADC通道母线电流采样、母线电压采样、反电动势采样比较器输入接电流采样电阻信号UART TX/RX调试和参数修改注意STC8H1K28的PWM输出引脚可以做互补输出带死区配置成三相六路输出正好。霍尔信号最好加一个RC滤波比如100Ω串联加1nF到地滤掉电机本体带来的共模干扰。霍尔信号线尽量短不要和相线平行走线。ADC采样母线电流时我用低端采样电阻方案采样电阻放在三相全桥低端MOS的公共源极和功率地之间。这个电阻一般取5mΩ到20mΩ具体看电流范围。采样电阻两端电压很小走线必须用开尔文接法从电阻两端单独拉细线到MCU的ADC和比较器输入不要直接用大面积铜箔上的电压否则你采到的是铜箔电阻上的压降数值完全是乱的。2.4 反电动势分压网络设计如果做无感方案需要检测三相绕组的反电动势过零点。典型做法是每相输出端经过电阻分压后接到ADC。我用的分压电阻是100kΩ和10kΩ分压比为1/11。母线24V时电机悬浮相端电压最高大约24V分压后约2.18V在ADC参考电压范围内。分压网络之后要加一个小电容滤波比如10nF到47nF滤掉PWM开关噪声。但电容会带来相位延迟转速越高延迟越明显所以无感方案高速段的换相精度会受影响。我的经验是滤波电容尽可能小只要能稳定检测过零就行如果转速确实很高就需要在软件里做角度补偿。3. 换相逻辑霍尔方案为主无感反电动势兜底3.1 六步换相到底在换什么三相无刷电机的定子有三个绕组转子是永磁体。要让转子持续旋转必须根据转子位置不断改变定子磁场方向。六步换相就是每一电气周期内按照60度电角度的步进切换六种通电状态。我习惯把每一步用“哪相进电流、哪相出电流”来描述。顺时针旋转时通电状态顺序是AB-、AC-、BC-、BA-、CA-、CB-然后回到AB-循环。每一步只有两个MOS导通一上一下电流从母线流进一相绕组从另一相绕组流出。3.2 霍尔方案换相表怎么定带霍尔传感器的电机三路霍尔信号在360度电角度内会给出6个稳定状态。MCU读取霍尔状态查表得到下一步应该导通哪两个MOS。很多人第一次调霍尔换相表容易卡住。这里有个笨但可靠的方法先让电机脱开负载手动缓慢盘动转子用逻辑分析仪或者示波器把三路霍尔电平记录下来同时记下此时转子大致角度和相序再对照电机绕组接线确定导通组合。这样标定的换相表虽然慢但一次正确。代码里我一般用一个数组做查表// 霍尔状态 - 换相步骤的映射表 // 位定义示意bit5CH, bit4CL, bit3BH, bit2BL, bit1AH, bit0AL // 注意这张表必须根据实际电机霍尔接线标定不能直接通用于所有电机 const uint8_t hall_to_step[8] { 0x00, // 000: 无效 0x06, // 001 0x18, // 010 0x24, // 011 0x12, // 100 0x09, // 101 0x21, // 110 0x00, // 111: 无效 };这个表里每个数值表示两个MOS导通。具体哪一位对应哪个MOS由你硬件接线决定所以我会在代码注释里把位定义写清楚。实际量产的板子还要在测试台上做一次霍尔序列验证防止电机批次差异导致换相表对不上。3.3 无感方案反电动势过零检测原理无感方案省掉了霍尔传感器但代价是启动和低速控制更麻烦。原理并不复杂电机旋转时未通电那一相绕组会产生反电动势当反电动势穿过中点电压时就是该相换相的时刻。因为绕组是中点引出的星形接法悬浮相端电压等于该相反电动势加上中点电压。在PWM稳定运行中中点电压近似等于母线电压的一半。所以检测悬浮相端电压是否跨过“母线电压一半”就能找到过零点。检测到过零后再延迟30度电角度就是下一个换相点。STC8H1K28用ADC采样三个分压点的电压来做这个判断。每个PWM周期内选择当前悬浮相作为采样对象连续采样几次后用软件判断电压值是否从高于中点变成低于中点或者反过来。这样就得到了过零信号。无感检测的难点在滤波和噪声PWM开关瞬间的尖峰很容易造成误判。我的做法是在分压点和ADC之间加RC低通同时软件里做连续多次确认比如连续三次采样都满足过零条件才认为过零有效。3.4 启动流程定位、拖动、切换无感电机不会自己从静止进入稳定换相状态因为静止时没有反电动势检测不到过零。所以启动要分三步第一步是定位。给一个固定导通状态通电几百毫秒让转子转到已知位置。电流要限住一般用较小的PWM占空比保证转子能转到位但不过热。第二步是强制换相拖动。不再依赖反电动势而是按时间顺序不断切换六步状态每步保持很短的时间逐步加速。这个阶段本质是开环运行加速斜率太陡会失步太慢又容易烧MOS需要现场调。第三步是切换闭环。当转速升到一定值反电动势幅值足够大过零检测稳定后就切到正常的过零换相逻辑。切换瞬间相位容易对不齐常见做法是让开环换相频率稍微低于闭环估算的频率等检测到连续有效过零再接管。4. 过流保护从内置比较器到一颗简单IC就能搞定过流保护是三相无刷方案里最不能省的一环。堵转、线间短路、MOS直通、启动电流过大任何一个都能在几毫秒内烧掉MOS管。热搜里有人问“过流保护怎么做有没有简单的IC实现”这问题我太熟悉了。答案是有而且有两级做法可以叠加。4.1 电流采样点选择过流保护第一步是要知道电流大小。最简单的方式是在低端加采样电阻位置在全桥低端共同源极和功率地之间。这个电阻上的电压正比于母线电流电阻越小损耗越小但信号越微弱需要放大或精确比较。高端采样或相电流采样用得少一些因为共模电压高、处理麻烦。低端采样电路简单虽然不能检测上管直通之类的某些故障但配合硬件刹车逻辑足够保护大多数场合。4.2 STC8H1K28自带比较器的硬件级保护这就是最省事也最快的方案。STC8H1K28内部有一个模拟比较器正端和负端都可以通过寄存器选择接到指定的ADC引脚。把采样电阻信号接到比较器正端把参考电压接到负端当电流过大导致采样电压超过参考电压时比较器输出翻转。重点是比较器的输出可以直接接到高级PWM模块的异常保护输入。PWM模块检测到比较器翻转后硬件自动关闭PWM输出不需要软件参与。从过流发生到PWM关断时间在微秒级这个速度足以保护MOS管。同时软件进入中断记录故障标志做上位机上报或自动重启逻辑。寄存器配置我一般这么写伪代码具体位定义以最新数据手册为准// 使能比较器选择输入通道 CMPCR 0x80; // 比较器使能 CMPCR2 0x00; // 正端/负端选择根据硬件接线调整 // 使能PWM异常检测比较器输出作为异常源 PWMB_CR1 0x01; // 使能异常刹车 PWMB_IER 0x01; // 使能异常中断这里最关键的认知是硬件保护链路不要经过中断。如果等CPU响应中断再关PWM8051就算再快中断响应少说也要几个微秒加上寄存器操作在高电压大电流场景下已经可能造成MOS损坏。让比较器直接触发PWM模块的刹车功能才是硬件级保护的正确姿势。4.3 “简单的IC”实现方案如果不想依赖MCU内置比较器或者想要一层独立于MCU的硬件保护链路可以用一颗比较器IC来做比如最常见的LM393。LM393是开漏输出搭建方式很简单同相输入端接采样电阻电压反相输入端接一个可调参考电压输出经过上拉电阻后接MCU的外部中断或PWM异常输入。为了防抖输出端可以再接一个RC延时但注意延时不能太大否则保护就不及时了。更省事的方案是选一颗自带电流检测输入的三相栅极驱动IC。这类芯片内部集成了比较器只需要把采样电阻信号引入ITRIP引脚再通过外部电阻设置阈值过流时芯片直接关闭六路驱动输出并输出一个FAULT标志给MCU。外围元件最少保护动作也比你自己搭的比较器电路更可靠。还有一类电流检测放大器比如INA180、INA240把采样电阻的微弱电压放大后给ADC。这类芯片只能做“软件过流保护”因为放大到ADC输出本身就有延迟适合做保护后的平均电流监控和精确电流显示不适合做第一道快速保护。三种方案的对比方案保护速度外围复杂度成本是否独立于MCUMCU内置比较器直连PWM刹车微秒级最低最低依赖MCU外设LM393外部比较器微秒级低低独立带ITRIP的栅极驱动IC最快最低中独立电流检测放大器ADC毫秒级中中否软件保护我的建议是批量成本敏感就用STC8H1K28内置比较器如果设计周期紧张、不想反复调比较器阈值就用带ITRIP的栅极驱动IC电流检测放大器用于需要观测实时电流的场合作为第二层保护。4.4 软件ADC过流保护双保险而非替代硬件保护关断PWM之后系统需要知道“发生了什么”以及是否允许自动重启。这就需要软件参与。软件过流保护的做法ADC周期性采样母线电流换算成实际电流值和软件设定的阈值比较。超过阈值后不一定要立即关PWM而是进行限流降低PWM占空比让电流回落到安全范围。这是硬件保护做不到的精细控制。我通常的做法是两层配合硬件比较器负责瞬时过流直接刹车软件ADC负责平均电流和慢过流执行降功率或停机。这样既能在纳秒级保护MOS又能让系统在短暂过载时自动恢复而不是一过流就死锁。4.5 阈值计算以24V/10A系统为例做保护参数时需要反复核对计算。我以一个具体例子说明假设系统正常工作电流10A堵转保护限流15A。采样电阻取10mΩ那么15A发生时采样电阻上的电压是15A × 0.01Ω 150mV比较器的负端参考电压就设到150mV左右。电阻功耗也要算10A正常运行时P I²R 10² × 0.01 1W所以要选2W额定功率的2512封装采样电阻防止长时间过流发热导致阻值漂移。参考电压生成可以用电阻分压加一个10k电位器微调。调试时我会先用示波器看采样电阻电压波形然后缓慢增大电机负载验证保护点在哪个电流值触发再把电位器固定住。这样比直接按算出来的理论值设更可靠因为采样电阻误差、PCB走线压降、比较器失调都会影响实际触发点。5. 软件框架与控制代码骨架5.1 任务调度中断干活主循环管状态无刷驱动对实时性要求高不能用轮询方式检测霍尔或执行换相。我的软件框架是PWM中断和定时器中断里处理实时任务主循环只做启停控制、参数更新和串口调试。1kHz的定时器中断用来做速度环和软件过流检测。霍尔信号边沿触发外部中断中断里查表换相同时记录相邻两次霍尔边沿的时间差用来计算转速。PWM中断处理占空比更新和ADC采集触发。主循环采用一个简单的状态机停止、定位、开环加速、闭环运行、故障保护。每个状态都有进入和退出动作这样代码逻辑清晰也方便查看当前运行到哪一步。5.2 PWM初始化与异常保护PWM初始化时关键是配置六路输出和死区时间。死区是为了防止上下两管同时导通一般根据MOS关断延时设置我常用500ns到1us具体看驱动芯片和MOS参数。配置异常保护时把比较器输出配置为PWM刹车源同时设置刹车后输出引脚电平为安全状态通常是全部关闭。这样一旦过流PWM端口直接变成高阻或低电平不会出现上下管同时导通导致炸管。5.3 霍尔中断与换相执行霍尔中断是换相的核心。中断里面做的事情很简单读取当前霍尔状态查表找到对应的换相状态写入PWM寄存器然后计算一次转速。void hall_isr(void) __interrupt 0 { uint8_t hall read_hall(); uint8_t step hall_to_step[hall]; set_pwm_output(step); // 更新六路PWM导通状态 update_speed(); // 用定时器计数值算转速 }中断里不要做滤波、PID计算这类费时操作。霍尔信号如果有毛刺会导致换相状态跳变应该在硬件上先滤掉或者在主循环里做软件滤波判断。别在中断里延时代码这是调试无刷最忌讳的。5.4 启动、调速与闭环调速我用最简单的PI控制目标转速和实测转速的差值经过PI计算出PWM占空比。方波控制不需要复杂的电流环一个速度环足够了。启动逻辑用状态机实现。停止状态下等待启动指令收到指令后进入定位状态固定导通一相一段时间然后进入开环加速状态按照查表顺序随时间加速换相当转速达到设定阈值切换到闭环运行。切换瞬间要平滑我会让开环末段的目标占空比和闭环初始占空比尽量接近防止电流突变。故障状态下PWM全部关闭记录故障原因。需要等用户主动复位或经过一定延时后重新启动。堵转后的自动重启要加延时和次数限制避免反复冲击MOS。6. 实测调试波形怎么看坑怎么填6.1 示波器看哪些点调试三相无刷示波器是必不可少的。我一般同时看四个信号MCU输出的PWM波、栅极驱动芯片输出到MOS栅极的波形、电机相线输出波形、采样电阻两端电压。PWM波看的是死区是否正常有没有上下管同时导通的瞬间。栅极波形看的是开关边沿是否干净有没有严重振铃。相电压波形可以看出换相是否正确——如果换相表错了相电压波形会明显异常转速也上不去。采样电阻波形可以直接看到电流尖峰这对调保护阈值非常有用。实际测量时探头地线要尽量短不要用长地线夹子否则在开关噪声环境下采到的全是毛刺。相线附近的大电流回路离探头越远越好。6.2 启动失败排查启动失败是接触三相无刷之后最常遇到的问题。现象可能是不转、抖动、嗡嗡响、一转就停。定位阶段不转定位占空比太低电流不足或者定位时间太短转子还没来得及对准。可以增大定位占空比到20%左右时间延长到300ms以上观察。抖动但不连续转开环加速斜率太陡转子跟不上换相频率。我的经验是从慢速开始比如每50ms换一步然后逐渐加快而不是上来就按目标转速换相。转起来但很快停可能是切换闭环太早反电动势检测还不稳定。可以调高切换转速阈值同时检查分压网络和ADC采样是否正确。用示波器看相电流波形能直接判断启动阶段是否出现失步。如果是霍尔方案还要排查霍尔信号有没有跳变抖动必要时给霍尔电源加更大滤波电容。6.3 过流保护的误触发与漏触发过流保护调起来也很费时间。误触发表现为正常启动或轻载运行时突然停机原因是采样电阻信号上叠加了功率开关的噪声尖峰瞬时超过了比较器阈值。解决误触发有两个方向一是降低采样回路噪声比如把采样电阻到比较器的走线缩短加一点RC滤波二是稍微调高比较器阈值。但阈值不能调太高否则真过流时保护就不动作了变成漏触发。漏触发更危险。MOS烧了保护才动作说明保护链路的带宽或者阈值有问题。我会测量堵转瞬间的采样电阻波形看真实故障电流对应的电压幅值和持续时间再回头调阈值。采样电阻的分布电感也可能让脉冲尖峰失真选低感电阻或者排布上减小回路面积会有帮助。6.4 噪声、走线、RC滤波的平衡整个板子最需要花心思的地方其实是功率地和信号地的处理。大电流开关回路的di/dt非常高地线上会产生地弹噪声如果MCU和采样电路的地线跟功率地混在一起采样数据会乱比较器也会误触发。我的做法是单点接地功率地单独走大面积铜箔采样电阻的信号地和MCU的信号地通过一小段跳线或窄铜箔在采样电阻的地端单点相连把功率电流路径和信号路径分开。采样网络加RC滤波时要权衡滤波越大信号越干净但过流响应速度越慢。我比较器输入端的滤波时间常数一般控制在100ns到300ns既能滤掉尖峰又不至于让保护变迟钝。反电动势检测的滤波同样要做平衡。低速时反电动势幅值小滤波太多会把过零信号压没了高速时反电动势幅值大但相位延迟更明显。我会根据实际转速调节滤波电容必要时软件做角度补偿。最后分享一个调试小技巧换相表没把握的时候不要直接带电机转用一个信号发生器模拟三路霍尔信号按预期的换相顺序输出方波先用万用表和示波器确认MCU对应输出引脚的状态切换是否符合预期。这样可以把电机和功率级的故障隔离掉只验证逻辑部分。调完逻辑再上电机能少走很多弯路。本文还有配套的精品资源点击获取
返回列表