找回密码
 立即注册
查看: 450|回复: 1

STC-FOC Lite程序详解-如何快速更改为串口控制

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2218

回帖

5450

积分

版主

积分
5450
发表于 2024-10-31 13:47:19 | 显示全部楼层 |阅读模式
      本篇文章致力于对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。
      执行完舵机边界搜索后,可以通过以下代码进行数据控制
  1. if (控制值< 1000 && 控制值> -1000 &&
  2. (Servo_Max_Pos != Servo_Min_Pos) && Servo_Config_Flag == 0)
  3. // 范围限定
  4. {
  5. moto.set_postion = (long)(Servo_Min_Pos + ((float)(Servo_Max_Pos - Servo_Min_Pos) / 2000.0)*(float)(Can_Value + 1000));
  6. }
复制代码

      首先是判断控制值是否超出范围,然后是判断边界辨识结果是否正常,最后是判断舵机的配置标志位(正在搜索标志)是否为0(为0代表没有在搜索)。
最后是对于串口通讯中的一些简单抗干扰协议:

      如果是改作PPM控制,则可以通过空闲的PWMB对外部脉冲的高电平进行计数,将读取出来的控制数据,直接像上面舵机控制那样赋值给moto.set_postion即可完成控制,默认0是中间位置,左右边界分别为±1000;


回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:74
  • 最近打卡:2025-04-29 13:02:20
已绑定手机

0

主题

130

回帖

174

积分

注册会员

积分
174
发表于 2025-4-14 13:03:49 | 显示全部楼层
王神开发一下AI8051
造就完了
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 17:05 , Processed in 0.102854 second(s), 53 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表