资讯详情

嵌入式开发板CAN通信编程——伺服电机驱动

嵌入式开发板CAN通信编程-伺服电机驱动驱动

在实际的嵌入式项目开发过程中,如果不涉及上位机和开发板的通信传输数据,关键是读取传感器数据并处理传感器数据,驱动硬件设备工作。我之前说过传感器数据的读取内容,主要是TTL、RS232、RS对于485协议的串口编程,我给出了读取光敏电阻传感器状态和倾角传感器实时角度测量信息的例子。还有一个指令驱动硬件工作,硬件设备驱动程序一般由设备制造商完成,集成在设备驱动器上(关于字符设备驱动程序我说不涉及硬件操作驱动程序实现,我将介绍硬件操作驱动程序实现,并给出例子),我们想做的是根据设备驱动通信协议,发布相应的指令,这就牵扯到CAN通信编程。我还是会给大家一个学习交流的例子。

CAN通信协议

首先,有必要介绍一下CAN通信协议

(1)CAN(Controller Area Network)又称局域网控制器,基本用于汽车CAN通信,CAN通信协议稳定准确,传输速率比RS485还高。

(2)多主控制:总线空闲时,所有单元都可以发送消息,但当两个以上单元同时开始发送消息时,总线会根据标识符号ID决定优先级。CAN协议是串行异步通信,同时只能发送或接收信息CAN_High和CAN_Low两条信号线以差异信号的形式通信,这是和谐的RS485是一样的。

(3)CAN通信协议通信速度快,通信距离长,具有错误检测、错误通知和恢复功能。

(4)CAN总线报文结构:CAN数据帧、远程帧、错误帧帧、远程帧、错误帧、过载帧四种不同的帧类型。我们主要介绍从发送器到接收器的数据帧。这种帧大多在总线上传输。数据帧也可以分为标准帧(11) 扩展帧(29) 位符)。数据帧由 7 帧开始、仲裁场、控制场、数据场、CRC 场、应答场、帧结束。其中,数据场的长度为 0~8 个字节。标识符位于仲裁场中,报文接收节点通过标识符进行报文滤波。

(5)Linux系统中CAN总线配置:在Linux系统中,CAN作为网络设备,总线接口设备在控制台下被系统管理,CAN总线配置与以太网配置使用相同的命令。有三个命令:关闭、设置波特率和启动。

ifconfig can0 down ip link set can0 type can bitrate 125000 ifconfig can0 up 我在开发板上设置的命令是: canconfig can0 stop canconfig can0 bitrate 125000 canconfig can0 start 

二、CAN通信编程中的API

由于Linux系统将CAN管理设备作为网络设备,所以在CAN总线应用开发,Linux提供了SocketCAN接口,使得CAN总线通信类似于以太网通信,应用程序开发界面更通用、更灵活。

(1)初始化:

SocketCAN的初始化与socket类似的网络编程主要包括创建SocketCAN套接字,设置CAN界面名称,指定CAN设备、设置CAN通信地址结构体,绑定套接字和地址结构体。具体如下:

int socket_fd; //定义一个socket can通信地址结构 struct sockaddr_can addr; //定义一个ifreq该结构用于配置和获取IP地址,掩码,MTU等接口信息 struct ifreq ifr; //创建socketCAN套接字,设置为原始套接字,原始套接字CAN协议 socket_fd = socket(PF_CAN, SOCK_RAW, CAN_RAW); //设置CAN接口名,对CAN接口进行初始化 strcpy(ifr.ifr_name, "can0"); //指定can0设备 ioctl(socket_fd, SIOCGIFINDEX, &ifr); //设置CAN协议 addr.can_family = AF_CAN; addr.can_ifindex = ifr.ifr_ifindex; //将套接字与can0绑定 bind(socket_fd, (struct sockaddr *)&addr, sizeof(addr)); 

(2)数据发送与接收:

在CAN收发总线通信数据,CAN总线与标准套接字略有不同,比标准套接字更规范,每次通信都采用can_frame结构将数据封装成帧。结构定义如下:

struct can_frame{  canid_t can_id;//can标识符,帧ID  _u8 can_dlc;///数据场长度  _u8 data[8];//数据 }; 

数据发送使用write接收和使用函数和数据read实现函数。具体流程如下:

///存储、发送和接收报纸can_frame结构体 struct can_frame frame[2] = {     
       {0}}; //发送报文的内容 frame[0].can_id =0x141; frame[0].can_dlc = 1; frame[0].data[0] = 0x11; int nbytes = write(socket_fd, &frame[0], sizeof(frame[0])); ///判断是否成功发送 if(nbytes != sizeof(frame[0])){  printf("error\n"); } ///收到报文放在里面frame[1]结构体 nbytes = read(socket_fd, &frame[1], sizeof(frame[1])); 

(3)CAN通信API还包括错误处理和过滤规则设置,这里就不赘述了。

CAN伺服电机通信总线

我用脉塔伺服电机RMD-X,详见其使用说明书。

[外链图片转存失败,源站可能有防盗链机制,建议保存图片并直接上传(img-NXJKURGb-1651991854538)(https://cdn.jsdelivr.net/gh/zhangmeng19960901/blog-img/ECFF5AF1-2A64-451e-9322-FB30E49FC39F.png)]

它的CAN总线参数和单电机命令方法报告格式如下:

DEDA5055-EDE7-4c26-9FAB-4C237D73782C

我现在想要伺服电机运行并工作在速度环,通过使用说明书,我找到了电机运动命令:

电机的运行命令是1帧,所以它can_id也就是说,符号为0x发送启动报文如下:

frame[0].can_id = 0x141; frame[0].can_dlc = 8; frame[0].data[0] = 0x88; frame[0].data[1] = 0x00; frame[0].data[2] = 0x00; frame[0].data[3] = 0x00; frame[0].data[4] = 0x00; frame[0].data[5] = 0x00; frame[0].data[6] = 0x00; frame[0].data[7] = 0x00; 

伺服电机启动后要想在速度环工作,需要发送速度闭环控制指令:

它的单位0.01dps/LSB,我让它在这里运行360dps/LSB在速度上,标识符与上述相同,报文数据为:

frame[0].data[0] = 0xA2; frame[0].data[1] = 0x00; frame[0].data[2] = 0x00; frame[0].data[3] = 0x00; frame[0].data[4] = 0xA0; frame[0].data[5] = 0x8C; frame[0].data[6] = 0x00; frame[0].data[7] = 0x00; 

有了CAN总线通信的API还有伺服电机CAN我们可以开始编写总线参数和报纸。

CAN总线通信编程

事实上,我已经基本上谈到了程序中的所有内容。具体的程序不知道你是否可以通过上述内容完全实现,我相信你可以,这里我只说程序流程,具体的实现留给你,完整的代码我将发布在公共账户,如果没有实现下载看看。

程序流程:初始化CAN通信套接字——>先发送启动报文——>在while闭环控制循环中的发送速度——>接收伺服电机反馈的数据——>关闭CAN通信套接字。

使用的头文件:

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <limits.h> #include <stdint.h> #include <net/if.h> #include <sys/ioctl.h> #include <sys/socket.h> #include <sys/types.h> #include <sys/uio.h> #include <linux/can.h> #iclude <linux/can/raw.h>

在打开开发板时,要先配置CAN通信接口:

canconfig can0 stop
canconfig can0 bitrate 125000
canconfig can0 start

之后就可以将编译好的程序在开发板上运行了:启动——>运动。 到这里伺服电机就按照你想要的速度运行啦!!

完整代码我会贴在公众号中,需要完整代码的关注公众号回复CAN通信编程获取。有什么问题也可以在下方留言,我看到之后会回复你。

我是河边小乌龟爬,学习嵌入式软件开发路上的一名小学生,欢迎大家相互交流哇。公众号:河边小乌龟爬。

(群名称:嵌入式软件开发交流群;群 号:1004953094)

标签: 传感器连接can

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台