尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

从零自制电调与VESC:AM32固件配置、FOC调试与硬件选型实战

从零自制电调与VESC:AM32固件配置、FOC调试与硬件选型实战 1. 从一堆炸掉的MOS管说起为什么我要自己折腾电调和VESC第一次接触电调是在三年前当时手里攒了一堆航模无刷电机想给一台自组的穿越机做动力系统。买过几款成品电调飞了几次就烧了拆开一看MOS管炸得面目全非驱动芯片也糊了。那时候我就想与其反复买成品不如自己搞清楚电调到底是怎么工作的能不能自己做一款。后来接触到VESC发现这东西比普通航模电调复杂得多它不只是驱动电机还涉及FOC算法、电流采样、CAN通信、固件配置几乎是一个完整的电机控制平台。再后来看到AM32这个开源固件发现它把BLHeli的很多思路重新整理了一遍代码结构清晰适合拿来学习和改造。这篇文章要聊的就是我自己从零开始做几款电调和VESC的经历。包括硬件选型、固件烧录、参数配置、调试过程中踩过的坑以及一些实测数据和对比。内容会涉及电调的基本原理、AM32固件的配置方法、VESC的硬件方案和固件编译、电流采样校准、电机参数识别、常见故障排查等。适合有一定电子基础和动手能力的玩家也适合想深入了解无刷电机控制但不知道从哪里下手的工程师。如果你只是想让穿越机飞起来那直接买成品更省事但如果你想搞明白电调内部到底在干什么或者想根据自己的需求定制一款电调那这篇内容应该能帮你少走一些弯路。我做的第一款电调是基于STM32F051的方案后来换成AT32F421再后来尝试了VESC的硬件设计。整个过程断断续续花了大概半年时间中间烧过板子、炸过MOS、写坏过固件也遇到过电机抖动、启动失败、电流采样不准等各种问题。下面我会把这些经验按模块拆开来讲尽量把每个环节的“为什么”说清楚而不是只给一堆参数让你照抄。2. 电调与VESC的核心差异先搞清楚你要做哪一种2.1 普通航模电调与VESC的本质区别很多人把电调和VESC混为一谈其实两者在定位上有明显差异。普通航模电调的核心任务很简单接收PWM或DShot信号按油门值驱动无刷电机转动。它通常采用六步换相梯形波驱动控制逻辑相对简单对MCU的性能要求不高一颗几毛钱的8位单片机就能跑。BLHeli系列固件就是这类电调的典型代表AM32也是同一路线但代码更现代支持32位MCU功能也更丰富。VESC则完全不同。它的全称是Vedder Electronic Speed Controller最初由Benjamin Vedder为电动滑板设计。VESC的核心是FOC磁场定向控制需要实时采样三相电流通过Clarke变换和Park变换把电流分解到d轴和q轴再用PID控制器调节。这个过程对MCU的算力要求很高早期VESC用的是STM32F4系列现在也有用STM32F405、STM32F103甚至ESP32的方案。VESC还支持CAN总线、UART、PPM、ADC等多种接口可以读取电机温度、MOS温度、实时电流、转速、位置等信息功能上更像一个电机控制平台而不是单纯的“电调”。简单说普通电调是“让电机转起来”VESC是“精确控制电机怎么转”。如果你只是飞穿越机AM32这类电调足够用如果你要做电动滑板、平衡车、机器人关节或者需要精确的扭矩控制和能量回收那VESC更合适。2.2 AM32固件的定位与适用场景AM32是一个开源的电调固件项目名字来源于“Advanced Motor 32”主要面向32位MCU。它支持多种MCU平台包括STM32F051、STM32F421、AT32F421、GD32E230等也支持多种驱动方案。AM32的代码结构比BLHeli清晰很多配置项通过上位机软件设置支持DShot、PWM、OneWire等信号协议也支持双向DShot和遥测回传。我选择AM32作为入门主要是因为它对硬件要求不高一块简单的三相驱动板加上一颗AT32F421就能跑起来。而且AM32的社区比较活跃遇到问题容易找到答案。相比之下VESC的硬件设计更复杂光是电流采样电路就需要仔细设计固件编译也需要配置工具链入门门槛更高。不过AM32也有局限。它主要针对航模场景优化启动算法偏向高KV电机对低KV大扭矩电机的支持不如VESC。如果你要驱动云台电机或者机器人关节AM32可能会遇到启动困难、低速抖动等问题。这时候就需要考虑VESC方案。2.3 硬件方案选型从STM32F051到AT32F421我最早做的电调用的是STM32F051K8这颗MCU主频48MHz有12位ADC支持三相PWM输出价格便宜适合入门。但STM32F051的ADC采样速度有限跑AM32时如果PWM频率设得太高电流采样窗口会很窄导致采样不准。后来换成AT32F421主频120MHzADC采样更快价格也差不多整体表现更好。再后来做VESC方案时我选了STM32F405RGT6这颗MCU主频168MHz有浮点运算单元跑FOC算法绰绰有余。不过STM32F405的价格比AT32F421高不少而且需要外部晶振和更复杂的电源设计。如果你只是想学习FOC也可以先用ESP32方案虽然性能不如STM32F405但开发环境更友好成本也更低。驱动部分我试过几种方案IR2104半桥驱动加MOS管、DRV8301集成驱动、以及分立元件搭建的栅极驱动。IR2104方案简单便宜但需要自己处理死区时间和自举电容DRV8301集成度高内置电流采样放大器但价格贵而且配置寄存器比较麻烦。分立方案最灵活但调试难度最大稍不注意就会炸管。下面这张表是我用过的几种方案对比方案MCU驱动芯片电流采样适用场景难度AM32入门版AT32F421IR2104单电阻航模电调低AM32进阶版STM32F421DRV8301三电阻航模/车模中VESC简化版STM32F103DRV8302三电阻滑板/机器人中高VESC标准版STM32F405DRV8301三电阻高性能应用高选型时不要一味追求高性能先想清楚你要驱动什么电机、需要多大电流、要不要能量回收、要不要CAN通信。如果只是驱动一个小型无刷电机做实验AT32F421加IR2104就够了如果要驱动大功率电机那MOS管、电容、PCB布局都要重新考虑。3. AM32电调的制作与固件配置3.1 硬件设计要点MOS管选型与栅极驱动做电调最核心的部分是三相逆变桥也就是六个MOS管组成的桥式电路。MOS管的选型直接决定了电调的电流能力和可靠性。我一开始用的是IRF3205这颗管子耐压55V电流110A导通电阻8mΩ看起来参数不错但实际用起来发热严重。后来换成AON6500导通电阻只有2mΩ左右发热明显改善。选MOS管时不要只看电流参数还要看导通电阻、栅极电荷、开关速度。导通电阻越小导通损耗越低栅极电荷越小开关速度越快开关损耗越低。但栅极电荷太小也可能导致抗干扰能力下降需要权衡。另外MOS管的封装也很重要TO-220封装散热好但体积大DFN5x6封装体积小但需要良好的PCB散热设计。栅极驱动部分IR2104是一颗常用的半桥驱动芯片内置死区时间使用简单。但它需要自举电容来驱动高侧MOS管自举电容的容量和耐压要选对。我一般用1μF/25V的陶瓷电容实测效果不错。如果PWM频率较高自举电容要适当加大否则高侧驱动电压会不足。注意IR2104的死区时间是固定的大约520ns。如果你的MOS管开关速度很快这个死区时间可能偏大导致输出波形失真。这时候可以考虑用可调死区的驱动芯片或者在固件里做补偿。3.2 固件烧录与配置从BLHeli到AM32的迁移AM32固件的烧录方式取决于MCU型号。AT32F421支持串口烧录也可以用SWD调试器烧录。我一般用STM32CubeProgrammer或者AT32的官方工具通过UART1烧录。烧录前需要把BOOT0拉高复位后进入Bootloader模式。烧录完成后需要用AM32的上位机软件进行配置。上位机通过USB转串口连接电调的UART接口可以设置电机方向、PWM频率、启动功率、电流限制、温度保护等参数。我第一次配置时犯了个错误把电机方向设反了结果电机一启动就反转差点把桨叶甩出去。后来养成习惯每次配置完先不装桨叶空载测试一下转向和油门响应。AM32的配置项比较多下面这几个参数最影响使用体验Motor Direction电机转向可以设为正转、反转或双向。PWM FrequencyPWM频率一般设24kHz或48kHz。频率越高电机运行越平滑但开关损耗也越大。Startup Power启动功率影响电机启动时的扭矩。太低会启动困难太高会电流冲击。Current Limit电流限制保护MOS管和电机。根据你的硬件能力设置不要超过MOS管的额定电流。Temperature Protection温度保护超过设定温度时降低功率或停机。配置完成后建议先用小油门测试观察电流和温度变化。如果电机抖动或者启动失败可以调整启动功率和换相提前角。3.3 电流采样与校准单电阻与三电阻的取舍AM32支持单电阻和三电阻两种电流采样方式。单电阻方案成本低只需要一个采样电阻和一个运放但采样时机要求很严格需要在PWM特定相位进行采样否则采不到真实电流。三电阻方案每个半桥下管都有一个采样电阻可以同时采样三相电流精度更高但成本也更高。我一开始用单电阻方案发现低速时电流采样不准电机启动时容易失步。后来换成三电阻方案电流波形明显改善启动也更顺畅。不过三电阻方案需要三个运放PCB布局也更复杂采样电阻的阻值和运放增益要仔细计算。采样电阻的阻值选择要考虑最大电流和功耗。假设最大电流30A采样电阻1mΩ那么采样电阻上的压降是30mV功耗是0.9W。这个功耗不小所以采样电阻一般选1mΩ到0.5mΩ封装选2512或更大。运放增益一般设10到20倍把采样电压放大到ADC量程范围内。校准电流采样时可以用一个已知负载比如大功率电阻接在电机输出端通过调整运放增益或者固件里的比例系数让上位机显示的电流和实际电流一致。如果没有专业设备也可以用钳形电流表对比误差控制在5%以内就可以接受。3.4 实测数据不同参数下的温升与效率我做过一组对比测试用同一颗电机2207 1800KV同一块电调板分别设置不同的PWM频率和启动功率记录温升和效率。测试条件室温25℃电机空载油门50%运行5分钟。PWM频率启动功率MOS温升电机温升电流24kHz低18℃12℃1.2A24kHz中22℃15℃1.5A48kHz低25℃14℃1.3A48kHz中30℃18℃1.6A从数据看PWM频率越高MOS温升越明显这是因为开关损耗增加了。启动功率对温升也有影响但不如PWM频率显著。如果电调散热条件好48kHz可以带来更平滑的电机运行如果散热受限24kHz更稳妥。效率方面我用功率计测了输入功率和电机输出功率通过扭矩和转速计算24kHz下效率大约85%48kHz下效率大约82%。差距不大但长时间运行的话效率差异会体现在温升上。4. VESC硬件制作与固件编译4.1 VESC硬件架构从电源到功率级VESC的硬件比普通电调复杂得多。一个完整的VESC板包括电源部分、MCU部分、功率级、电流采样、CAN收发器、USB接口、霍尔传感器接口等。电源部分需要把电池电压降到5V和3.3V给MCU和运放供电。我一般用LM2596或者MP1584做降压再用AMS1117-3.3做二级稳压。功率级和普通电调类似也是三相逆变桥但VESC对MOS管的驱动要求更高。VESC官方方案用的是DRV8301这颗芯片内置三相栅极驱动、电流采样放大器、降压转换器集成度很高。但它需要配置寄存器SPI通信时序要正确否则芯片不工作。我第一次用DRV8301时因为SPI配置错误芯片一直输出故障信号查了好久才发现是寄存器地址写错了。电流采样部分VESC用三电阻方案每个半桥下管串联一个采样电阻通过运放放大后送入MCU的ADC。VESC的固件里有一套电流采样校准流程可以通过上位机软件自动计算采样电阻和运放增益的误差。CAN收发器用于多VESC之间的通信比如电动滑板的前后轮各用一个VESC通过CAN总线同步转速和扭矩。USB接口用于连接上位机配置参数和查看实时数据。霍尔传感器接口用于读取电机位置适合低速启动或者需要精确位置控制的应用。4.2 固件编译环境搭建从源码到二进制VESC固件是开源的源码托管在GitHub上。编译VESC固件需要ARM GCC工具链和Makefile。我一般在Linux环境下编译Windows下可以用WSL或者MSYS2。编译前需要安装arm-none-eabi-gcc然后进入源码目录运行make命令。编译过程中可能遇到几个问题一是工具链版本不匹配导致编译报错二是源码里的硬件配置文件不对需要根据你的板子修改三是库文件缺失需要手动安装。我第一次编译时因为没装libopencm3卡了半天。后来在Makefile里找到依赖项逐个安装才通过。编译完成后会生成.bin和.hex文件可以通过ST-Link或者DFU模式烧录到MCU。VESC支持DFU烧录按住BOOT键上电然后用VESC Tool或者dfu-util烧录。DFU烧录比较方便不需要拆机但速度慢一些。4.3 电机参数识别与FOC调试VESC最强大的功能之一是自动识别电机参数。在上位机软件里点击“Detect Parameters”VESC会自动测量电机的电阻、电感、磁链、霍尔传感器角度等参数。这个过程需要电机空载并且确保电机可以自由转动。识别过程中VESC会向电机注入一系列测试信号测量响应。如果电机有霍尔传感器还会校准霍尔角度。识别完成后VESC会生成一组参数包括电流环PID、速度环PID、位置环PID等。这些参数可以直接使用也可以手动微调。FOC调试的关键是电流环。电流环的响应速度决定了扭矩控制的精度。如果电流环带宽太低电机响应迟钝如果带宽太高系统容易振荡。我一般先用默认参数然后观察电流波形如果波形有振荡就降低比例增益如果响应太慢就提高比例增益。速度环和位置环的调试类似先调内环再调外环。速度环的输入是目标转速输出是目标电流位置环的输入是目标位置输出是目标转速。调试时可以用阶跃响应观察超调和稳定时间逐步调整PID参数。4.4 实测VESC驱动不同电机的表现我用VESC驱动过几种不同的电机包括航模外转子电机、云台电机、大功率内转子电机。下面是实测数据电机类型KV值电流环带宽速度环带宽启动成功率低速平稳性航模外转子18001000Hz100Hz100%一般云台电机100500Hz50Hz95%好内转子400800Hz80Hz100%好航模外转子电机KV值高电感小电流环带宽可以设高一些但低速时因为齿槽转矩明显平稳性一般。云台电机KV值低电感大电流环带宽要降低否则容易振荡但低速平稳性很好。内转子电机介于两者之间整体表现比较均衡。VESC的一个优势是支持能量回收。在电动滑板下坡时电机可以反向发电给电池充电。这个功能需要配置电池电压和最大回充电流否则可能过压损坏电池。我实测过下坡时回充电流可以到5A左右电池电压上升明显但要注意电池的充电倍率不要超过电池的承受能力。5. 常见问题与排查技巧实录5.1 电调启动失败从硬件到固件的排查思路电调启动失败是最常见的问题表现是电机不转、抖动、或者转一下就停。排查时先分清楚是硬件问题还是固件问题。硬件方面检查MOS管是否损坏、栅极驱动是否正常、采样电阻是否虚焊、电源电压是否稳定。固件方面检查启动功率是否太低、换相提前角是否合适、电机参数是否匹配。我遇到过一次启动失败电机抖动但不转。用示波器看三相输出波形发现有一相没有输出。检查后发现是那一相的MOS管栅极电阻虚焊导致驱动信号没传到MOS管。补焊后恢复正常。还有一次是固件问题启动功率设得太低电机负载稍大就启动不了。把启动功率从低调到中问题解决。排查启动失败时建议先用示波器看三相波形确认驱动信号是否正常。如果波形正常但电机不转再检查电机参数和固件配置。5.2 电流采样异常波形失真与噪声抑制电流采样异常表现为电流波形失真、电流值跳变、或者电流读数始终为零。原因可能是采样电阻虚焊、运放损坏、ADC参考电压不稳、或者采样时机不对。我遇到过电流读数跳变的问题后来发现是运放的电源滤波电容太小导致电源噪声耦合到采样信号上。加大滤波电容后波形明显改善。单电阻方案的采样时机很关键。如果采样时刻不在PWM的特定相位采到的电流可能是开关噪声而不是真实电流。AM32固件里有采样时机配置需要根据PWM频率和死区时间调整。如果调整后仍然不准可以考虑换成三电阻方案。5.3 VESC断动力原因分析与解决方案VESC断动力是指运行过程中突然失去动力电机停转或者抖动。原因可能有很多过流保护、过温保护、欠压保护、CAN通信中断、固件崩溃等。排查时先看VESC Tool里的故障信息里面会记录最后一次故障的原因。我遇到过过流保护导致的断动力原因是电流限制设得太低电机加速时瞬间电流超过限制VESC自动降功率。把电流限制调高后解决。还有一次是CAN通信中断原因是CAN总线的终端电阻没接信号反射导致通信错误。加上120Ω终端电阻后恢复正常。VESC的故障信息很有用遇到断动力时先看故障记录能省很多排查时间。5.4 常见问题速查表问题可能原因排查方法解决方案电机不转驱动信号异常示波器看三相波形检查MOS管和栅极驱动电机抖动换相提前角不对调整固件参数重新校准换相角电流读数跳变采样噪声大检查滤波电容加大滤波电容电流读数始终为零采样电阻虚焊万用表测电阻补焊或更换电阻VESC断动力过流保护查看故障记录调高电流限制VESC断动力CAN通信中断检查终端电阻加120Ω终端电阻电机发热严重PWM频率太高降低PWM频率设24kHzMOS管炸管死区时间不足检查驱动芯片换可调死区驱动6. 一些实操心得与后续扩展方向做电调和VESC这段时间最大的体会是硬件设计决定了上限固件配置决定了下限。一块设计良好的PCB即使固件参数不太完美也能稳定运行但一块设计有缺陷的PCB再怎么调固件也救不回来。所以如果你打算自己做PCB布局一定要认真对待尤其是功率级和采样电路走线宽度、接地方式、滤波电容的位置都会影响性能。另一个体会是不要一上来就追求高性能。我一开始就想做一块支持50A的电调结果MOS管选得太大栅极驱动跟不上开关损耗严重效率反而低。后来换成小电流方案先把基本功能跑通再逐步升级反而更顺利。后续我打算尝试几个方向一是用ESP32做VESC方案利用ESP32的无线功能实现手机调参二是做多路VESC的CAN总线同步用于四轮驱动滑板三是研究无感FOC的启动算法提高低速启动成功率。这些方向都有开源项目可以参考但需要自己动手验证。如果你也在做类似的东西建议先从AM32入门把电调的基本原理搞清楚再过渡到VESC。遇到问题多查资料、多动手测试不要怕炸管炸几次就有经验了。
返回列表