ARTICLE DETAIL

资讯详情

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

STM32F103与CAN总线实现无刷电机分布式控制方案解析

STM32F103与CAN总线实现无刷电机分布式控制方案解析 简介面向无刷电机开发与嵌入式入门者这份基于STM32F103的CAN通信无刷电机控制工程包完整覆盖从CAN报文帧结构、ID/DLC配置到电机换相控制与状态回传的实践链路。工程采用模块化设计包含电机控制、CAN收发、中断处理等源码文件并附有HAL/LL库下的CAN配置与常见问题笔记适合希望快速上手BLDC与现场总线通信的开发者。包内共202个文件以55个h头文件、54个c源文件为主搭配编译生成的o/d/crf目标文件及uvprojx工程文件、hex烧录文件、map映射文件等便于查看整体构建关系与最终固件。压缩包仅577KB整体轻量适合直接对照学习。已有657人学习下载。通过学习可掌握六步换相或FOC控制思路、PWM占空比调节方法并能基于CAN总线远程设定电机转速、方向及读取状态为后续二次开发提供扎实基础和可复用的代码模板。 搞电机控制这些年最顺手的一套组合还是STM32F103加CAN总线去带无刷电机特别是设备上一排电机需要统一管理的时候这套方案几乎是标准答案。所谓基于32单片机f103的can通信命令控制无刷电机说白了就是三层联动上位机通过CAN总线发出命令帧F103这个节点负责解析并执行最终通过驱动电路让无刷电机按指令转起来。这个项目适合两类人看一是刚接触无刷电机驱动、想搞懂闭环控制的小白二是正在做机器人或自动化设备、需要一个低成本的分布式电机节点的工程师。先说清楚它能解决什么问题。如果用PWM直接驱动电机线多、抗干扰差、扩展性也差用CAN之后两根线就能把所有电机节点串起来每个节点有独立地址控制命令统一走总线后续加电机只是多挂一个节点的事。而且CAN本身是差分传输抗干扰能力强适合工业现场和车载环境。我见过不少项目一开始图省事用串口广播等节点超过四五个、线上干扰一上来就开始后悔了。做这类东西F103不追求极致性能但胜在稳、便宜、资料多作为CAN控制节点再合适不过。1. 整体方案与架构设计为什么选F103加CAN1.1 方案选型的底层逻辑先说MCU的选型逻辑。在无刷电机控制里F103有72MHz主频有2路CAN外设有高级定时器可以产生带死区的互补PWM还有足够多的ADC通道做电流采样。这几样凑齐一个电机控制节点需要的资源基本就全了。和F407比F103的主频确实低一些但无刷电机控制的核心瓶颈通常不是算力而是中断响应和PWM时序的稳定性在这点上F103完全够用。和Arduino比F103的优势是真正的实时控制和硬件CAN外设Arduino要么没有CAN要么得外挂控制器实时性也差一截。成本上一片F103C8T6几块钱做成一个节点非常划算。所以我的结论是入门首选F103不是因为它是性能天花板而是因为它在性能、成本、生态之间找到了最好的平衡点。从通信架构上看这套系统是主从式加广播式的混合结构。正常工作时上位机周期性地向各个节点发送控制帧每个节点通过CAN ID识别属于自己的报文。如果某个节点需要上报状态也可以主动向总线发送状态帧上位机统一接收。关键点在于CAN总线是共享的必须有明确的协议不能想发就发。最简单的做法是给每个节点分配固定ID段控制帧用基地址加节点序号比如0x300到0x3FF状态帧用另一个段。这样从ID就能直接判断报文类型和来源排查问题也方便。1.2 总线架构与控制闭环的划分如果是两个电机节点之间的数据交互也可以做成点对点但大多数场景还是统一汇到上位机由上位机做决策。这样做的好处是逻辑清晰后期加新节点也不需要改其他节点的代码。闭环控制的划分也很重要。我通常是让CAN只承担上层指令和状态上报底层的位置环、速度环、电流环全部由F103本地完成。这样即使总线出现瞬时故障电机也不会乱跑因为它依赖的是本地闭环不是每拍都等总线的数据。这个设计理念越到后期越能体现价值特别是节点多了之后总线负载升高不能祈祷每一帧都能准时到达。2. 硬件准备与关键电路设计细节2.1 核心器件清单与电机选型要点这里给一份我实测过比较稳的清单照着买基本不会踩大坑器件型号/规格说明MCUSTM32F103C8T6最小系统板即可注意晶振和BOOT配置CAN收发器TJA1050 / SN65HVD230更推荐3.3V供电的SN65HVD230电机驱动DRV8301 / EG2134 / 分立MOS方案根据电机功率和母线电压选无刷电机带霍尔传感器的BLDC如2204或4010新手先选带霍尔的机型电流采样毫欧采样电阻运放如INA240采样电阻建议10mΩ到50mΩ这里重点说一下电机选型。热词里经常有人搜4010无刷电机这类电机是航模上常见的盘式电机体积小、力矩密度高很适合做云台或小型关节但它的额定电流通常比较大对驱动和采样的要求就高。选电机时不要只看外形和KV值一定要看额定电流和相电阻。相电阻决定了采样电阻的选型范围额定电流决定了MOS管的电流裕量这两项不匹配后面调电流环会非常难受。2.2 驱动电路与电流采样开尔文接法不能省驱动电路这部分最核心的是三个下桥的电流采样。我推荐低端采样就是三个下桥MOS的源极各接一个采样电阻电阻另一端统一接功率地电压信号经过运放放大后送进F103的ADC。低端采样的优点是共模电压低运放好选PCB布线也容易缺点是采不到上桥导通时的电流所以电流环的采样点要避开PWM开关瞬间放在下桥稳定导通的中段。这里有一个特别重要的工程细节采样电阻必须用开尔文接法。也就是说采样线要从电阻两端的焊盘单独引出不要跟功率电流的走线混在一起。我见过很多人画的板子功率电流从采样电阻上走过结果采样线上叠了一堆压降ADC采出来的电流里带满了开关噪声电流环根本调不稳。这个问题的排查很费时间不如一开始布线时就按开尔文接法处理。换相检测这块新手强烈建议用带霍尔的电机。霍尔传感器三根信号线直接接F103的输入捕获引脚每次电平变化都触发一次换相。无感方案靠反电动势过零检测省了传感器但启动时要先强制换相低速时反电动势太小很难检测调试难度大不少。先把带霍尔的方案跑通之后再升级到无感是比较理性的路线。如果以后接触单相无刷电机原理其实类似换相逻辑更简单只是转矩脉动会大很多。2.3 CAN收发器与终端电阻的接线细节CAN收发器把F103的CAN控制器信号转成差分信号。选型上TJA1050和SN65HVD230都能用但要注意电压匹配。F103的IO是3.3VTJA1050是5V供电的它的输入阈值通常兼容3.3V电平但输出高电平在3.3V系统上处于临界状态。SN65HVD230可以3.3V供电逻辑电平直接匹配省事很多。如果是自己做的板子建议直接用SN65HVD230或类似3.3V收发器。终端电阻是最容易被忽略的。CAN总线要求在物理最远的两端各接一个120Ω电阻用来吸收信号反射。两个节点调试时只要在总线的两个端点各放一个120Ω电阻就行多个节点时中间节点千万不要再接终端电阻否则总线上等效阻抗变小信号反射反而更严重。判断终端电阻是否正确的快捷方法是断电后用万用表量CAN_H和CAN_L之间如果两端各有一个120Ω电阻测出来应该是60Ω左右如果量出来只有一端有120Ω信号波形就容易出现过冲和振铃。3. CAN通信配置与报文协议详解3.1 F103 CAN外设初始化波特率与采样点怎么定CubeMX配置CAN时主要关心波特率和采样点。F103的CAN挂载在APB1上APB1时钟是36MHz。波特率计算公式是波特率 APB1时钟 / 预分频 / (1 BS1 BS2)以500kbps为例配置预分频6BS18BS22SJW1代入公式就是36MHz / 6 / (182) 500kHz。这里的采样点位置是(1BS1)/(1BS1BS2) 9/11 ≈ 81.8%处于比较合理的区间。如果总线上所有节点都按相同参数配置通信会比较稳定。HAL库里的初始化代码大致是这样hcan1.Instance CAN1; hcan1.Init.Prescaler 6; hcan1.Init.Mode CAN_MODE_NORMAL; hcan1.Init.SyncJumpWidth CAN_SJW_1TQ; hcan1.Init.TimeSeg1 CAN_BS1_8TQ; hcan1.Init.TimeSeg2 CAN_BS2_2TQ; hcan1.Init.AutoBusOff ENABLE; hcan1.Init.AutoWakeUp DISABLE; hcan1.Init.AutoRetransmission ENABLE; hcan1.Init.ReceiveFifoLocked DISABLE; hcan1.Init.TransmitFifoPriority DISABLE;这里要注意AutoRetransmission在电机控制场景建议打开也就是帧发送失败后硬件自动重发这样能保证控制帧尽可能不被丢掉。但同时要注意如果总线上有严重错误硬件会一直重发可能影响下一个命令的及时性所以错误处理里要加上总线关闭恢复机制。3.2 滤波器与掩码ACCCODE和ACCMASK这样理解很多人刚开始搞不清滤波器的机制这里用一个比喻解释。标识符寄存器相当于一把钥匙的齿形掩码寄存器相当于一个模板。掩码的某一位是1时要求报文的那一位必须和标识符一致掩码的某一位是0时这一位不检查任何值都放行。假如只要接收ID0x301的报文标识符寄存器填0x301掩码寄存器填0x7FF表示全部匹配。如果还要接收ID0x302把掩码最低位改成不关心即可。对于标准帧CubeMX生成的代码会直接让人填ID和Mask实际寄存器值的移位逻辑已经被封装了所以初学者可以先按ID填要匹配的值Mask填1表示必须匹配、0表示任意来理解。建议先把滤波器配置成接收所有帧用CAN分析仪或者串口打印验证ID和实际报文确认无误后再收紧滤波器这样可以有效避免把ID填错导致收不到数据的坑。3.3 应用层协议一套简单可扩展的帧格式CAN硬件层只管传帧应用层协议得自己定。我推荐一个容易扩展的格式标准帧ID用0x300加节点号比如1号电机是0x3012号电机是0x302。数据域8个字节定义如下字节含义说明Byte0控制字bit0使能bit1方向bit2急停Byte1命令类型0x01速度控制0x03位置控制0x05状态回读Byte2-3目标值有符号16位单位由上位机约定Byte4-5加速度/力矩上限用来做梯形速度规划或扭矩限制Byte6-7校验字节简单字节累加或CRC8需要特别提醒的是使能和急停这种实时性要求极高的命令建议用独立ID或者独立数据帧不要和速度指令混在一帧里。我在实际项目里犯过这个错误把急停作为Byte0的一个bit和速度指令一起发结果总线负载高的时候急停命令跟着速度帧排队延迟了几个毫秒设备差点撞机。从那以后急停指令一律单独一个ID并且用最高优先级发送。4. 无刷电机控制核心逻辑与调试顺序4.1 六步换相与PWM输出霍尔信号怎么用BLDC电机控制的核心是六步换相。它的原理是电机三个相绕组任意时刻两相通电、一相悬空每隔60度电角度切换一次通电组合一共六个状态转一圈正好走完。霍尔传感器可以直接给出转子位置每变化一次就推进一个换相状态。F103里负责PWM输出的是高级定时器TIM1或TIM8它们能输出三对互补PWM并带死区控制。重点是换相中断要和PWM同步。霍尔信号接到定时器的输入捕获通道上每次霍尔变化触发中断在中断里根据当前霍尔状态查表切换PWM的输出组合。这样换相时刻和PWM载波是对齐的电流波形更干净。死区时间的设置也不能忽略。上下桥的PWM互补输出之间必须有一个很小的间隔防止上下桥同时导通导致直通短路。这个间隔一般取0.5us到2us具体要看MOS管的关断延迟。死区太小有直通风险太大又增加损耗和畸变最好根据自己的驱动芯片手册来定。4.2 三环PID的调节顺序与中断优先级控制结构采用电流环、速度环、位置环三环。调试的顺序必须是先电流环再速度环最后位置环。电流环是最内层采样频率最高我一般在PWM周期中断里跑10kHz左右。速度环1kHz左右就够了可以在定时器中断里触发。位置环几百赫兹即可。关键点是中断优先级的分配。CAN接收中断负责收报文它的优先级千万不能高于电流环。否则每来一帧CAN报文都会打断电流环的计算造成电流波形毛刺电流环噪声会直接传到速度环和位置环整个系统都会抖。我见过一个案例现象是电机低速转动时噪音大、电流波形乱查来查去最后发现是CAN中断优先级设得比电流环还高接收一帧报文的时间虽然只有几十微秒但架不住报文频率高电流环被频繁打断最终表现就是电流环带宽严重下降。5. 联调实录从CAN波形到电机正常运转5.1 波形判断通信质量示波器这样看联调第一步不是给电机上电而是先看CAN波形。把示波器两个通道分别接CAN_H和CAN_L用数学通道做差值就能看到完整的差分信号。正常波形应该满足显性CAN_H在2.75V到3.5VCAN_L在1.5V到2.25V隐性CAN_H和CAN_L都稳定在2.5V附近差分信号边沿陡峭没有明显台阶和振铃如果波形边沿很慢、呈三角形大概率是总线缺少终端电阻或者收发器驱动能力不足。如果出现台阶可能是总线上节点过多或者用了过长的线缆引入了分布电容。回环测试能过但标准模式发不出去问题通常出在收发器方向因为标准模式需要总线上有别的节点回应ACK位如果只有自己一个节点在发它收不到ACK就会一直重发看起来就是“发不出去”。5.2 节点间通信失败的排查顺序一旦出现通信问题我习惯按下面的顺序排查用示波器看F103的TXD引脚确认MCU确实在发送看收发器的RXD引脚确认总线上有数据进来量CAN_H和CAN_L静态电压隐性应在2.5V附近如果一边被拉低或拉高说明收发器有问题断电量终端电阻两个端点各120Ω整体测量约60Ω核对波特率参数重点看采样点两个节点如果采样点偏差太大丢帧率会明显上升检查滤波器配置用接收全部帧的方式先排除过滤问题最后用CAN分析仪抓总线报文确认ID和数据是不是预期值这套流程我用了很多年几乎覆盖了所有我能遇到的CAN通信问题。很多看似玄学的问题最后都落在终端电阻和波特率采样点上。5.3 最小可运行流程从CAN命令到电机转动整个系统跑通的流程大概是这样的F103上电初始化时钟、GPIO、CAN、定时器、ADC电机处于待机状态上位机发送0x301帧Byte00x01使能Byte10x01速度模式Byte2-3为目标转速F103在CAN接收中断里把数据缓存到全局变量置标志位主循环或控制中断检测到标志位更新速度环目标值速度环输出电流环目标电流环输出PWM占空比驱动电机旋转霍尔信号每变化一次触发换相同时把最新转速更新到速度环反馈上位机定时发送0x05状态回读命令F103返回当前转速、电流、温度这样一步步下来从CAN帧进来到电机转起来逻辑就串起来了。如果电机能转但速度不准或者电流波形不干净再回到前面的环调节和采样布局上做优化。6. 踩坑速查与实战经验6.1 常见问题速查表现象可能原因排查方向电机抖动、噪音大电流环带宽不足或采样点受PWM噪声干扰检查采样时刻提高环路频率优化PCB布局速度响应慢速度环周期太长或CAN报文频率太低缩短速度环周期提高命令发送频率回环能过但组网后丢帧滤波器配置错误或波特率采样点不一致检查掩码统一采样点参数电机发热快换相时序不对或死区时间不当校准霍尔换相表调整死区CAN标准模式发不出帧缺少其他节点ACK或收发器未正常工作检查收发器电路、终端电阻、总线负载6.2 实战经验与心得第一CAN接收中断里不要做复杂解析只做缓存和置标志解析放在主循环或者低优先级任务里。这样可以防止CAN错误重传导致的中断风暴直接影响电机控制。第二电流采样时刻要避开PWM边沿。如果采样时刻正好落在开关切换瞬间采到的电流会叠加大量尖峰。解决办法是用定时器触发ADC把采样点放在PWM周期的中间位置这时候下桥稳定导通采样值最准。第三做多节点系统时给每个节点保留一个调试帧ID比如0x3F0。平时可以用CAN分析仪直接读取节点的内部状态比如目标速度、实际转速、总线错误计数。这个习惯能帮你把调试时间缩短一大半尤其在现场出问题时。第四总线上如果有多家公司的工具或上位机软件波特率采样点可能各不相同。尽量把你的节点配置为兼容性更好的采样点比如80%到85%之间这样混合组网的误码率更低。这套方案我前后用了好几年也改过好几版。如果问我在这个项目里学到的最重要的东西是什么我会说波形是检验一切的基础CAN波形干净了通信问题就少了一半电流波形干净了控制问题就少了一半。剩下的就是耐心调参了。本文还有配套的精品资源点击获取
返回列表