stm32HAL库学习电控知识笔记《学习can通信协议和简易驱动GM6020电机》

 本人是大一的学生,学习了一段时间的stm32,此系列博客为个人的学习笔记,方便个人复习,如有错误或问题,非常非常欢迎大家来大力指正。

     知识参考中科大RM(TrojanGeneric)和kevin的教程。本视频的部分图也来自视频中的图片,代码也是参考他们的大家如果要学习强烈推荐他们的视频 

can     

(两种模式:闭环和开环)         

  

没有主从,没有地址的概念,发送的是帧,帧有标识符,can可以对识别符识别是否需要,需要就接收,BS1采样点的位置,BS2发送点的位置()

和这个对应

以下是帧的类型,常用的是数据帧和遥控帧

我们可以知道,要配置帧和过滤器,然后发送出去配置电机,就可以驱动电机了

以下是帧的结构,帧代码:

数据帧有ID有数据

遥控帧有ID无数据,裁决是看那个先出现显性电平0,RTR是判断是遥控帧还是数据帧

Can_TxHeader0.RTR=CAN_RTR_DATA;//数据帧填写CAN_RTR_DATA,遥控帧填写CAN_RTR_REMOTE */

IDE为标识符扩展位,1扩展,0默认,扩展帧在后面

Can_TxHeader0.IDE=CAN_ID_STD;//标准帧填写CAN_ID_STD,扩展帧填写CAN_ID_EXT

DLC数据长度编码

Can_TxHeader0.DLC=8;//帧长度
Can_TxHeader0.ExtId=0;//拓展帧
Can_TxHeader0.StdId=0x1FF;//标准帧

筛选器的代码:

Can_Filter0.FilterFIFOAssignment=CAN_FILTER_FIFO0;//绑定FIFO

can有两个fifo,一个fifo有三个邮箱。都有一个接收中断函数。有筛选器,配置可接收id或掩码。一开始的数据为广播,筛选器可以筛选需要的遥控帧和数据帧

一个can外设有两个fifo,一个fifo有三个邮箱

Can_Filter0.FilterScale=CAN_FILTERSCALE_16BIT;//筛选器字节数
Can_Filter0.FilterMode=CAN_FILTERMODE_IDMASK;//模式
Can_Filter0.FilterActivation=CAN_FILTER_ENABLE;//使能
Can_Filter0.FilterIdHigh=0x000;//id寄存器高八位
Can_Filter0.FilterIdLow=0x000;//id寄存器低八位
Can_Filter0.FilterMaskIdHigh=0x000;//掩码寄存器高8位
Can_Filter0.FilterMaskIdLow=0x000;//掩码寄存器低八位
Can_Filter0.FilterBank=0;//筛选器编号 can1 0-13,can2 14-27


 

if(HAL_CAN_ConfigFilter(&hcan1,&Can_Filter0)!=HAL_OK)//判断是否配置成功
{
    Error_Handler();
}

电流/电压配置

TxMailBox=CAN_TX_MAILBOX0;

Set_GM6020_Data[0]=0x22;//电压/电流配置

HAL_CAN_Start(&hcan1);

以下是全部的代码:

CAN_FilterTypeDef Can_Filter0;//结构体定义过滤器
CAN_TxHeaderTypeDef Can_TxHeader0;//结构体头文件配置
uint32_t TxMailBox;//邮箱


uint8_t Set_GM6020_Data[8];//发送的数据(电压)

Can_Filter0.FilterFIFOAssignment=CAN_FILTER_FIFO0;//绑定FIFO
Can_Filter0.FilterScale=CAN_FILTERSCALE_16BIT;//筛选器字节数
Can_Filter0.FilterBank=0;//筛选器编号 can1 0-13,can2 14-27
Can_Filter0.FilterMode=CAN_FILTERMODE_IDMASK;//模式
Can_Filter0.FilterActivation=CAN_FILTER_ENABLE;//使能
Can_Filter0.FilterIdHigh=0x000;//id寄存器高八位
Can_Filter0.FilterIdLow=0x000;//id寄存器低八位
Can_Filter0.FilterMaskIdHigh=0x000;//掩码寄存器高8位
Can_Filter0.FilterMaskIdLow=0x000;//掩码寄存器低八位
if(HAL_CAN_ConfigFilter(&hcan1,&Can_Filter0)!=HAL_OK)//判断是否配置成功
{
	Error_Handler();
}

Can_TxHeader0.DLC=8;//帧长度
Can_TxHeader0.StdId=0x1FF;//标准帧
Can_TxHeader0.ExtId=0;//拓展帧
Can_TxHeader0.IDE=CAN_ID_STD;//传输数据格式,标准帧填写CAN_ID_STD,扩展帧填写CAN_ID_EXT
Can_TxHeader0.RTR=CAN_RTR_DATA;//传输数据格式,数据帧填写CAN_RTR_DATA,遥控帧填写CAN_RTR_REMOTE
Can_TxHeader0.TransmitGlobalTime=DISABLE;//时间触发通信模式开始/结束

TxMailBox=CAN_TX_MAILBOX0;

Set_GM6020_Data[0]=0x22;//电压/电流配置

HAL_CAN_Start(&hcan1);//开启can
TxMailBox=CAN_TX_MAILBOX0;

Set_GM6020_Data[0]=0x22;//电压/电流配置

HAL_CAN_Start(&hcan1);

  while (1)
  {
		HAL_Delay(50);
		HAL_CAN_AddTxMessage(&hcan1,&Can_TxHeader0,Set_GM6020_Data,&TxMailBox);
  }

其他信息:

RS拉低是高速模式,拉高是静默模式。Vref是接参考电压,接can可以双机can通信

uint32_t HAL_CAN_IsSleepActive(const CAN_HandleTypeDef *hcan);查看是否在睡眠

测试模式:静默模式(可接不可发),回环模式(可发不可接外来的,只可接自己的),静默与回环模式(只可接自己的)

HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan, const CAN_TxHeaderTypeDef *pHeader,const uint8_t aData[], uint32_t *pTxMailbox);//发送函数
HAL_StatusTypeDef HAL_CAN_AbortTxRequest(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes);//挂起已发送的函数

uint32_t HAL_CAN_IsTxMessagePending(const CAN_HandleTypeDef *hcan, uint32_t TxMailboxes);//看返回值是否在等待发送,0无1有

HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan, const CAN_FilterTypeDef *sFilterConfig);
设置筛选器

#define HAL_CAN_DISABLE_IT()//可以关掉某个中断

正确接收并处理GM6020电机控制器返回的信号或数据需要遵循以下步骤: 1. **硬件连接**: - 确保GM6020电机控制器的电源地线正确连接。 - 将控制器的通信接口(如CAN总线、UART等)与微控制器(如Arduino、Raspberry Pi等)连接。 2. **软件配置**: - 根据使用的通信协议(如CAN、UART等),配置微控制器的通信参数。例如,如果使用CAN总线,需要设置波特率、过滤器等。 - 初始化通信接口,确保微控制器能够正确发送接收数据。 3. **数据接收**: - 使用相应的通信或API,编写代码来接收数据。例如,如果使用CAN总线,可以使用`CAN.read()`函数来读取接收到的数据帧。 - 将接收到的数据存储在变量中,以便后续处理。 4. **数据解析**: - 根据GM6020电机控制器的通信协议,解析接收到的数据。协议通常包括数据帧的格式、每个字节的含义等。 - 提取需要的信息,如电机速度、位置、电流等。 5. **数据处理**: - 根据应用需求,对解析后的数据进行处理。例如,可以将电机速度转换为实际转速,或者根据电流值调整控制参数。 - 将处理后的数据用于控制算法或其他功能。 6. **错误处理**: - 添加错误处理机制,确保在通信中断或数据错误时能够及时处理。例如,可以设置超时机制,重新发送请求或重启通信接口。 以下是一个简单的示例代码,演示如何通过CAN总线接收并解析GM6020电机控制器的数据: ```c #include <mcp_can.h> #include <SPI.h> // CAN总线引脚定义 const int SPI_CS_PIN = 10; MCP_CAN CAN(SPI_CS_PIN); void setup() { // 初始化串口 Serial.begin(115200); // 初始化CAN总线 if (CAN.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ) == CAN_OK) { Serial.println("CAN BUS Shield init ok!"); } else { Serial.println("CAN BUS Shield init fail!"); return; } // 设置CAN过滤器 CAN.setMode(MCP_NORMAL); // 设置为正常模式 } void loop() { unsigned char len = 0; unsigned char buf[8]; // 接收数据 if (CAN_MSGAVAIL == CAN.checkReceive()) { CAN.readMsgBuf(&len, buf); // 读取数据 // 解析数据 int motorSpeed = buf[0] | (buf[1] << 8); int motorPosition = buf[2] | (buf[3] << 8); int motorCurrent = buf[4] | (buf[5] << 8); // 处理数据 Serial.print("Motor Speed: "); Serial.println(motorSpeed); Serial.print("Motor Position: "); Serial.println(motorPosition); Serial.print("Motor Current: "); Serial.println(motorCurrent); } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值