STM32F767ZITx控制核心代码
写在motor_control.h的结构体
typedef struct
{
// 定义 发送格式化数据
ControlData_t motor_send_data; //电机控制数据结构体
int hex_len; //发送的16进制命令数组长度, 34
long long send_time; //发送该命令的时间, 微秒(us)
// 待发送的各项数据
unsigned short id; //电机ID,0代表全部电机
unsigned short mode; // 0:空闲, 5:开环转动, 10:闭环FOC控制
//实际给FOC的指令力矩为:
// K_P*delta_Pos + K_W*delta_W + T
float T; //期望关节的输出力矩(电机本身的力矩)(Nm)
float W; //期望关节速度(电机本身的速度)(rad/s)
float Pos; //期望关节位置(rad)
float K_P; //关节刚度系数
float K_W; //关节速度系数
COMData32 Res; // 通讯 保留字节 用于实现别的一些通讯内容
} MOTOR_send;
在main.c里,以全局变量声明电机控制结构体,方便在故障时通过debug查看变量值。
MOTOR_send cmd;
然后在main里面给电机控制结构体进行赋值。
cmd.id=1;
cmd.mode=0;
cmd.T=0;
cmd.W=20;
cmd.Pos=0;
cmd.K_P=0;
cmd.K_W=0.05;
1 Byte = 8 bits,1字节 = 8位
ID那栏4位,假如控制目标电机ID为1,写成4位的二进制数,即0001 。转化为十六进制为1
电机工作模式那栏3位+1位保留位,假设我们设置电机工作为锁定,即 四位二进制 0000 转化为十六进制为0
因此,0001 0000 的十六进制表示为 10 ,刚好1字节
官方使电机以给定角速度转动 FE EE 10 00 00 53 06 00 00 00 00 00 00 40 00 8C 6C
00 00是2字节,即0000 0000 0000 0000,相当于为0,
=
* 256 = 0
所以 = 0
53 06 是2字节,即0101 0011 0000 0110,把十六进制转十进制
合并一下:
21254是
所以 = (21254 * 6.28318)/256 = 521。
RS485
485通信是一种半双工的通信。同一时间只能发送或者接收数据。
一条总线上最多可连接256个485设备。信号速率最高可达10Mbps。传输距离最远能达到1000多米。
485接口包含一对差分信号A和B。差分信号只需要两根信号线。并采用双绞线形式缠绕在一起,这样即使受到干扰,也是两根线同时受到干扰。所以最后的电压差值也基本会保持不变。
对于发送端
发送1时,总线上A的电压大于B的电压,且压差在2V到6V之间。
发送0时,总线上A的电压小于B的电压,且压差在-6V到-2V之间。
对于接收端
当总线上A的电压大于B的电压,且压差大于200mV时,表示接收到逻辑1
当总线上A的电压小于B的电压,且压差小于-200mV时,表示接收到逻辑0