ARTICLE DETAIL

资讯详情

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

基于STEVAL-ESC002V1的无人机电调开发实战:从环境搭建到固件烧录

基于STEVAL-ESC002V1的无人机电调开发实战:从环境搭建到固件烧录 1. 项目概述最近一直在折腾无人机电调方向的开发手头拿到的这块STEVAL-ESC002V1评估板确实让我花了不少时间。这块板子不同于普通市售电调它是意法半导体为无人机和机器人应用设计的电子速度控制器参考设计核心控制器用的是STSPIN32F0A——一颗把STM32F0系列MCU和三相栅极驱动器集成在一起的系统级封装芯片。要在这块板子上跑自己的固件绕不开的就是STM32CubeIDE这个官方开发环境。STM32CubeIDE其实是一个基于Eclipse架构的免费IDE内置了STM32CubeMX配置工具、GCC交叉编译工具链以及调试支持。对于玩过Keil或者IAR的朋友来说第一次切换到STM32CubeIDE可能会有点不适应但它对ST自家芯片和板子的支持确实是最完整的。尤其是电机控制这个方向ST推出的MC SDK软件包和CubeMX的图形化配置能力配合起来能省掉非常多底层的初始化工作。这篇内容适合谁我觉得只要是对无人机ESC开发、无刷电机FOC/方波控制感兴趣或者手里正好有一块STEVAL-ESC002V1不知道如何下手的朋友都可以参考。我会把我从搭环境到成功烧录固件的完整过程写出来包括踩过的坑和排查思路尽量让你少走弯路。2. 硬件核心STEVAL-ESC002V1到底长什么样2.1 STSPIN32F0A系统级封装芯片STEVAL-ESC002V1最核心的器件就是STSPIN32F0A这个封装内部集成了三部分关键功能STM32F031C6或STM32F051系列MCU内核、三相半桥栅极驱动器以及DC/DC降压转换器和LDO稳压器。很多人第一次拆开板子看到这个芯片会误以为它只是一个普通的电机驱动IC但实际上它的核心是一个完整的MCU这意味着你可以完全自主编程而不是像传统ESC那样只能依赖出厂固件。芯片内部MCU的主频是48MHzFlash容量视具体型号而定对于电机控制这种实时性要求高但对存储容量需求不是特别大的场景来说完全够用。栅极驱动器部分支持最高600mA的拉灌电流能力可以直接驱动外部功率MOSFET。板载的DC/DC转换器能把输入电压降到3.3V给MCU供电所以不需要额外再接一路逻辑电源。2.2 板载功率级与电流检测设计STEVAL-ESC002V1的功率级采用三相全桥结构每一相由两个N沟道功率MOSFET组成。这块板子在电源输入端的支持范围是6.5V到48V部分版本支持更宽范围具体取决于板子上的MOSFET耐压等级。实际测试中我使用3S锂电池也就是12.6V满电电压功率余量很大。需要注意的是板子上的电流检测方案它采用低边采样电阻加运算放大器放大电流信号经过放大后送入MCU的ADC引脚。这种低边采样方案成本低、实现简单但缺点是采样波形在PWM开关瞬间会有较大的噪声需要在软件里做同步采样或者滤波处理。我现在用的固件是MCSDK的六步换相版本在处理电流信号时采用的是与PWM信号同步的触发采样方式效果比连续采样稳定得多。2.3 输入信号接口与协议支持板子上预留了三类控制信号接口标准PWM信号输入、PWM/DIR方向控制输入和CAN总线接口。通用航模接收机或飞控输出的50Hz到500Hz标准PWM信号是最常见的输入方式MCU通过输入捕获功能解析脉宽把脉宽映射为期望转速。而PWM/DIR模式在工业自动化中更常用一路PWM控制速度一路GPIO控制旋转方向。CAN接口则是为了支持更复杂的多电调通信协议ST官方也提供了专门的固件例子来演示如何在CAN总线上控制电调。2.4 接线与供电注意事项第一次给这块板上电之前有几个点一定要确认清楚。首先检查输入电源极性板子虽然有反接保护但我不建议去赌这个保护。其次确认信号线共地不管是PWM信号还是CAN信号都必须和主控板共地否则信号完全不可靠。我在调试中出现过一次烧录失败最后排查出原因是信号线参考地电位漂移USB虽然连着电脑但电源地并没有和电调电源地连在一起。官方的使用文档中明确标注了板子的最大持续工作电流测试时尽量留出30%以上的降额毕竟散热条件在实际测试环境中很难达到数据手册的理想状态。我一般会在电源输入端串一个电流限制的电子负载或直流稳压电源把限流值设到预期电流的1.2倍左右这样即使程序写错导致MOS管直通也不会立刻烧毁板子。3. 环境准备搭好STM32CubeIDE开发环境3.1 STM32CubeIDE版本选择与安装STM32CubeIDE版本迭代挺快的我建议直接从ST官网下载最新版本。安装过程在Windows平台下比较简单一路Next到底就行。要注意的是安装路径最好不要包含中文或空格虽然新版IDE已经对路径兼容性做了优化但有些第三方工具链插件仍然对路径很敏感尤其是后面如果需要使用OpenOCD或者SEGGER的调试器路径问题最容易引出莫名其妙的问题。Linux环境下安装方式类似解压后运行install脚本。不过在Ubuntu下需要提前装好一些依赖库否则J-Link调试器可能无法被识别。其实我目前主要还是在Windows环境下开发毕竟做电机调试的时候Windows下可用的上位机工具更多。3.2 安装MC SDK电机控制软件包软件环境除了IDE本身还需要安装电机控制相关的依赖。在STM32CubeIDE中可以通过Help菜单里的Additional Software功能在线安装ST Motor Control SDKMCSDK。这个SDK是整个电机控制项目的基础里面包含了电机控制中间件、适用于不同ST评估板的固件工程模板、以及一些监控调试工具。需要注意的坑在这里MCSDK发布时会绑定特定的IDE版本和HAL库版本如果IDE版本过新或者过旧可能会出现插件无法正常加载的问题。我最初装的是当时最新版的STM32CubeIDE结果MCSDK还是上一个版本导致工程无法导入。后来只好卸载新版本重新安装了MCSDK官方文档中明确支持的IDE版本。所以安装之前一定要先看MCSDK Release Notes中关于IDE兼容性的说明。3.3 创建与导入固件工程安装完MCSDK之后有两种方式拿到STEVAL-ESC002V1的固件工程。第一种是从CubeMX直接新建项目选择Board Selector搜索STEVAL-ESC002V1然后由系统自动生成基于HAL的裸机工程。第二种是从MCSDK安装目录下找到专门为这块板子提供的Motion Control示例工程直接以现有工程的形式导入IDE。我第一次使用CubeMX方式生成工程时遇到一个问题CubeMX生成的默认工程只包含基础的GPIO和时钟配置并没有集成电机控制库。后来我才搞清楚通过CubeMX生成工程后还需要在工程属性里配置MCSDK的库路径或者手动将MCSDK中间件文件夹添加到include路径和链接路径中。这个步骤非常关键否则编译时会出现大量找不到头文件的报错。3.4 编译器与调试器配置STM32CubeIDE内嵌的GCC工具链是编译ARM Cortex-M0系列的绝佳选择但默认优化级别是-O0面向调试阶段没问题。真正测试电机控制算法时如果发现PWM波形时序抖动比较明显可以把优化级别提升到-O2。但是升级优化级别之后有些依赖时序的代码行为会发生改变比如读取定时器CNT寄存器或者ADC转换完成标志位的时候可能会因为编译器重排指令而产生细微的时序偏差。这种情况我在调电流环PI参数时遇到过后来在关键代码处加了volatile修饰符问题才得到解决。调试器方面STEVAL-ESC002V1板子上并没有板载ST-Link需要在SWD接口上外接调试器。我推荐使用正版ST-Link/V2或者J-Link。在STM32CubeIDE的Run Configuration里选择对应的调试器接口并设置好SWV串行线查看器的时钟频率。SWV在电机控制调试中非常好用可以实时输出变量变化曲线特别适合观测转速和电流波形。4. 固件架构与核心设计思路4.1 电机控制算法选型STEVAL-ESC002V1的官方固件支持两种控制算法六步换相也叫做梯形波控制或方波控制和磁场定向控制FOC。六步换相算法实现简单通过对三相绕组按固定顺序通电利用反电动势检测来完成换相适用于对低速性能要求不高的场景。它的优点是CPU占用率低、对MCU的运算能力要求不高在48MHz的STM32F0系列上跑起来非常轻松。缺点也同样明显因为反电动势的幅值和转速成正比在电机零速和极低速时反电动势接近于零所以低转速性能很差还有明显的转矩脉动。FOC算法则是通过Clark变换和Park变换将三相电流转换为旋转坐标系下的直轴和交轴分量从而实现对电机转矩的线性控制。FOC在低速性能和动态响应方面远优于六步换相但是计算量也大得多对采样同步性要求高。STM32F0虽然主频不高但凭借Cortex-M0内核的高效运算能力和ST提供的数学优化库依然能在适当的PWM频率下跑通FOC只是需要精心设计控制频率和中断优先级。我实际在STEVAL-ESC002V1上对比过这两种算法。使用六步换相时电机从静止启动需要人为设定一个起始的强制换相序列否则无法判断转子位置而使用FOC时可以通过注入高频信号或者简单的开环强拉方式实现平稳启动。如果你计划把这套电调用于无人机螺旋桨驱动强烈建议上FOC虽然调试难度高一些但最终性能和噪音水平都更理想。4.2 电流采样策略与PWM同步STSPIN32F0A片上集成的运放将采样电阻上的电流信号放大后送入MCU的ADC通道。问题来了PWM开关瞬间的噪声非常大如果ADC持续采样得到的电流值会包含严重的开关噪声PI控制器看到这种噪声后会疯掉。解决方案是采用PWM中间对齐采样。ST的电机控制库中定义了特殊定时器事件来触发ADC采样确保ADC在每个PWM周期内电流处于稳态时才启动转换。具体实现时配置定时器的重复计数寄存器使得ADC在PWM周期的下溢事件或者中心计数匹配事件时刻触发。这种方案需要仔细调整采样触发时刻因为电流在开关管导通后半段才趋于稳定采样点太早会采到振铃信号太晚会接近开关关断时刻的电流下降沿。我这里提供一个经验值对于20kHz的PWM频率PWM周期是50微秒我一般在PWM高电平持续的中间位置触发采样偏移量设置在PWM周期的25%到30%左右。当然这个值不是固定的需要结合MOSFET栅极驱动电阻、电流放大器带宽等参数微调。你可以通过STM32CubeIDE的调试模式实时观察ADC采样值配合示波器对比电流波形找到最佳采样点。4.3 速度环与电流环的级联控制官方固件中默认的控制结构是级联结构外环是速度环内环是电流环或转矩环。速度环的输出作为电流环的参考输入电流环的输出经过PWM调制后驱动功率级。这种结构的优势在于物理含义清晰便于参数整定。以FOC为例电流环PI控制器的带宽通常设置为速度环带宽的5到10倍。我在这块板子上设置的电流环控制频率为20kHz速度环为2kHz。如果你的PWM频率是20kHz那么电流环可以每个PWM周期执行一次而速度环每10个PWM周期执行一次。实现方式是在PWM中断服务函数里用一个计数器对周期进行分频代码里只需要一个static变量累加轻松实现多速率控制。4.4 保护机制的固件实现电机控制固件里最不能省的就是保护机制。STEVAL-ESC002V1提供硬件级的过流保护和过温保护但固件层面还需要自己实现软件保护逻辑双保险才能避免炸管。我在固件中实现了三类软件保护过流保护、欠压保护、堵转保护。过流保护的实现最简单也最直接——在电流环中断里比较三相电流的绝对值如果持续超过设定阈值1ms直接关闭PWM输出并锁存故障状态。注意这里的持续时间的判断很重要因为电机启动瞬间会有较高的浪涌电流瞬时过流不一定代表故障直接关断反而会导致启动失败。欠压保护主要针对电池供电场景电池电压在放电末期会急剧下降如果不及时保护MOSFET会工作在非完全导通状态导致热损耗剧增。堵转保护的实现思路是检测速度环的误差值如果给定转速很高但实际转速在较长时间内没有提升就判定为堵转主动关断PWM。4.5 通信协议与参数在线调整官方固件中预留了通过UART串口进行参数调整的功能。通过串口命令行接口可以实时修改PID参数、PWM频率、启停控制等核心参数。这个功能在调试阶段帮助非常大不用每次改参数就重新编译烧录。我建议在开发初期就搭好一套完整的串口通信协议即使官方固件没有提供也可以基于HAL库的UARTDMA中断自己实现一个轻量级的指令解析器。协议格式可以参考常见的AT指令风格或者采用简单的帧格式帧头命令字数据长度数据体CRC校验。串口波特率设置为115200或者更高注意在电机运行时串口中断和PWM中断之间的优先级安排尽量把串口中断放在低优先级避免干扰实时控制。5. 实操过程从编译到烧录的全流程记录5.1 编译前设置与工程配置检查在执行编译之前有几项工程配置必须逐项确认。第一项是芯片型号确保工程中选定的目标芯片是板子上实际焊接的型号如果Boot引脚配置不同Flash大小可能不匹配。第二项是时钟配置STSPIN32F0A内部虽然有HSI振荡器但电机控制对时钟精度要求较高建议使用外部晶振或者利用内部PLL将系统时钟提升到48MHz。在CubeMX图形化界面中直接配置时钟树比手动修改寄存器可靠得多。第三项是优化等级。调试阶段保持-O0正式功能验证时改为-O2。但要注意在FOC算法中涉及arm_sin_f32之类的数学函数时优化等级对计算精度的影响有时是意想不到的最好在改优化等级后重新验证一次电机输出波形的质量。5.2 编译错误排查实录我在第一次编译下载的官方示例工程时遇到了几个令人抓狂的错误。第一个错误是找不到stm32f0xx_hal_conf.h头文件。排查后发现是MCSDK头文件的包含路径没有完全配置好IDE的Include路径里缺少MCSDK中间件目录。解决办法是在工程属性里的C/C General→Paths and Symbols选项中手动添加MCSDK的Middlewares目录以及对应芯片型号的HAL驱动目录。第二个错误是链接器报错undefined reference to MCTRL_StartMotor这类函数是电机控制库中的接口函数。出现这个错误的原因是库文件.a文件没有被正确链接。在工程属性的Linker配置中检查Library Search Path是否包含对应库文件的目录同时确认Library Names中填写的库名称没有拼写错误。库文件名在MCSDK不同版本中可能有差异不要想当然。第三个错误跟启动文件有关报的是Reset_Handler重复定义。这个问题常见于工程里同时包含了ST官方的startup_stm32f0xx.s文件和CubeMX自动生成的启动文件两个文件中的向量表重复定义了。解决办法是删除CubeMX生成工程时附带的那份启动文件保留MCSDK工程模板自带的版本。5.3 烧录过程与调试器连接STEVAL-ESC002V1板上预留的SWD接口是4针SWDIO、SWCLK、GND、3V3或者VDDA。我使用ST-Link/V2连接顺序如下ST-Link的SWDIO接板子的SWDIO引脚ST-Link的SWCLK接板子的SWCLK引脚GND接GND必须3.3V参考电压接板子的3V3引脚用于电平转换参考烧录前在Run Configuration中确认调试器类型选择ST-Link接口选择SWD并将时钟频率设置为4MHz即可。如果你使用J-Link需要在Debug Probe中选择SEGGER J-Link然后设置Device为对应的STM32芯片型号。烧录过程中如果出现Cannot connect to target先检查接线再用万用表量一下SWDIO和SWCLK引脚上的电平是否正常可以用示波器看是否有波形不排除调试器固件版本过旧需要升级的情况。5.4 首次上电波形验证烧录完成并复位板子后不要急着接电机。先用示波器测量三个下桥臂MOSFET的栅极驱动信号也就是MCU输出的PWM波形经过栅极驱动器后的信号。正常情况下的PWM频率应该和代码中配置一致占空比在执行方向指令后应该有规律地变化。我之前犯过的错误直接接上电机然后发现电机不转反复检查固件也没找到问题。后来用示波器一测才发现PWM波形根本就没输出。根本原因是我在初始化阶段把PWM输出引脚复用配置错误PA8引脚被配置成了普通GPIO而非TIM1_CH1的复用功能。CubeMX中图形化的引脚配置比较容易发现这类问题但如果你是手动初始化这一步很容易遗漏。5.5 上位机监测与数据验证ST的MCSDK工具包中带有Motor Pilot或者Workbench上位机软件通过串口或USB连接板和PC后可以实时显示电机转速、母线电压、三相电流、功率等参数还可以修改PID参数并立即生效。我在实际调试中就是通过这台软件观测电流波形发现电流环的比例系数设定过大导致电流波形出现明显振荡把Kp从0.003降到0.0015之后波形明显平滑。这种在线调整参数的能力和反复编译烧录的调试节奏相比效率实在高太多了。6. 常见问题排查与经验总结6.1 电机启动失败或起步无力这类问题通常是启动策略不合理导致的。对于无感FOC电机在零速时无法通过反电动势获取转子位置必须采用开环强拉或高频注入法启动。我在这块板子上的经验是启动阶段先用开环方式以固定电流幅值让转子建立旋转磁场然后以匀速或匀加速方式拖动转子转动当转速达到设定阈值通常在500 rpm以上后再平滑切换到闭环控制模式。切换瞬间如果出现电流突变多半是开环角度和实际转子位置偏差过大可以尝试降低切换到闭环时的转速阈值或者减小开环电流幅值。对于六步换相起步无力往往是起始换相时序不对。无刷电机控制器在没有霍尔传感器的情况下普遍采用反电动势过零检测来换相但在零速启动时只能先强制换相让转子转起来后反电动势才能被检测出来。强制换相的时间间隔设置太短会导致失步太长会导致抖动你需要结合电机的极对数、额定转速进行估算这个值通常在几十毫秒到几百毫秒之间。6.2 电机运行中异常噪音与电流尖峰运行噪音大、电流波形毛刺多通常是采样噪声和PWM死区设置不当造成的。先检查PWM死区时间STSPIN32F0A的栅极驱动器虽然支持死区时间的硬件插入但如果你在CubeMX中配置的刹车和死区寄存器不对软件上也需要做相应处理。三相全桥上下管如果没有足够的死区时间会出现直通短路现象轻则异常噪音重则烧毁MOSFET。死区时间一般设置在几百纳秒到几微秒之间和MOSFET的寄生电容以及栅极驱动电阻有关经验值取1微秒左右起步。电流尖峰问题另一个常见来源是电流采样窗口与PWM波形的对齐偏差。可以用示波器同时抓取PWM波形和采样电阻上的电压波形观察ADC采样触发时刻是否落在电流稳定区间内。6.3 保护功能误触发过流保护经常误触发先看电流限值是否设得太低其次看采样滤波是否不足。如果只是瞬间电流尖峰导致误保护可以在软件里增加去毛刺处理例如连续采样3次超过阈值才真正触发保护。或者提升保护触发阈值但前提是散热条件允许不能盲目调高。过温保护误触发的概率相对较低但要注意STSPIN32F0A内部温度传感器的读数可能和实际环境温度有偏差传感器位置靠近发热源读数会偏高。如果你的外壳散热条件很好可以适当把过温保护阈值调高10摄氏度左右但绝对不要取消过温保护。6.4 参数整定心得速查参数整定没有标准答案但我可以给出自己的起始经验值供参考对于电流环Kp从0.001开始Ki从0.01开始逐步增加直到电流波形出现轻微振荡然后回调20%。速度环对参数更敏感Kp从0.0005开始Ki从0.005开始测试时给一个阶跃转速指令观察速度响应曲线调节目标是超调量小于5%调节时间在200ms以内。6.5 调试中的几个小教训第一一定要学会使用SWV和定时器触发的方式测量代码段执行时间比如电流环中断服务函数总耗时。通过GPIO翻转法在中断入口拉高某个空闲引脚在出口拉低用示波器测量高电平持续时间就能精准得到中断执行时间。我当时测出的电流环中断耗时是9微秒而PWM周期是50微秒那CPU负载大约18%余量完全够用。第二修改电机控制参数时尽量在运行时通过调试接口修改而不是每次重新编译烧录。我有一段时间几乎是每调一次参数就编译烧录一次每次烧录不仅耗时而且频繁上下电对板子也是隐形伤害。第三示波器探头的地线夹一定要夹在传感器信号参考地的最近端避免大电流回路上的压降影响测量结果。我曾经因为探头地线夹接得比较远量出尖峰电压达到几十伏后来把地线夹直接夹到采样电阻附近毛刺立刻消掉了一大半。7. 后续扩展方向STEVAL-ESC002V1这套硬件和代码框架可以扩展的方向非常多。把控制算法从方波控制升级为无感FOC是最有挑战也最有实用价值的路线现在有不少开源方案比如AM32和BLHeli_S的固件思路可以参考但基于ST的MCSDK体系去开发会得到更好的底层支持。另一个方向是利用STSPIN32F0A内部集成的运放和比较器把电流环带宽继续推高这需要仔细设计电流采样链路和PCB布局板上预留的过孔和走线布局其实已经为高频采样做了优化。CAN总线通信也是值得投入的方向如果你要做多电机同步控制比如四轴无人机的四路电调协调基于CANopen或者自定义CAN协议的固件扩展会让整个系统稳定性和扩展性大幅提升。我目前就在尝试把官方UART协议改写成CAN协议通信速率和抗干扰能力都远强于串口而且还能通过CAN唤醒和故障上报机制实现更安全的运行管理。最后再分享一个小技巧STEVAL-ESC002V1板子背面的测试点很密集强烈建议在开始调试之前把电源电压、三相相电压、电流采样输出这几个关键测试点用排针引出来后面接示波器或者逻辑分析仪能省掉很多手忙脚乱的麻烦。实测下来这套板子的潜力很大只要你愿意花时间深入折腾固件和算法它完全可以从一个评估板变成一块真正实用的电调核心板。
返回列表