本篇文章致力于对STC-FOC Lite的内部变量进行详细的解释,并且提出修改为串口控制/PPM控制的建议,方便大家对这个项目进行更加适配自己的个性化更改。 虽然FOC电机多使用CAN来进行通讯,但是也有很多想要使用串口通讯控制电机(方便跨平台,其他平台的芯片对CAN支持不充分的情况,调试CAN通讯可能比较困难)。亦或者是想要使用STC-FOC Lite的舵机功能,但是又不想更改原本的控制电路,想要使用PPM信号进行控制(平替舵机使用)。 这里需要注意的对硬件的修改是,更改为串口控制可以不用改动硬件电路,但是更改为PPM控制是需要对硬件电路做一定更改的,因为默认引出的引脚中并没有可以读取PWM占空比功能的。 首先是更改为串口控制,这里使用单向串口控制,通过下载器的串口进行复用控制即可。即只需要GND和FOC端的RXD接收两根线。只要做到数据校验,单向控制也没有什么问题。唯一的问题就是串口的控制距离比较有限,通讯线超过20cm可能就会存在概率性的校验不通过,进而造成丢包了。 在了解了串口通讯的特点后,下面介绍一下系统中的各种变量含义,方便进行更改的时候适配。 u8 Mode 首先是全局模式变量,指定某个类型后将立刻切换,不过模式切换时,需要考虑速度模式和位置模式中的全局累计位置清空问题。这部分可以参考can.c文件中,Can_Dat_Decoding()函数中对于模式的处理。 // 以下是模式定义 #defineSpeed_Mode 1 // 速度模式 #definePostion_Mode 2 // 位置模式 #defineOpenLoop_Mode 3 // 开环模式 #defineSet_ID_Mode 4 // 设置ID模式(三档开关) #defineServo_Mode 5 // 舵机模式 Moto_Configmoto; // 电机参数设置 这个moto也是全局电机参数变量,是一个结构体,里面的详细定义如下: // 电机参数全局变量 typedef structMoto_Config { float set_uq; // 设定的uq值 float uq; // 暂时没有用到过 u16 angle_dat; // 磁编码器原始数据 int set_speed; // 设定的速度 int speed; // 当前实际速度,速度环中更新 long set_postion; // 设定的位置 long postion; // 当前实际位置,位置环中更新 } Moto_Config; 例如说,设定为速度模式的时候,串口接收到的数据直接赋值给moto.set_speed即可完成速度控制。 如果是设定为舵机模式,则需要判断是否第一进入舵机模式(或者判断有没有执行过自动边界搜索),没有的话,则需要通过以下的语句执行舵机模式的自动边界搜索。 moto.set_postion= _angle_this_dat; _postion_add_dat= 0; // 进入舵机模式清空累计位置 Servo_Config_Flag= 1; // 启动一次自动位置识别 其中,_angle_this_dat是当前的单圈绝对编码器原始数据,是没有经过电角度变化的,范围是0·~16383。 执行完舵机边界搜索后,可以通过以下代码进行数据控制
- if (控制值< 1000 && 控制值> -1000 &&
- (Servo_Max_Pos != Servo_Min_Pos) && Servo_Config_Flag == 0)
- // 范围限定
- {
- moto.set_postion = (long)(Servo_Min_Pos + ((float)(Servo_Max_Pos - Servo_Min_Pos) / 2000.0)*(float)(Can_Value + 1000));
- }
复制代码
首先是判断控制值是否超出范围,然后是判断边界辨识结果是否正常,最后是判断舵机的配置标志位(正在搜索标志)是否为0(为0代表没有在搜索)。 最后是对于串口通讯中的一些简单抗干扰协议:
如果是改作PPM控制,则可以通过空闲的PWMB对外部脉冲的高电平进行计数,将读取出来的控制数据,直接像上面舵机控制那样赋值给moto.set_postion即可完成控制,默认0是中间位置,左右边界分别为±1000;
|