黄工无刷电机学习
直播中

fanB

9年用户 1492经验值
擅长:20615
私信 关注
[问答]

如何处理电机数据为无符号整形的问题?

如何处理电机数据为无符号整形的问题?

回帖(1)

张杰

2021-10-18 11:34:03
  前段时间我使用电机的时候,在电机的数据结构体中都是使用int类型

struct CAN_Motor
{
    int fdbPosition;        //电机的编码器反馈值
    int last_fdbPosition;   //电机上次的编码器反馈值
    int bias_position;      //机器人初始状态电机位置环设定值
    int fdbSpeed;           //电机反馈的转速/rpm
    int round;              //电机转过的圈数
    int real_position;      //过零处理后的电机转子位置
};
电机的通信协议如下:
  [tr]数据域内容[/tr]

DATA[0]转子机械角度高8位
DATA[1]转子机械角度低8位
DATA[2]转子转速高8位
DATA[3]转子转速低8位
DATA[4]实际转矩电流高8位
DATA[5]实际转矩电流低8位
DATA[6]电机温度
DATA[7]Null
我的接收处理是这样的:

motor->position = CanReceiveData[0]<<8|CanReceiveData[1];
motor->speed = CanReceiveData[2]<<8|CanReceiveData[3];
但是这样有个问题,就是当速度为负值的时候,比如现在电机转速是-1,但是我接收到的数据为65535,也就是原本应该是有符号的整形变成了无符号整形,所以我必须加下面的语句手动处理:
  
/* 将电机速度反馈值由无符号整型转变为有符号整型 */
if(motor->fdbSpeed > 32768)
{
        motor->fdbSpeed -= 65536;
}
  这样一来就显得非常麻烦,还好现在我找到了解决办法,就是把结构体里面的int类型改成short类型,就没有这个问题了。

struct CAN_Motor
{
  short position;
  short speed;
};
这是因为short类型默认是由符号的,取值范围为-32768~32767,哪怕输入的确实是65535,它也会在数据类型转换的时候自动转变为-1,省去了我们手动处理的步骤。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分