ARTICLE DETAIL

资讯详情

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

SimpleFOC霍尔传感器校准:解决电机抖动问题的关键步骤

SimpleFOC霍尔传感器校准:解决电机抖动问题的关键步骤 1. 霍尔传感器与电机抖动的真实关系1.1 霍尔传感器在SimpleFOC中到底做了什么事很多人一开始都以为霍尔传感器就是一个“测转速”用的东西实际上它在SimpleFOC里的定位比这重要得多它是整套FOC控制的位置反馈来源。FOC的核心不是“把三相正弦波发给电机”就行而是必须知道转子磁极当前在哪个电角度才能让电流矢量始终朝正确方向作用。不知道当前转子在哪电机就只是瞎转。霍尔传感器在这套系统里给了你一个“绝对位置”的粗略认知。三路霍尔输出把360度电角度切成6个扇区每个扇区正好对应一个三态组合。比如常见的霍尔状态顺序是001、011、010、110、100、101每个状态只负责60度电角度范围。SimpleFOC要做的事情是先判断当前落在哪个扇区再根据上一次和本次采样之间的时间差在扇区内部做线性插值最终估算出一个连续的电角度信号。这就是霍尔方案最大的特点比编码器便宜很多安装也简单不怕油污灰尘但它本身的分辨率低。SimpleFOC把60度的一个扇区当作线性区间来处理如果霍尔信号时序不对、扇区顺序错乱、或者零位对不齐插值出来的角度就是错的。角度错了后面的Clarke变换、Park变换全都会错电流矢量也跟着错位表现出来就是各种奇怪的抖动。1.2 抖动来自哪里从电角度错位看问题电机抖动这事很多人第一反应是去调PID。速度环P小了、I大了一通乱调结果发现该抖还是抖。我踩过几次坑之后得出的结论是在霍尔传感器方案里先查电角度准不准再去碰PID。电角度错位会带来几种典型现象。第一种是方向反了霍尔解算出来的电角度随转子转动方向是反向的FOC电流矢量和反电动势完全拧着来电机不仅抖动还会啸叫、发热严重时直接堵转。第二种是零位偏移没校准也就是电角度零点和电机反电动势零点不对齐电流矢量和磁极之间存在固定偏差。这种偏差不会让电机完全转不了但会让转矩波动很大低速时表现为一顿一顿的步进感像步进电机在走整步一样。第三种是扇区跳变不连续也就是某一时刻霍尔状态从扇区A直接跳到扇区C电角度瞬间突变电流也瞬间跳变最容易引发的是启动瞬间的“咔咔”声和低速阶段的抖动。这里可以类比一下FOC每一拍都在根据当前电角度推一下转子推的角度对不对决定了力是正向助力还是侧向干扰。你如果每推一次都偏那么几度高速时因为有转动惯量兜着感觉不明显低速时就全暴露出来了推一下歪一下不抖才怪。所以霍尔传感器的校准本质上就是确保FOC能在“正确的时间”往“正确的方向”推转子。2. 校准前必须做好的3项准备2.1 硬件接线与中断引脚选择校准霍尔传感器第一步不是写代码而是把硬件接对。STM32F405的引脚资源很丰富但霍尔传感器引脚不是随便接哪个IO都行。因为SimpleFOC的霍尔采样依赖外部中断你要选的引脚必须先确认支持EXTI中断。以我常用的STM32F405RGT6为例PA0、PA1、PA2是一组PC6、PC7、PC8是一组这两组都支持外部中断选择哪组看你的剩余引脚资源。霍尔传感器开关量输出大多是开漏结构板上有没有上拉电阻很关键。如果霍尔板是只引出H1、H2、H3三个信号线的裸板你必须在MCU这端接上拉电阻建议2.2k到10k之间都可以我习惯用4.7k接到3.3V。如果忘记上拉引脚就会在霍尔导通和截止之间来回飘中断频繁触发状态解码完全乱套你会看到电机转一圈霍尔角度跳得毫无规律。另一个容易忽略的点是霍尔信号线上的滤波电容。很多霍尔板会自带几纳法的滤波电容这是好事能滤掉毛刺但如果容值偏大信号边沿会变缓导致MCU读取状态时落在不稳定区间。我遇到过一块板子霍尔引脚对地接了100nF电容电机高速一转角度信号就出现周期性跳变。排查了半天最后把滤波电容换成10nF才算干净。所以接线时先确认霍尔板的滤波参数别盲目加电容。2.2 极对数确认与驱动器相序霍尔校准里最基础也最容易错的一个参数是极对数。极对数填错后面所有电角度计算都会按错误的比例缩放校准自然没意义。拿到一台不熟悉的电机不要只依赖铭牌数据最好自己实测一遍。实测方法很简单先用SimpleFOC开环模式让电机以极低速旋转比如目标角速度设成0.5rad/s观察三相电流波形的完整周期和电机机械转动圈数的对应关系。如果电机转一圈电流波形经历了7个完整正弦周期那极对数就是7。我平时会用一个可调直流电源代替驱动器手动给UVW三相依次通电让电机以一个固定角度吸合然后转动电机轴并记录每圈出现的磁阻点数也能快速估出极对数。不管用哪种方法确认的参数一定要和实际电机一致。驱动器相序也要同时确认。三相电机U、V、W接到驱动器的顺序如果和霍尔传感器解算出的角度不匹配校准出来的零位偏移要么不稳定要么每次上电都不一样。最简单的验证方式是把霍尔传感器读数打印出来同时手动缓慢转动电机轴看电角度是否连续、变化方向是否正确。如果电角度总是在某个位置突然跳变很可能就是驱动器相序和霍尔扇区不匹配。2.3 环境与库版本准备我推荐用PlatformIO加lib_deps的方式搭建工程比Arduino IDE管依赖舒服很多。在platformio.ini里这样写[env:blackpill_f405] platform ststm32 board blackpill_f405 framework arduino lib_deps askuric/SimpleFOC^2.3.3STM32F405用Arduino框架跑SimpleFOC没什么问题注意选对板级配置文件就行。如果你用的是自己画的板子就在调整board设置后确认串口打印能正常回传数据。调试阶段一定把波特率固定下来比如115200霍尔传感器原始角度数据每100毫秒打印一次这样看扇区变化和方向最直观。版本这块多说一句SimpleFOC 2.3.x和2.2.x在API上有差别网上很多教程的代码拿过来直接编译会报错。我下面贴的示例代码基于2.3.3如果你用其他版本对照库里的HallSensor头文件把参数名改一下整体思路是不变的。3. 霍尔传感器精准校准的5个关键步骤3.1 步骤一让霍尔传感器先跑起来校准的第一步是先把传感器这一路打通让它能正确输出角度数据。你需要创建HallSensor对象把三个霍尔引脚和极对数传进去。在我的测试板上霍尔引脚接的是PC6、PC7、PC8对应代码#include SimpleFOC.h #define POLE_PAIRS 7 #define HALL_A_PIN PC6 #define HALL_B_PIN PC7 #define HALL_C_PIN PC8 HallSensor hall HallSensor(HALL_A_PIN, HALL_B_PIN, HALL_C_PIN, POLE_PAIRS, digitalRead); void doH1() { hall.handleA(); } void doH2() { hall.handleB(); } void doH3() { hall.handleC(); } void setup() { Serial.begin(115200); hall.init(); hall.enableInterrupts(doH1, doH2, doH3); } void loop() { hall.update(); Serial.printf(mech: %.4f elec: %.4f state: %d\n, hall.getMechanicalAngle(), hall.getElectricalAngle(), hall.getState()); delay(10); }注意几个细节。hall.getState()返回的是当前解码出的扇区状态这个值在步骤三里要用来验证扇区顺序。enableInterrupts传入的三个回调函数必须是普通函数或者静态成员函数不能直接传类方法这是中断函数的硬性要求。接线正确、引脚不上拉的情况下你缓慢转动电机轴串口输出的机械角度应该是一个从0到6.283也就是2π循环变化的连续值不会有跳变到负值的情况。极对数7对应的电角度应该是在机械角度基础上乘以7转动一圈电角度会经历7个完整的0到2π循环。如果这里的数值变化符合预期说明霍尔传感器基础读取已经通了。3.2 步骤二开环转一圈先把传感器方向定下来传感器方向是最容易忽略的一环。SimpleFOC的霍尔传感器类里面有一个direction字段但很多人在校准偏移量时根本没注意到它。方向不对后面做再多对齐都是白搭。确定方向的办法很简单用开环方式驱动电机转起来同时观察霍尔解算出的电角度变化方向。代码可以在当前工程基础上加一个开环电机对象BLDCMotor motor BLDCMotor(POLE_PAIRS); BLDCDriver3PWM driver BLDCDriver3PWM(PA8, PA7, PB1); void setup() { driver.voltage_power_supply 24.0F; driver.init(); motor.linkDriver(driver); motor.linkSensor(hall); motor.controller MotionControlType::angle_openloop; motor.init(); } void loop() { motor.move(2.0F * _PI * 0.3F); // 0.3圈/秒低速转动 hall.update(); Serial.printf(mech: %.4f, elec: %.4f\n, hall.getMechanicalAngle(), hall.getElectricalAngle()); delay(10); }电机以正方向缓慢旋转时正常情况下getMechanicalAngle()应该持续增大到2π后归零重新开始。如果看到角度持续减小说明传感器方向解算反了需要在初始化里指定反向hall.direction Direction::CCW; // 根据实际情况选择注意这里不是让你猜而是根据实际打印结果来设置。设完之后再转一圈确认角度变为递增。这一步做对了Sensor方向标记就修正了后面偏移量校准才有意义。你说“我只是低速开环转了一圈为什么就能把方向定了”原因在于FOC的Park变换和PID控制器都假设电角度是随转子位置单调变化的。如果方向反了相当于坐标变换理论里的d-q坐标系跟着转子的实际转向相反电流矢量的分解就全是错的这种问题没法通过调参数弥补。3.3 步骤三观察霍尔扇区次序判断线序是否正确方向定了还只是第一步。接下来要把霍尔传感器的六种状态逐个打印出来确认扇区顺序是不是连续的1到6规律递增或递减。这一步的目的是验证霍尔信号线的物理连接顺序是否和电机换相顺序匹配。常见的情况是霍尔线接成了H1和H2反了霍尔状态会从1跳到6再跳到2完全不成顺序。这种不规则跳变会让扇区插值彻底失效电角度时不时的突变低速运行一定抖。你可以把状态值打印出来在电机慢速开环旋转时记录一串状态例如state: 1 state: 3 state: 2 state: 6 state: 4 state: 5 state: 1理想情况是六个状态全部出现并且按照一个唯一的顺序循环。如果中间出现缺状态、重复状态、或者跳跃说明霍尔线路连接有误需要交换霍尔信号线或者重新确认供电。很多时候直接交换H1和H2两条线就能解决动手前先在图纸上标一下别把顺序记混。还有一种比较隐蔽的问题霍尔传感器本身是好的但三路输出接到了MCU的引脚上有一路引脚不支持外部中断。外部中断没触发SimpleFOC就永远无法更新那一相对应的输入表现出来就是某两个状态永远合并成一个。这种情况从状态日志里看某个状态消失了别的状态出现时长变成正常状态的两倍。解决方法是把引脚换到支持EXTI的管脚上比如PA0、PA1、PA2。3.4 步骤四用initFOC完成电角度零位对齐霍尔传感器方向对了、扇区顺序也连续了接下来才轮到真正意义上的“校准”把霍尔解算出的电角度零点和电机反电动势的相位零点对齐。SimpleFOC里最直接的做法是依靠motor.initFOC()完成自动对齐。这个过程会往电机定子上施加一个低电压矢量把转子拉到一个确定的电角度上同时读取当前霍尔传感器的角度计算出修正偏移量zero_electric_angle。简单的说就是告诉控制算法“当转子在这个位置时霍尔传感器应该报告的电角度是多少”。代码上在校准阶段把对齐电压设小一点安全很多默认值3V在没有确认情况下先用1.5V也能完成对齐只是在有负载的情况下可能拉不动转子。实际操作时我通常这样配置motor.voltage_sensor_align 2.0F; motor.linkSensor(hall); motor.linkDriver(driver); motor.controller MotionControlType::angle_openloop; motor.init(); motor.initFOC();执行完initFOC()之后把校准结果打印出来看一下Serial.println(motor.sensor_direction); Serial.println(motor.zero_electric_angle);如果zero_electric_angle的值每次上电都不一样说明霍尔传感器信号里有随机毛刺或者上一句说的扇区次序不稳定先排查硬件再往下走。如果这个值稳定复现说明零点对齐已经完成。这里补充一个容易被误解的地方电机带着霍尔传感器启动时initFOC()里的自动对齐会在上电瞬间强制执行。如果你的应用不允许电机上电时转动一下就不能依赖这一套自动校准而是要把校准好的zero_electric_angle固化到EEPROM里下次上电直接调用motor.initFOC()的替代校准流程。但前提是你已经把这个参数测准了。3.5 步骤五闭环低速、高速联合验证前面四步做完理论上电角度已经是准的。但“准”不是一个抽象概念要在闭环运行下验证。我习惯用三个速度区间分别观察极低速0.5rad/s、中速5rad/s、接近额定速度的15rad/s。切到速度闭环时代码长这样motor.controller MotionControlType::velocity; motor.torque_controller TorqueControlType::voltage; motor.velocity_pid.P 0.15F; motor.velocity_pid.I 0.5F; motor.voltage_limit 12.0F; motor.init(); motor.target 0.5F; // rad/s低速起步极低速工况下最容易暴露霍尔问题。如果在0.5rad/s时还能听到周期性的嗡嗡声或者从霍尔乱序导致的轻微顿挫说明某一扇区的插值不理想。此时可以稍微改一下velocity_pid的P值试试看抖动是否跟随参数变化如果PID参数无论怎么调都解决不了特定位置的顿挫那大概率还是霍尔扇区或零位有偏差回头检查步骤三。中高速验证主要看另一个指标电流是否有高频毛刺和异响。霍尔传感器在较高转速下中断触发频率会明显升高如果中断回调里处理太久或者扇区边界角度跳变较陡电流波形上能看到一个振动尖峰电机声音变沙这时要优先检查中断延迟而不是PID参数。验证通过的标准我给自己定的是从0.5到15rad/s全程无啸叫、无低频脉动、正反转切换平滑。只要有一个速度点抖就回到对应步骤重查不要带着疑问进量产。4. 校准时最常踩的5个坑4.1 坑一霍尔引脚浮空导致状态跳变我遇到过一块霍尔板板子上没做上拉MCU那端又忘了配置内部上拉结果电机静止时串口打印的角度都在随机跳动。SimpleFOC的霍尔读取用的是数字电平引脚浮空时一旦有感应噪声就会误触发状态切换。解决办法是在hall.init()前后把对应GPIO拉起来或者直接在硬件上加4.7k上拉电阻。检查顺序先是测静态电平再看动态波形。4.2 坑二中断回调里干了杂事霍尔中断回调函数要求短平快。如果有人在回调里放串口打印、延时、甚至跑了一个滤波算法中断频率稍微升高一点就会占用大量CPU造成PWM波形被撕裂电机噪声增大。我在调试阶段也干过这事还傻傻地认为是传感器没校准好。后来把打印全部移到主循环里问题才消失。记住了中断回调里除了handleA()、handleB()、handleC()之外一句话都不要多写。4.3 坑三极对数填错方向判断全乱有个电机铭牌特别含糊标称“14极”我物理上数了一圈也是14个磁极填极对数的时候却填了14转起来角度变化周期短了一半。极对数是磁极对数不是磁极数量。14个磁极对应7对极代码里必须填7否则电角度会以两倍速度变化。FOC算法看到的角度变化速度比真实值快电流相位自然错位低速能转中高速直接抖成筛子。校准前不管是看铭牌还是实测都要把“极对数磁极总数/2”这个关系记牢。4.4 坑四只对齐零位不验证扇区均匀度很多教程做到initFOC()对齐就让用户收工了但电机低速运行时依然会在固定位置抖动。原因在于三个霍尔传感器的物理安装不可能绝对均匀每个扇区实际宽度不是严格60度电角度。SimpleFOC默认假设扇区内部线性且每个扇区等宽得到的电角度会有周期性的非线性误差。如果你发现低速抖动总是和霍尔状态切换位置重合并且换扇区后电流会有明显扰动说明必须做扇区级校准或者干脆换更高分辨率的编码器方案不要指望靠PID把位置非线性误差吞掉。4.5 坑五霍尔供电不稳或磁铁布局不对称霍尔传感器对供电电压比较敏感3.3V供电时如果和MOSFET驱动共用一组电源高速换相瞬间的压降会导致霍尔电平被拉低到阈值附近引发误触发。解决方法是霍尔供电单独走一路LDO或者在霍尔供电引脚旁多加一组10uF和0.1uF的电容。另外转子磁环的磁极宽度如果不均匀霍尔翻转的物理位置会偏离等分点这种偏差属于硬件公差软件校准只能缓解不能根治批量生产时要把霍尔磁铁的安装一致性纳入检查项。5. 实测效果对比与一点心得5.1 校准前后的现象对比一套完整的校准流程跑下来最直观的变化是启动和低速表现。我这里有一组简单对比同一块板子上同一个电机校准前和校准后的现象差异很大检查项校准前校准后0.5rad/s低速每分钟多次低频脉动基本平稳声音均匀启动过程偶发“咔哒”声偶尔启动失败平稳起步无异常噪声5rad/s中速能转有周期嗡嗡声安静电流波形平滑正反转切换切换瞬间明显顿挫切换平滑过零无卡顿温升30分钟空载明显发热同工况下温升降低这不是玄学而是电角度误差被校正后的直接结果。电流矢量和反电动势对齐了做功效率提升多余的热量和噪声自然下降。5.2 关于“精准校准”的一个重要提醒我必须重申一点霍尔传感器的物理分辨率就摆在那里每60度电角度才一个扇区你再怎么校准都不可能达到增量式编码器那种精度。SimpleFOC的霍尔插值算法在扇区内能提供一个连续角度值但它本质上是在“猜”两个霍尔翻转点之间的具体位置。校准能把“猜”的基准误差修掉把方向、零位、扇区顺序修对但修不了霍尔本身安装偏差带来的扇区不等分问题。所以如果你的项目要求低速运行非常平滑、或者要做高精度的位置伺服控制别死磕霍尔。霍尔传感器的正确应用场景是中等精度、低成本、恶劣环境下的无刷电机控制比如风机、泵、工具类电机。在这些场景下把霍尔校准做扎实完全可以让电机达到“告别抖动”的实际体验。我目前的多款量产设计里霍尔方案配合SimpleFOC用得很稳定关键是校准流程不偷懒每一扇区都验证过再出货。最后再说一个小经验校准程序写成单独一个初始化函数每次上电后自动执行一次方向核对和扇区状态日志数据只进不出等确认无误再切换到正常运行模式。这个习惯帮我省了大量现场排查时间尤其是遇到换批次霍尔板的时候十秒钟就能看出硬件有没有变化。调试电机这事容易绕远但只要先搞定传感器角度后面一马平川。
返回列表