本帖最后由 王昱顺 于 2024-10-31 13:45 编辑
本篇文章致力于对STC-FOC Lite的原版代码进行详尽的原理解释,并且提出更改/移植/裁剪建议,方便大家对这个项目进行更加适配自己的个性化更改。 CAN通讯因其高可靠性、实时性、灵活性、错误检测能力、抗干扰性、易于扩展、成本效益和广泛的应用领域,成为电机驱动控制等领域的首选协议。它采用非破坏性仲裁技术,支持多主通讯和优先级控制,支持多种数据传送方式,并具备循环冗余检查、帧检查、位填充等错误检测手段。此外,CAN协议在恶劣电磁环境中仍能保持稳定通讯,并且易于网络节点的增加和删除,硬件实现成本低,因此在汽车、工业自动化、医疗设备等多个领域得到广泛应用。 所以,STC-FOC Lite也使用了CAN通讯,保证其易于接入和移除电机,方便使用统一的总线进行链接(只需要CANH和CANL两根线)。 这里首先从代码开始,对CAN实现的协议进行解释
速度模式(Speed_Mode): 系统首先检查接收到的CAN总线数据值(Can_Value)是否在预设的速度限位范围内(-5000至5000)。 如果当前模式与上一次记录的模式不同,则将电机的目标位置设置为当前角度(_angle_this_dat),并重置位置累加器(_postion_add_dat)为0,以确保进入速度模式时不会有位置累积误差。 随后,系统将Can_Value转换为整数并设置为电机的速度。 位置模式(Postion_Mode): 在此模式下,系统检查Can_Value是否在100圈的增量模式范围内(-1638400至1638400)。 如果条件满足,则将Can_Value累加到电机的目标位置上,实现位置的增量调整。 设置ID模式(Set_ID_Mode): 此模式下代码不执行任何操作,用于未来功能的扩展或特定的配置任务。 设置ID的功能在config.h文件中,定义为#define User_Can_ID ,修改这个值,可以完成电机本身ID的修改,在控制端就可以通过直接给这个ID发指令控制电机了。 舵机模式(Servo_Mode): 系统首先检查是否为首次进入舵机模式。如果是,则将电机的目标位置设置为当前角度,并重置位置累加器为0,同时启动一次自动位置识别(Servo_Config_Flag = 1)。 接着,系统检查Can_Value是否在限定范围内(-1000至1000),并且舵机的最大位置(Servo_Max_Pos)和最小位置(Servo_Min_Pos)不相等,且自动位置识别标志(Servo_Config_Flag)为0。 如果条件满足,则根据Can_Value计算电机的目标位置,该位置位于Servo_Min_Pos和Servo_Max_Pos中间,默认为两限位中心。 模式更新: 在所有模式处理完毕后,系统更新并保存当前模式(Last_Mode),以便在下一次循环中使用。这个主要是用来给进入某种模式的时候,选择性清空一些记忆值,防止出现电机抽搐。 系统通过同步字节实现多电机同步执行的效果,通过首先判断同步字节是否进行同步。来完成电机同步执行指令的操作。 具体的流程是:接收到需要同步的标志位,就将本次的设定值进行缓存,不执行。 如此循环好几个电机,分别进行写入。 写入完成后,通过对ID0发送同步数据,即可让所有电机同步将缓存区指令进行执行(其实所有ID都是广播,不过每个电机在设定本身ID后,通过CAN滤波器进行过滤,使得只能接收到ID0和自己ID的数据)。 |