大疆M3508、M2006必备CAN总线知识与配置方法

大疆M3508、M2006必备CAN总线知识与配置方法


电机

前言:

两个月前的一篇文章:PID与三环控制发布以后,有不少朋友在微信上交流大疆M3508、M2006的使用问题,其中有一个方面值得单独拿出来聊一聊:CAN通信

对于很多朋友,包括我自己,使用大疆的M3508、M2006无刷直流电机和C610、C620电调是第一次接触到CAN通信。大疆的这几款产品原本设计的非常容易上手,应该几天就能熟练使用。但是由于C610、C620电调选用了CAN总线通信,给不少人带来了困扰。然而使用这几个电机***并不需要把CAN通信了解的有多么深***。

困扰往往来自:

  • CAN总线之前用的比较少
  • 现有CAN通信资料少而且复杂

这篇文章旨在快速扫盲,给出使用M3508、M2006电机的必备CAN通信知识,希望能降低使用门槛,给各位朋友节约时间。内容均使用M3508与M2006实测过,演示视频在文章末尾。

本文仅涉及必备知识,甚至尽量避开复杂的通信原理,力求浅显易懂。

其他电机相关文章:
PID与三环控制-以M3508为例
大疆M3508、M2006必备CAN总线知识与配置方法

M3508电机控制程序的F1移植过程
ESP32:蓝牙BLE控制M3508


0x00 需要 额外的 CAN收发器!!!

这件事要放到前面去说,因为已经有几位朋友的经历指出了其必要性。

如果我们有一块STM32开发板,也有电调电机和电源。那么我们的STM32引脚与电调的CAN_H和CAN_L之间是不能直接相连的。

需要购买如下图所示的CAN收发器,作为两者连接的桥梁。一般我用的是TJA1050芯片的模块。
CAN收发器

CAN收发器是使用电机的必备硬件条件,一定要先确定自己有这个东西。至于原因,咱们接下来说明。

0x01 硬件层面分析

为什么需要CAN收发器

通过分析硬件层面我们能知道为什么需要额外的CAN收发器。请看下图:

硬件结构

从图中我们能看出,STM32拥有的外设叫做:CAN控制器,它负责CAN通信的筛选、优先级、仲裁等问题。相当于咱们的邮局,帮忙盖个邮戳,分分类。通过复用GPIO以后,它延伸出两个引脚:CAN_RXCAN_TX,类比串口我们知道一个负责收一个负责发。

实际上,这两个引脚上传输的数据已经是CAN报文了,该有的格式它都有,STM32的CAN回环模式就相当于直接把CAN_RXCAN_TX相连,就可以收到自己发的消息。

问题是,CAN在设计的时候为了消除共模干扰,特地选用了差分信号(也叫差模信号)传输。咱们的C610、C620电调,接收发送的就是差分信号。这才是CAN收发器的作用:

把来自STM32的信号转换成差分信号让电调听得懂,把来自电调的差分信号转换成STM32听得懂的信号。


请注意:

连接CAN_RXCAN_TX引脚与CAN收发器的引脚时,并不需要像串口一样交叉。直接将RX连接到标有RX的引脚,TX类似。


120Ω的终端电阻呢?

不知道朋友们有没有注意到C610、C620电调上都有一个开关,C620的在侧面,旁边写着CAN RESISTOR,这也是CAN总线的设计要求。

根据咱们学的《电路理论》这门课,当信号波长小于电路尺寸的时候,我们就不能把电路当成集中电路来分析。对于can总线是一样的,由于电调采用1MHz的通信频率,为了防止一些不必要的干扰,我们需要在CAN总线的两端分别用120Ω电阻跨接起来。比如之前图中的两端可以认为是咱们的CAN收发器是一端,下面的电调是另一端。

对于只有一个电调的情况下,可以打开电调上的电阻,然后直接和CAN收发器连接,这样虽然少了一端的终端电阻,但实际上可以运行。如果同时控制两个及以上的电调,那就可以打开其中两个的终端电阻,构成总线的两端。当然也可以手动组成如下图的总线结构并且关闭电调上的终端电阻,图中还加入了电容进行滤波。

CAN总线图

0x02 软件配置简析

其实,看完硬件部分就已经可以正常使用电调电机了,因为大疆官方例程中已经把CAN通信配置好了,直接可以使用。

但是如果涉及非常多的设备同时控制,比如超过四个电机的情况下,或者还有其他的外设要通过CAN总线相连,简单了解软件配置也是很有好处。

而且,我发现很多朋友是在做RoboMaster比赛,全面的了解软硬件还是十分必要的,如果出现问题也有利于排查,不至于浪费大量时间。

接下来我们还是使用咱们的老朋友:大疆官方M2006例程M3508例程来作为样本。主要探究以下问题:

  • 通信频率如何设定为1MHz
  • CAN过滤器的配置
  • 报文的接收与发送

两个文件:bsp_can.ccan.c

如何把通信频率设定为1MHz?

以下是文件can.c中截取的代码(有删改):

CAN_HandleTypeDef hcan1;

/* CAN1 init function */
void MX_CAN1_Init(void)
{

  hcan1.Instance = CAN1;
  hcan1.Init.Prescaler = 3;//分频系数设置为3
  hcan1.Init.Mode = CAN_MODE_NORMAL;
  hcan1.Init.SJW = CAN_SJW_1TQ;
    
 // =================请看这里👇
  hcan1.Init.BS1 = CAN_BS1_9TQ;
  hcan1.Init.BS2 = CAN_BS2_4TQ;
 // =====================这里👆
    
//省略一些。。。。。
HAL_CAN_Init(&hcan1);


}

注意,大疆的例程是为大疆的开发板所编写,其主控芯片是STM32F429,在这里F4与F1的时钟频率差别会影响到配置的具体参数。

咱们重点来看分频系数的确定以及标出的两行。

STM32F4一般来说主频率会配置到168MHz,经过4分频之后得到了42MHz的APB1时钟,CAN控制器正是从APB1上获取时钟。代码中hcan1.Init.Prescaler = 3;正是将42MHz的时钟进行3分频,得到了14MHz的时钟。这就是真正被使用的频率。接着我们看传输一个bit需要哪几部分:

一位的时间组成

所以,传输一位的时间可以看作T=(1+BS1+BS2)*tq,tq(time quantum)。所以在例程里就是1+9+4=14个tq。而tq刚好是CAN时钟频率14MHz的倒数,tq=(1/14MHz),T=14*tq,得T=(1/1MHz),同样f=1/T=1MHz。由此获得了我们需要的频率。

同理,如果是F1,APB1时钟一般是36MHz,那么我们设置分频系数为4,BS1=5,BS2=3,也能得到1MHz。

CAN过滤器配置

其实一般来说并不需要注意CAN过滤器得配置,因为官方例程也没怎么配置,大可直接套用。

过滤器是针对接收信息进行筛选得部件,因为CAN总线上得消息往往比较复杂,通过过滤器可以选出想要接受的消息。大致过程是过滤器会对所有收到的报文按照咱们设定的规则进行筛选,如果符合要求就会放入FIFO缓冲区保存下来。而这个规则就是报文的id信息。为了实现复杂的id筛选,引入了id寄存器和id掩码寄存器,其配合过程非常的。。精彩👍。有兴趣可以了解一下。

下面得代码摘自文件bsp_can.c(有删改):

void my_can_filter_init_recv_all(CAN_HandleTypeDef* _hcan)
{

	CAN_FilterConfTypeDef		CAN_FilterConfigStructure;
	static CanTxMsgTypeDef		Tx1Message;
	static CanRxMsgTypeDef 		Rx1Message;


	CAN_FilterConfigStructure.FilterNumber = 0;
	CAN_FilterConfigStructure.FilterMode = CAN_FILTERMODE_IDMASK;
	CAN_FilterConfigStructure.FilterScale = CAN_FILTERSCALE_32BIT;
	CAN_FilterConfigStructure.FilterIdHigh = 0x0000;
	CAN_FilterConfigStructure.FilterIdLow = 0x0000;
	CAN_FilterConfigStructure.FilterMaskIdHigh = 0x0000;
	CAN_FilterConfigStructure.FilterMaskIdLow = 0x0000;
	CAN_FilterConfigStructure.FilterFIFOAssignment = CAN_FilterFIFO0;
	CAN_FilterConfigStructure.BankNumber = 14;
	CAN_FilterConfigStructure.FilterActivation = ENABLE;

HAL_CAN_ConfigFilter(_hcan, &CAN_FilterConfigStructure) ;


}

这里我们发现不论是id还是掩码都是0,也就是接收总线上的所有报文。那么在多电机的情况下如何区分消息的发出者呢?

消息的接收与发送

我们先看看接收,以下选自bsp_can.c(有删改):

void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* _hcan)
{

	switch(_hcan->pRxMsg->StdId){
		case CAN_2006Moto1_ID://0x201
		case CAN_2006Moto2_ID://0x202
		case CAN_2006Moto3_ID://0x203
		case CAN_2006Moto4_ID://0x204
			{
				static u8 i;
				i = _hcan->pRxMsg->StdId - CAN_2006Moto1_ID;
				
				get_moto_measure(&moto_chassis[i], _hcan);
			}
			break;	
	}

这是CAN的接收中断回调函数,在来到这个函数之前,获得的报文已经被储存在pRxMsg指向的结构体当中。switch语句通过判别StdId来确定是不是电机发来的报文,并且判断是哪个电机。而这个StdId咱们并不陌生,它是前面所说的FilterId的一部分。

官方手册中提到在同一个CAN总线上,最多可以接入8个电调,通过电调的自动分配他们分别是地址0x201~0x208。


再看发送:

void set_moto_current(CAN_HandleTypeDef* hcan, s16 iq1, s16 iq2, s16 iq3, s16 iq4){

	hcan->pTxMsg->StdId = 0x200;
	hcan->pTxMsg->IDE = CAN_ID_STD;
	hcan->pTxMsg->RTR = CAN_RTR_DATA;
	hcan->pTxMsg->DLC = 0x08;
	hcan->pTxMsg->Data[0] = (iq1 >> 8);
	hcan->pTxMsg->Data[1] = iq1;
	hcan->pTxMsg->Data[2] = (iq2 >> 8);
	hcan->pTxMsg->Data[3] = iq2;
	hcan->pTxMsg->Data[4] = iq3 >> 8;
	hcan->pTxMsg->Data[5] = iq3;
	hcan->pTxMsg->Data[6] = iq4 >> 8;
	hcan->pTxMsg->Data[7] = iq4;
	
	HAL_CAN_Transmit(hcan, 100);
}	

按照手册,我们能看出,如果要给编号为0x2010x204的电调发信息,要把发送中的`StdId`设置为0x200,若是要给0x2050x208的四个电调发信息,则要设置为0x1FF。

后面依照手册填充数据然后发送,过程比较简单。

0x03 总结

又是一篇有关大疆电机的文章,也是结合我自己的经历和上一篇文章的反馈才有了这篇。现在还记得我刚开始接触CAN通信时候的疑惑感,感觉资料都太复杂看不下去。水平确实有限,也就只能力求个浅显易懂,希望能帮助朋友们节约一些时间吧。相关例程可以在公众号上向我索要。

前一篇文章链接:
PID和三环控制-以大疆M3508、M2006为例
记录移植到STM32F1的过程与遇到的问题:
M3508电机控制程序的F1移植过程
使用ESP32的CAN总线+蓝牙BLE控制电机:
ESP32:蓝牙BLE控制M3508

更多嵌入式,电机控制相关文章请移步公众号,来找我聊聊天吧:

公众号

技术新人,水平有限,还请各位朋友多多指教。如果对文章有任何的疑问或者发现错误请一定指出!

演示视频:

同时控制M3505、M2006双电机的演示视频在原文底部:

文章二维码


欢迎转载,请注明作者与原文地址:

作者:胡小安

原文链接:https://blog.csdn.net/qq_28039135/article/details/119011372

  • 53
    点赞
  • 346
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
关注开源四轴项目也有近一年了,前期都以潜水为主,业余时间主要是在啃那些控制和导航的理论书籍。最近开始动手做了,打算先从电调开始,发现真要做起来问题还真是一大堆。所幸有论坛这么好一个交流平台,很多问题其实前人都已经碰到过了,参考前人的经验,让我少走了很多弯路。在此要感谢论坛各位前辈大侠和阿莫的ourdev。:-) 前人种树、后人乘凉,既然受惠于前人,怎好意思独享,当然也应该帮助一下新入门的开发者。由于四轴分论坛的帖子数量已经很多了,光搜一下无刷电机和电调也有近百来篇帖子,次序和深浅程度不一,想要看完并完全理解这些帖子对新人来说不啻是一个艰巨的任务。而且很多帖子的发帖时间都比较久远了,回帖提问也未必能得到原作者的回答。我写这篇文档的目的,就在于做一个整理和汇编,把很多零散的、前人已解答过的问题分门别类整理出来,并添加一些自己制作电调时的经验和总结。 在参考一些关于无刷电机驱动的书籍和帖子的时候,发现高手或是大师好像都比较惜字如金,一些问题往往点到为止或者一笔带过,有些看似简单的问题会让像我这样的电调DIYer困惑很久。所以在本文行文时,笔者力图把问题以大白话的形式说明白,如果各位有觉得哪里看得不明不白的,可以回帖提出(时限一个月,呵呵),我会修改文档以试图将问题讲清楚。如果有些问题我无法回答,我会老老实实跟你说我也没搞清楚,还要请高手来解惑啊。如果发现我哪些内容讲错了,也请不吝指正。 最后还将附上德国MK项目电调代码(V0.41版本)的全代码分析,这件事可能以前没人做过吧,我就来揭晓一下答案好了^ ^。同时我也参照他的程序,自己写了一个可供mega8和mega32使用的电调驱动程序,将一些结构作了优化,所有变量名都从德语改成了英语,添加了比较完备的中文注释,通讯规约也做了一些整理和改动,并附带上位机调试程序。也希望大家能多多把自己的一些心得体会和经验拿出来,建立好一个基础的知识平台后,可以让后来的开发者少走很多初期摸索的弯路,而专心于攻克我们未能解决的难点。衷心希望后来的开发者能站在我们的肩膀上,走得比我们更远。 timegate
### 回答1: 大疆M3508无刷电机是一款高性能的电机,广泛应用于机器人和无人机领域。其程序是指控制电机运行和控制参数的软件程序。 M3508无刷电机的程序主要包括以下几个方面: 1. 速度控制程序:该程序用于控制电机的转速。通过接收外部的速度指令,将电机转速控制在设定值范围内。同时,该程序还可以配合传感器反馈信息,实现速度闭环控制,保证电机的转速的准确性和稳定性。 2. 位置控制程序:该程序用于控制电机的位置。通过接收外部的位置指令,将电机控制到指定的位置,实现定点定位功能。同样,该程序也可以结合传感器反馈信息,实现位置闭环控制,提高位置控制的精确度和稳定性。 3. 功率控制程序:该程序用于控制电机的功率输出。通过控制电机的电流,调节电机的输出功率,以适应不同工况的需求。同时,该程序还应考虑电机的保护机制,当电机工作过载或工作温度过高时,能及时采取相应的措施,保证电机的安全运行。 4. 通信接口程序:大疆M3508无刷电机还配备了通信接口,可以与外部设备进行数据交互和控制。通过该接口,可以实现与飞行控制器、主控制器等设备的数据传输和命令控制,实现对电机的远程控制和监测。 总之,大疆M3508无刷电机的程序是通过控制电机的速度、位置和功率等参数,实现对电机的精确控制和管理。这些程序能够满足不同应用场景的需求,并保证电机的安全运行和良好的性能表现。 ### 回答2: 大疆m3508无刷电机是一款高性能的电机产品,它具有高转速、高功率和高效率的特点。要编写适用于大疆m3508无刷电机的程序,需要了解一些基本知识和步骤。 首先,编写程序之前需要准备好程序开发环境,比如使用C语言或其他适用的编程语言。接下来,需要了解大疆m3508无刷电机的相关技术规格,比如电机的转速范围、电流范围和控制方式等。 在编写程序之前,需要明确电机的控制目标,比如速度控制、位置控制或者力矩控制。根据控制目标,可以选择相应的控制算法,比如PID控制算法或者模型预测控制算法。 在程序中,需要使用适当的接口和协议与电机进行通信。通常情况下,可以使用PWM信号或者电机驱动芯片来控制电机的转速和转向。同时,还可以通过CAN总线或者UART等通信协议与电机进行数据交互,比如读取电机的转速、电流或者温度等参数。 除了基本的控制功能,还可以通过程序来实现更高级的功能,比如闭环控制、故障检测和保护等。例如,可以通过编写相应的代码来监测电机的过压、过流或者温度过高等异常情况,并及时采取相应的保护措施,以确保电机的安全运行。 总之,编写适用于大疆m3508无刷电机的程序需要掌握相应的技术知识和开发环境,结合电机的技术规格和控制目标,选择合适的控制算法和通信接口,实现电机的控制功能和保护功能。这样才能有效地利用大疆m3508无刷电机的性能,实现所需的各种应用。 ### 回答3: 大疆m3508无刷电机是一种高效、高性能的无刷电机,适用于各种机器人和无人机应用。为了使其正常工作,需要编写程序进行控制。 首先,需要连接m3508无刷电机与控制器。通常,我们可以通过接口线将电机与控制器连接起来,并确保连接稳固可靠。 接下来,编写程序来控制电机。程序需要实现以下功能: 1. 初始化:在开始运行前,需要初始化电机。这包括设置电机参数、设置电机工作模式(例如速度控制或位置控制等)以及设置通信协议和波特率等。 2. 运行控制:根据需要,编写程序来控制电机的运动。可以设置电机转速、位置、加速度等。通过调用控制器提供的函数或方法,可以实现电机的速度控制、位置控制等。 3. 监控状态:在电机运行过程中,需要不断监控其状态,以确保其正常运行。通过读取电机的反馈信息,例如电流、速度、转向等,可以实时监测电机状态。根据实际需要,可以设置报警机制,如超过电机安全工作范围时发出警报。 4. 停止电机:在需要停止电机时,编写程序来实现电机的停止控制。可以通过设置电机的转速为0或者将电机切换到待机模式等方式来停止电机。 最后,通过上述程序的编写,可以实现对大疆m3508无刷电机的控制。根据具体应用需求,可以对程序进行优化和扩展,以实现更复杂的功能和控制策略。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值