技术专栏
can通信协议-->电机驱动器篇
文章目录
1 can通信协议简介
前言:由于板端上有引出的can总线引脚,因此想要移植一些can接口的小玩意,手上正好有一个欧艾迪电机驱动器,便花了时间了解怎么在linux环境下编写代码来驱动电机,代码在文章最后可自取
首先,查看该电机驱动器的手册得知相关的指令帧构成
我使用的can id 为18
因此我想要设置目标转速为4000erpm的话,我发送的can数据帧组成应该为 18 02 00 00 0f a0
那先用can tools进行测试一下
在终端输入 cansend -i 18 can0 0x02 0x00 0x00 0x0f 0xa0命令
电机无反应
使用逻辑分析仪抓取一下信号,无任何信号产生,这时我们就需要排查硬件接线,管脚复用等可能出现的问题。
最后问题定位到管脚复用上,通过bspmm修改管脚复用为can_l 和can_h,最后能够正确抓取波形,电机也能够驱动起来
2 can通信代码编写
下图是示例can通信代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/can.h>
#include <linux/can/raw.h>
int main(void) {
int s;
struct sockaddr_can addr;
struct can_frame frame;
struct ifreq ifr;
// 创建套接字
if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) {
perror("Error while opening socket");
return -1;
}
// 设置CAN接口名称
strcpy(ifr.ifr_name, "can0");
ioctl(s, SIOCGIFINDEX, &ifr);
// 绑定套接字到CAN接口
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("Error in socket bind");
return -2;
}
// 准备CAN帧
frame.can_id = 0x123; // 11-bit identifier
frame.can_dlc = 2; // Data length code
frame.data[0] = 0xAA;
frame.data[1] = 0xBB;
// 发送CAN帧
if (write(s, &frame, sizeof(struct can_frame)) != sizeof(struct can_frame)) {
perror("Error in socket write");
return -3;
}
// 接收CAN帧
if (read(s, &frame, sizeof(struct can_frame)) != sizeof(struct can_frame)) {
perror("Error in socket read");
return -4;
}
// 处理接收到的CAN帧
printf("Received CAN frame: ID=0x%X, DLC=%d, Data=", frame.can_id, frame.can_dlc);
for (int i = 0; i < frame.can_dlc; ++i) {
printf("%02X ", frame.data[i]);
}
printf("\n");
// 关闭套接字
close(s);
return 0;
}
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包
点赞
收藏
评论
打赏
- 分享
- 举报
评论
0个
手气红包
暂无数据
相关专栏
-
浏览量:6028次2021-08-10 14:13:11
-
浏览量:4751次2021-08-10 14:24:09
-
浏览量:635次2023-08-24 11:41:45
-
浏览量:528次2023-11-01 17:33:57
-
浏览量:5485次2020-11-30 10:01:37
-
浏览量:5059次2021-08-09 15:36:00
-
浏览量:571次2023-08-24 16:04:19
-
浏览量:3961次2020-12-07 14:15:12
-
浏览量:7452次2020-12-08 09:48:56
-
浏览量:2475次2020-08-21 14:05:19
-
浏览量:933次2023-03-24 10:57:56
-
浏览量:3003次2019-10-16 14:42:48
-
浏览量:1506次2024-01-10 10:01:45
-
浏览量:2628次2017-12-13 10:09:35
-
2021-05-18 14:53:37
-
浏览量:1788次2019-06-27 15:56:35
-
2021-03-25 11:48:44
-
2022-10-21 14:52:47
-
浏览量:3475次2020-10-30 09:23:01
置顶时间设置
结束时间
删除原因
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
打赏作者
易百纳用户53690
您的支持将鼓励我继续创作!
打赏金额:
¥1
¥5
¥10
¥50
¥100
支付方式:
微信支付
打赏成功!
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
审核成功
发布时间设置
发布时间:
请选择发布时间设置
是否关联周任务-专栏模块
审核失败
失败原因
请选择失败原因
备注
请输入备注