can通信协议-->电机驱动器篇

can通信协议-->电机驱动器篇 易百纳用户53690 2023-11-23 15:12:06 912

文章目录

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个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
易百纳用户53690
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区