ARTICLE DETAIL

资讯详情

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

直流无刷电机霍尔线序自学习:原理、实现与工程排障

直流无刷电机霍尔线序自学习:原理、实现与工程排障 引出话题最让电机工程师头疼的接线问题做直流无刷电机驱动的朋友十有八九都经历过这种场景样机到手电机线、霍尔线一捆不知道哪根接哪根。拿万用表量半天查手册对颜色好不容易上电电机“嗡嗡”响就是不转或者转起来抖动、噪声大、电流飙高。折腾一整天最后发现只是霍尔线序不对。说实话这种问题在实验室里出现的频率远比你想象的高。尤其是当你手上同时有好几款电机来自不同厂家线色定义五花八门有的甚至不按常理出牌那酸爽谁碰谁知道。“直流无刷电机霍尔线序自学习”这十几个字本质上就是解决上面这个痛点的。它不只是一个功能模块更是一套完整的工程方法让驱动控制器在没有人工干预的情况下自己识别出霍尔传感器与电机相线之间的对应关系自动建立正确的换相表从而让电机平稳起动、高效运转。这篇文章我就把自己在这块的实际踩坑经历、代码思路、调试心得全部掏出来从霍尔效应讲起到自学习算法的实现细节再到现场排障尽可能让新手也能照着做出来。整个内容围绕“霍尔线序自学习”这个核心展开但我会把相关的地基知识也补全霍尔效应、反电势波形与霍尔波形的对应关系、120°与60°相位区别、换相表是怎么来的。这些东西弄明白之后你会发现线序自学习并不是玄学它背后就是一套非常清晰的逻辑。1. 霍尔传感器与无刷电机换相的基本逻辑1.1 霍尔效应到底在测什么霍尔效应的核心原理说的是通电导体放在磁场中如果电流方向和磁场方向垂直那导体两侧会产生一个横向电压这个电压叫霍尔电压。霍尔传感器就是把这种效应做成一个芯片当有磁力线垂直穿过芯片表面时芯片输出电平发生变化。放在无刷电机里通常是在定子上安装三个霍尔传感器转子是一圈磁钢转子的N极和S极经过传感器时输出不同电平于是三个传感器就能实时组合出一个3位二进制码表示转子当前的位置。听起来很抽象但你可以这样理解霍尔传感器就像三个站在圆形跑道边上的裁判转子就是跑道上的运动员当运动员跑到哪个区域裁判们会同时给出“看见/没看见”的信号三个信号组合起来你就大概知道运动员跑到哪了。无刷电机的换相需要的就是这个“知道转子在哪”的信息。很多人会把编码器和霍尔传感器搞混。编码器输出的是增量脉冲或者绝对角度精度很高而霍尔传感器在普通无刷电机里一般只输出6个离散位置状态也就是每60°电角度变化一次。这个精度对换相来说完全够用因为无刷电机本身只需要6步换相。1.2 六步换相为什么依赖霍尔状态直流无刷电机没有电刷靠控制器改变绕组通电顺序来产生旋转磁场。最常用的控制方式是“六步换相”也就是每个电周期内把三相绕组的通电状态切换6次每次切换后合成磁场方向转动60°。转子的位置信息决定了当前应该对哪两相通电、第三相悬空。举个例子假设霍尔传感器组合状态为101时转子位置在某一个扇区我们应该给A相和B相通电当状态变为100时转子又转到了下一扇区我们要切换成A相和C相通电。这里的“101对应哪两相通电”就是换相表。换相表直接决定了电机能不能转起来、转得顺不顺。皮实一点的驱动器即使换相表完全错误电机也只是堵转或抖震不会烧东西但如果刚好碰上“半对半错”的换相表电机可能会反转、电流过大、效率低下长时间运行轻则发热严重重则炸MOS管。所以霍尔线序自适应学习的本质就是要把换相表搞清楚。搞清楚的前提则是确定霍尔状态变化序列。1.3 120°和60°相位到底有什么区别这里必须多说一句因为很多新手在这里懵。无刷电机的三个霍尔传感器安装位置一般有两种间隔方式一种是三个传感器依次相隔120°电角度一种是相隔60°电角度。这个“间隔”指的是转子磁场跳变时三个霍尔输出的沿相对于转子位置的关系。对于120°间隔三个霍尔输出状态的跳变不会同时发生。在一个电周期内霍尔状态组合的变化顺序是固定的比如 101 → 001 → 011 → 010 → 110 → 100 → 101总共6个状态每个状态持续60°电角度。对于60°间隔情况稍特殊。某些状态下三个霍尔信号会同时变化导致跳变时会出现两个状态之间的“过渡”实际运行时也会观测到类似 101 → 001 → 000 → 011 这样的变化但中间可能会有一个非法状态如果电机设计成不允许三个霍尔同时变化则不会出现。常见表述是120°相位时任意时刻只有一个霍尔信号发生变化60°相位时在某些位置会出现两个或三个霍尔信号同时变化。在程序里我们可以通过记录霍尔状态的跳变规律来判定相位是120°还是60°。这一步很关键因为两种相位产生的霍尔状态序列对换相表的影响很大。另外对于“热词”里提到的“120/60”如果你在网上搜“120度 60度霍尔”能看到很多厂家是直接用这两个词来区分电机型号的。自学习时如果不区分直接把固定换相表套上去就可能出现“正转很顺、反转很抖”的现象。2. 自学习的核心思路反电势、霍尔波形与线序的关系2.1 反电势波形和霍尔波形为什么能够对应起来在你手动调线序的时候最常用的工具是示波器。把探头夹在电机某一相线上再同时看霍尔信号你能看到这样的规律当一相反电势过零点时对应的霍尔输出状态刚好会发生变化。这是因为反电势波形和转子磁极位置是强相关的而霍尔传感器测量的也是转子磁极位置。两者本质上是同一个物理量的不同表现形式。举个例子假设电机以某个速度空转你用示波器同时抓取A相反电势和三个霍尔信号。你会发现A相反电势的过零点从正到负或者从负到正恰好和霍尔状态的某个跳变沿对齐。三相的反电势彼此相差120°霍尔信号也相差120°只是表达方式不同。细心的工程师就是利用这个对应关系在电机转动时通过比较反电势过零顺序和霍尔状态顺序来反推霍尔线和电机相线的正确接线关系。这个思路看起来复杂但它正是“自学习”可以自动化的基础。实际上现在很多电机驱动芯片比如ST、TI、Infineon的一些专用方案都内置了自动换相标定功能。它们的做法通常是先把电机强制拖到一个已知方向转动或者给一个较小的开环电压让电机缓慢转起来然后采集三个霍尔信号的变化序列再结合反电势检测电路确定当前霍尔状态与反电势扇区的对应关系最后自动生成换相表。这就是一种典型的“定标数据”学习过程和热词里“霍尔位置传感器定标数据”说的是同一件事。2.2 自学习到底要学习哪几个东西拆开来说一套完整的自学习流程需要弄清楚以下四个信息缺一不可。第一电机相位是120°还是60°。这个影响霍尔状态序列的合法集合如果判断错了后面的换相表怎么排都不对。第二霍尔状态的变化顺序是顺时针还是逆时针。这决定了电机的转向坐标系。同一个电机你把霍尔线任意对调两相状态变化顺序就会反过来而且换相表需要重新排列。第三当前霍尔状态与通电相序的对应关系。也就是在某个霍尔状态S下应该给哪两相通电、电流方向如何。这是真正意义上“换相表”的内容。第四是否需要把霍尔信号进行反向或换序处理。有些系统里霍尔信号会先经过一级逻辑处理比如上拉到高电平霍尔导通时拉低导致有效电平高低可能与芯片手册里预设的不一致。自学习也需要把这个因素考虑进去否则即使换相表正确电平反转了还是一样出错。看到这里你应该明白所谓“线序自学习”不是去物理上改变线序而是在软件层面把它“记住”。就像你拿到一把没有标识的钥匙学习过程就是为它建立一个标签下次直接用标签找到正确的钥匙孔而不是每次试。2.3 反电势过零法在自学习中的辅助作用自学习过程中最常见的辅助手段是反电势过零检测。很多控制器带有比较器电路能从端电压上提取出反电势过零点。在电机惯性滑行或弱电激励时我们可以采集反电势相位再跟霍尔状态序列做比对。具体做法是给电机施加一个短暂的电流脉冲让转子转过一个小角度或者在开环六步换相下让电机缓慢匀速旋转同时记录霍尔状态变化时间和反电势过零事件。这里有一个关键点反电势过零点与霍尔状态变化并不是严格同步的。反电势过零通常发生在霍尔状态变化之前的30°电角度处取决于电机设计。但好消息是我们不需要绝对精确的相位差只需要相对顺序。比如霍尔状态从101变到001的跳变沿对应的是某相的反电势过零事件的前后顺序。多记录几个跳变就能得到一组映射关系再结合反电势序列与通电相序的标准关系就能推出霍尔线与相线之间是“正接”还是“交叉”。实际项目中我更推荐用“开环强拖霍尔状态记录”的方法来学习线序而不太依赖反电势过零。因为反电势过零检测需要额外的硬件比较器而且低速时反电势幅值太小非常容易受逆变器死区效应影响。除非你用的是采样电阻重构反电势的算法比如通过三相端电压采样计算中点电压否则可靠性一般。3. 从零实现一个霍尔线序自学习模块3.1 实现前提与硬件需求要自己写一段代码让MCU完成霍尔线序自学习需要的硬件其实非常普通支持至少6路PWM输出、带有ADC模块的MCU以及至少3路输入捕获或普通GPIO中断来处理霍尔信号。一个三相全桥驱动器无论是集成驱动芯片还是分立MOS方案都行。霍尔传感器的供电和上拉电路。这个经常被忽视。霍尔传感器一般是开漏输出需要外部上拉到MCU的IO电压否则输出始终为低或高。上拉电阻一般在1k到10k之间太小会增加功耗太大会导致信号上升沿变慢。我习惯用4.7k左右然后配合RC滤波前提是电机额定转速不是特别高。如果可以最好有一个电流采样电路用于保护。这个不是必须但强烈建议有因为自学习阶段如果程序写错可能出现短路电流光靠限流PWM不够。满足这些条件后代码层面自学习模块可以分为三个状态停转检测、强制换相拖动、序列学习与换相表生成。3.2 第一步确认霍尔信号有效性与初始状态上电后先别急着转电机。第一步是确认三个霍尔信号都能正常读出来。做法给霍尔供电然后手动盘一下电机轴用串口打印或者调试器观察霍尔信号的值。正常情况下三个霍尔值会组合成6个不同的状态也可能出现3个状态取决于电机极对数和霍尔安装位置但一般无感位置标定里都是6个状态。如果一直是一个固定值或者缺少某些状态说明有问题。常见问题有三个一是霍尔电源没接好或者上拉没接导致某个霍尔引脚电平恒为0或1。这个用万用表量霍尔供电脚和输出脚就能排查。二是霍尔信号线接反了但通常接反不会导致读不到状态只是状态序列顺序变化而已不影响“有效性检测”。三是霍尔传感器在低速时输出不稳定特别是有干扰的情况下会出现毛刺导致状态跳变异常。所以初始检测时建议多采样几次取“多数一致”的结果。我在这一步会做一个非常简单的自检逻辑连续读取霍尔值100次每次间隔1ms统计出现的不同状态数量。如果出现大于6个状态大概率是干扰或者接触不良。如果只有1个状态大概率是霍尔供电或接线错误。只有状态数量在4~6之间且稳定才继续往下走。3.3 第二步开环拖动电机记录霍尔状态序列核心思路是让电机以一个固定的换相表这个表不需要正确只要确保电机能转起来进行开环六步换相强制转子旋转。哪怕换相表不对只要电流足够大电机也可能会抖动或缓慢转动但为了学习算法最好选用一个“任意合法”的换相表让电机能转起来。最简单的做法是初始化一个默认换相表假设霍尔线序是120°标准序然后给MOS管发固定的六步换相PWM每一段时间内保持同一个导通状态。换相时间可以根据目标转速和极对数推算。比如极对数为4目标转速约300rpm电频率就是300/60*4 20Hz一个电周期50ms每步约8.33ms。这个时间太短开环拖动可能跟不上所以实际自学习时我会把转速放低比如100rpm每步25ms。拖动的过程中一边发PWM一边用中断捕获霍尔状态变化。因为霍尔状态的变化往往伴随着边沿中断我们可以记录“上一个状态”和“下一个状态”的跳变顺序。等转子转满一圈我们就得到了一串状态序列。例如默认表可能会让电机正转这时记录到的状态序列可能是101 → 001 → 011 → 010 → 110 → 100如果你把霍尔线序搞反了比如把霍尔A和霍尔B对调记录到的可能是101 → 100 → 110 → 010 → 011 → 001其实这两种序列互为逆序反映的是电机旋转方向或者霍尔接线映射。更麻烦的是如果电机本身是60°相位序列可能是101 → 001 → 000 → 011 → 010 → 110 → 100 → 000里面会出现000这个非法状态。没关系我们后面会处理。3.4 第三步根据状态序列判断相位类型与方向拿到序列后第一步先去掉重复和非法状态。比如上面60°相位的序列中000可能只在某个极窄区域出现也许因为霍尔状态同时变化产生毛刺我们只保留“合法”状态集合。其实无刷电机不管120°还是60°霍尔状态最多只可能是以下几种组合中的六个101、100、110、010、011、001以及两种情况下的非法态000和111。在60°安装时非法态会出现在其中一个状态变化区间。判断方法很简单统计记录到的状态种类。如果出现了000或111则可以认定是60°相位。如果没有出现既可能是120°也可能是60°但非法态时间太短被漏采。处理方式提高采样频率或延长自学习时间再次采集。如果始终没有非法态一般就可按120°处理。这里需要留意有些电机的霍尔安装并不是严格的120°或60°而是介于两者之间比如某些国产低成本电机这时非法态可能出现得很短暂甚至没有但是换相逻辑可能既不适合120°也不适合60°那就需要用“反电势过零标定”来生成精确换相表了。接下来判断方向。如果我们知道开环换相表所对应的合成磁场方向也知道实际霍尔状态序列的顺序那么就能知道电机实际转了哪个方向。不过在学习时我们不一定需要知道绝对正反转因为后续通过互锁逻辑也能判断。我的经验是在自学习阶段不要刻意追求正转只要记录到“一致”的序列就可以了。后面通过交换任意两相霍尔信号或调整换相表总能得到相反方向的序列。3.5 第四步生成换相表的核心算法我们假设已经得到了六步状态序列比如 S0101S1001S2011S3010S4110S5100且这个顺序对应电机正向旋转。问题是这六个状态每一个对应的通电相序是什么这里有一个标准答案无刷电机六步换相时每个状态对应的通电相序不是随意定的它由电机反电势波形相位决定。如果我们默认电机是标准三相正弦反电势且霍尔信号滞后(或超前)反电势30°电角度常见值则可以把“反电势过零点→霍尔变化沿”的关系写成一张表。但这样做太理想化了实际电机可能有偏差。更通用的做法是利用“反电势电压扇区”来确定换相表。在电机旋转过程中三相绕组的反电势可以划分成六个扇区每个扇区内某一相电压最高或最低。霍尔状态通常也正好能对应到扇区。如果我们知道当前霍尔状态也知道当前电机的方向还知道扇区编号那么就能从标准换相逻辑中推导出应该导通哪两个开关管。这里给出一个更工程化的思路——强制换相与反馈修正法使用一个默认换相表让电机以固定的低速正向旋转。在旋转过程中记录霍尔状态序列。把默认换相表的“状态索引”按照新采集到的霍尔状态顺序重新映射。用代码更容易说明。假设默认换相表是根据“理论标准状态”来的它在数组里的下标顺序是// 下标对应霍尔状态编码 0~7 // 值表示当前应该输出的PWM开关组合 uint8_t default_commutation[8] {...};而我们实际采集到的霍尔状态顺序是实际编码。那么只需要建立一个映射把实际编码映射到默认表下标然后生成一张新表。例如默认编码0b101对应下标5实际状态序列第一项是0b101那么新表的下标5处应该填入默认表下标5对应的PWM组合实际状态序列第二项是0b001新表下标1处填入默认表下标0对应的PWM组合以此类推。但这样有个问题默认表的PWM组合是基于理想相位假设的如果电机的霍尔比理想位置晚30°或早30°直接用会导致换相提前或滞后。不过对于大多数普通无刷电机霍尔安装已经按照反电势对齐误差不会太大因为霍尔传感器在制造时就要按照驱动芯片的推荐位置摆放。如果是一个全新非标电机可以考虑用反电势过零点补偿法做精校正工业上这叫“霍尔位置标定补偿”。3.6 学习完成后的自检与验证生成新表后不能直接认为万事大吉。我会做两个自检第一个是“空载换向检测”用新换相表以较低电压比如额定电压的20%开环驱动电机听声音是否均匀电流是否平稳。如果电机出现振动或噪声异常多半说明换相表还不对。第二个是“反向一致性检测”把换相表整体逆序驱动电机反转。如果正转时平稳反转时也平稳基本就可以确认换相表正确。如果正转平稳反转抖动往往是霍尔信号与反电势的相位关系在正反方向不对称这种问题在低成本电机里比较常见需要用软件补偿。还有一个细节自学习完成后要把换相表存入Flash或者外部EEPROM下次上电直接加载。存的时候顺带把相位类型120/60、霍尔电平极性、学习方向这些参数也一起保存以后换电机时就能快速切换。4. 实操记录一次完整的自学习过程4.1 测试平台搭建纸面聊得再多不如实际跑一遍。我这里拿一套很常见的实验环境举例STM32F103主控TIM1输出6路PWM霍尔信号接到PA0~PA2配置为外部中断每个霍尔状态的跳变都会触发一次中断中断里读取当前霍尔编码并记录。电机是那种常见的云台无刷电机额定电压12V极对数为7带霍尔传感器但是没有提供线序资料。接线时霍尔信号线我先随意接了三根电机相线也随意接了。为了保险在母线串了一个1Ω采样电阻方便用示波器看电流波形。整个测试上位机通过串口打印霍尔状态和时间戳。4.2 开环拖动学习的详细步骤第一步初始化PWM输出频率设成16kHz死区时间500ns。死区一定要有否则上下桥直通会直接冒烟。初始目标转速定在120rpm极对数7电频率是14Hz电周期约71.4ms六步每步约11.9ms。这个速度不高不低霍尔信号稳定电流也不会很大。第二步跑自学习流程。代码里先让输出使能然后按默认表的顺序依次给六个PWM状态每个状态保持11.9ms。同时霍尔中断服务函数里记录“上一个状态→当前状态”的迁移事件。为了不丢数据我用一个环形缓冲区存最近32个状态变化事件。第三步等电机转完两圈后停止PWM把环形缓冲区里的数据拆解。正常情况下会看到一串有规律的状态跳变。我这次测下来的序列是101 → 001 → 011 → 010 → 110 → 100 → 101没有出现000或111所以判定为120°相位正转。这个序列其实和标准序列一模一样说明当前霍尔线序恰好和默认理论序一致。但我之前遇到过另一种情况序列是100 → 110 → 010 → 011 → 001 → 101这是反序说明电机转向和预期相反或者任意两相霍尔交叉。解决办法是在软件里把换相表的遍历顺序反转即可。4.3 参数计算与换相表生成实例在当前平台我生成换相表的方法是用预定义映射。默认状态下霍尔编码与开关管组合的关系是这样设定的霍尔编码导通相序A B-等简述101A B-AB导通001A- CAC导通011B C-BC导通010B- ABA导通110C A-CA导通100C- BCB导通以上只是举例不要直接套到你的电机上因为反电势相位、霍尔安装差异都会影响。实际生成的换相表可以放在一个长度为8的数组里数组下标对应霍尔编码0~7数组内容为PWM寄存器比较值组合。当霍尔中断读取到编码后直接查表输出即可。我测到的序列是101→001→011→010→110→100所以comm_table[0b101] pwm_AB; comm_table[0b001] pwm_AC; comm_table[0b011] pwm_BC; comm_table[0b010] pwm_BA; comm_table[0b110] pwm_CA; comm_table[0b100] pwm_CB;如果状态序列是反序的那就按另一种方向赋值。这样就能保证电机在任意接线下的换相逻辑都是正确的。关于参数还有一个容易被忽略的霍尔信号滤波时间常数。电机高速运行时霍尔信号频率可能达到几千赫兹如果滤波器时间常数太大会导致霍尔状态变化滞后影响换相精度。我在代码里用软件方式处理每次霍尔中断触发时先连续读三次IO状态取一致的那个作为有效状态相当于一个数字去抖。这样既不影响高速又能滤除毛刺。4.4 波形验证与结果学习完成后我用示波器抓了电流波形。用正确的换相表驱动时母线电流波形是相对平滑的换相时刻的电流毛刺很小。而用错误换相表驱动时电流波形会有明显的周期性尖峰同时电机转速难以提升。我还特意试了三种情况正转、反转、随机线序。随机线序下自学习同样能在一秒左右完成换相表生成后电机运行平稳。这说明自学习算法对线序组合是完全鲁棒的。有一点必须坦白在极低速比如低于30rpm且负载较大的情况下开环拖动学习可能会失败因为电机可能因为力矩不足无法顺利换向导致霍尔状态序列混乱。解决方案是学习前先减小负载或者用更大的驱动电流或者干脆把转子手动盘到一个已知位置再开始同步。更稳妥的办法是用“高频注入”法在电机静止时通过注入特定电压矢量结合电流响应判断转子位置和霍尔位置不过这个方法实现复杂一般项目里不常用。5. 工程化落地中的关键问题与排障速查5.1 霍尔干扰导致的错误学习实际现场最容易碰到的问题就是噪声干扰。有一次我用长飞线连接霍尔和控制器长度超过50厘米没有屏蔽自学习序列里频繁出现非法状态比如101和100之间突然蹦出001显然是信号串扰。解决方法用双绞线或者屏蔽线屏蔽层单端接地。在霍尔电源引脚附近加一个0.1uF去耦电容在信号线上加100Ω到1kΩ的串联电阻配合对地电容组成低通滤波。如果在高频PWM逆变器附近注意布线时霍尔线远离相线尤其是远离输出端的大电流环路。如果你在调试时发现自学习生成的状态序列里出现“非相邻跳变”比如101直接跳到110中间跳过了001基本就是干扰或者接触不良。建议先别调算法先解决物理层面的噪声问题。5.2 自学习结果正确但电机仍然抖动的排查这种情况很让人抓狂。换相表看起来没问题霍尔波形也正常但电机运行在高频噪声大、力矩波动。原因往往不是霍尔线序而是“换相时刻超前/滞后”。常见原因有三个一是霍尔信号与反电势相位本身存在偏差。有些电机为了改善低速性能霍尔传感器位置故意做偏移需要软件补偿。补偿方法在不同转速下比较反电势过零和霍尔沿的时间差拟合出一个补偿角加到换相表中。二是死区效应。死区时间设置过大低转速时影响很明显。我踩过坑死区时间默认设为2us电机在高速时正常低速时发热严重。后来把死区时间从2us降到500ns同时适当增加PWM频率到20kHz低速抖动明显改善。三是PWM模式选择。如果使用单边调制而不是互补PWM换相时刻的续流路径不同也会造成转矩脉动差异。建议在固定扇区内保持同一PWM策略不要混用。5.3 常见问题速查表我整理了一份自学习状态下最常遇到问题与解决方法的表格很多是长期实践积累出来的仅供参考。现象可能原因解决步骤霍尔信号始终为0或1霍尔供电缺失或没接上拉量供电检查上拉确认霍尔输出脚霍尔状态只出现3种且间隔很大某一路霍尔信号断线或接触不良用示波器逐路检查霍尔输出波形自学习序列中反复出现000或11160°相位电机或传感器信号干扰确认相位类型用滤波和去抖处理电机开环拖动时不转只有“呲呲”声电流不足、换相表严重错误或转子卡死提高占空比检查母线电压盘一下转子自学习完成后电机正转正常反转抖动霍尔与反电势相位不对称用反电势法做角度补偿高速时电机噪声大电流尖峰明显霍尔信号滞后太大滤波过重减小滤波常数检查霍尔沿边沿质量换相瞬间电流尖峰大死区时间设置不当或续流路径异常调小死区检查下桥PWM互补逻辑上电后偶尔学习失败状态序列乱转子初始位置不定且开环同步失败先注入固定电压让转子定位再开始拖动学习5.4 自学习状态机的可靠性设计如果你打算把自学习代码量产到产品里绝不能只靠一次学习就拍板。我的做法是加入“两次学习一致性校验”完成第一次学习后保存换相表再复位重新学习一次对比两次结果是否一致。如果一致才把表写入Flash。如果不一致说明接线、电机或环境有问题才会抛出错误。另外自学习之前要判断电机是否在转。如果有外部负载拖着电机转且转速较高直接开环拖动可能会导致母线过压损坏驱动器。所以状态机里必须有“静止检测”逻辑先让所有PWM输出高阻测量电机端电压反电势如果检测到明显的反电势就说明电机在转此时禁止自学习。等电机停稳后再执行。这一点在风机、水泵等惯性负载上尤其重要。我的一个朋友曾直接把自学习功能用在带惯性负载的电机上结果上电瞬间因为电机还在转开环换相产生剧烈电流冲击驱动板直接报废。后来我在所有涉及自学习的项目中都默认强制加入“转速为零”前置条件省了很多麻烦。6. 从自学习延伸霍尔同步角度与PID控制的细节热点里提到的“霍尔同步角度”和“PID控制”这里也多说几句。自学习完成后霍尔传感器依然只提供6个离散位置。想做方波六步控制这已经足够了但如果你想做正弦波控制或者更快响应、更平滑的动态控制只靠这6个位置是不够的。更精细的做法是在霍尔信号之间做“角度插值”利用霍尔信号每60°电角度触发一次中断在中断里记录定时器计数值然后估算出两次霍尔中断之间的电角度增量从而用软件估算实时转子位置。估算出的“霍尔同步角度”可以用于速度环反馈配合PID控制器做闭环调速。我习惯在霍尔中断里更新时间戳和速度计算然后在主循环中用PI速度环输出目标扭矩再根据霍尔同步角度查表生成SVPWM或者SPWM信号。这种方式虽然没有编码器那么精确但足以满足多数无刷电机调速场合而且成本低、可靠性好。这里有一个工程技巧霍尔同步角度的精度受换相中断延迟影响很大。中断响应慢了估算出的角度就会偏大或偏小。最高优先级中断必须一致给霍尔沿捕获而且中断服务函数要极短尽量只做“存时间戳读状态”两件事其他计算放到主循环或者更低优先级中断里。我实际统计过一个20MHz主频的MCU霍尔中断函数只要超过30微秒在高速电机上就可能引入十几度的角度误差。还有一点速度环PID参数在不同转速区间可能需要变增益。霍尔在线序自学习之后电机正反转都会很对称这给PID调试减少了很多干扰项。但如果电机正反转性能不一致PID参数往往要分开调我遇到过不少项目因为换相表不对称而导致正转环稳、反转震荡最后查出来还是霍尔线序引起的。最后再分享一个个人经验小技巧霍尔线序自学习代码写起来不难难的是把它做得“鲁棒”。我见过不少工程师直接抄网上开源的“自动换相”代码在自己电机上跑不通就怀疑算法其实大多数情况下都是硬件信号质量或者初始定位的问题。我的建议是在硬件上留足测试点把三个霍尔信号和三相端电压都引到排针调试时用示波器先确认波形是否正常再去调算法。示波器看波形能解决80%的“疑难杂症”比反复改代码有用得多。如果你打算自己写自学习功能可以把模块拆成两个独立部分第一部分是“序列采集”只管记录状态跳变第二部分是“表生成与校验”只管算换相表。两部分用结构体传给对方方便单元测试。实际测试时还可以把采集到的序列用串口打印出来手写对照这样即使程序有bug也能快速定位是采集的问题还是表生成的问题。一点个人体会线序自学习不是一个“锦上添花”的功能而是让电机驱动产品真正易用的关键。从用户角度看他们不想了解什么霍尔A、霍尔B也不想对着线色表找半天他们插上电希望电机就转。自学习就是把这个体验做好的一环对后期维护、产线装配、多供应商切换都特别友好。如果你正在做无刷驱动这一步值得花时间做扎实。
返回列表