STM32F407+Cubemx学习&应用[7]——CAN接收数据——BRT38

本文档介绍了如何使用STM32F407通过Cubemx配置和Keil代码实现CAN接收BRT38编码器的RS485数据,解析编码器值并计算速度。博主分享了配置时钟、USART、CAN等步骤,并提供了中断回调函数的详细实现。测试结果显示了编码器值、偏差、累计距离和速度信息。
摘要由CSDN通过智能技术生成

STM32F407+Cubemx学习&应用[7]——CAN接收数据——BRT38


本《STM32F407+Cubemx学习&应用系列》是自己在做工程时学习和琢磨的总结,还有诸多不足希望能够指出。本系列主要针对串口通信的一些应用,和TCP、CAN通信的一些简单应用。

本例程的目的:通过用can总线读取编码器数据,并用串口打印出来。

本例程的基础例程:https://blog.csdn.net/LW_12345/article/details/121442281?spm=1001.2014.3001.5502《STM32F407+Cubemx学习&应用[1]——串口打印》

参考:硬石例程《YSF4_HAL-073. CAN2双机通信测试》

硬件

硬石开发板:YS-F4Pro(用于工业控制~~~师兄选的哈)
BRT38(多圈绝对值编码器 RS485 布瑞特 CAN总线),这里选用CAN通信,并且设置为1000Hz发送数据

Cubemx配置工程

时钟配置
STLink下载配置
USART1配置及串口打印
CAN1配置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

其他配置默认

Keil中代码

增加了bsp_PN532.h,bsp_PN532.c两个文件,是关于NFC发送读数据的文件。

can.c中添加
在void MX_CAN1_Init(void)函数中添加

 CAN_FilterTypeDef sFilterConfig;
 
 sFilterConfig.FilterActivation = ENABLE;//打开过滤器
 sFilterConfig.FilterBank = 0;//过滤器0 这里可设0-13
 sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;//采用掩码模式
 sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;//采用32位掩码模式
 sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;//采用FIFO0
 
 sFilterConfig.FilterIdHigh = 0x0000; //设置过滤器ID高16位
 sFilterConfig.FilterIdLow = 0x0000;//设置过滤器ID低16位
 sFilterConfig.FilterMaskIdHigh = 0x0000;//设置过滤器掩码高16位
 sFilterConfig.FilterMaskIdLow = 0x0000;//设置过滤器掩码低16位
 if(HAL_CAN_ConfigFilter(&hcan1,&sFilterConfig) != HAL_OK)//初始化过滤器
 {
  Error_Handler();
 }
 if(HAL_CAN_Start(&hcan1) != HAL_OK)//打开can
 {
  Error_Handler();
 }
 if(HAL_CAN_ActivateNotification(&hcan1,CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)//开启接受邮箱0挂起中断
 {
  Error_Handler();
 }
/* USER CODE BEGIN 1 */
CAN_RxHeaderTypeDef RXHeader;
uint8_t RXmessage[8];

int16_t   Encoder_value=0;
int16_t   Encoder_value_last=0;
int16_t   Encoder_value_diff=0;
int64_t   Encoder_value_sum=0;
float			Encoder_speed=0.0;
int8_t    first_flag=0;

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)//接受邮箱0挂起中断回调函数
{
	if(hcan->Instance==CAN1)
	{
		HAL_CAN_GetRxMessage(hcan,CAN_FILTER_FIFO0,&RXHeader,RXmessage);//获取数据
		
		Encoder_value=RXmessage[3]|RXmessage[4]<<8|RXmessage[5]<<16|RXmessage[6]<<24;
		Encoder_value_diff=(float)(Encoder_value-Encoder_value_last);
		Encoder_speed=Encoder_value_diff/0.001f;
		
		if(first_flag!=0)
		{
			if(Encoder_value_diff<-12000)
			{
				Encoder_value_sum+=Encoder_value_diff+24576;
			}else if(Encoder_value_diff>12000)
			{
				Encoder_value_sum+=Encoder_value_diff-24576;
			}else
			{
				Encoder_value_sum+=Encoder_value_diff;
			}
		}
		Encoder_value_last=Encoder_value;
		first_flag=1;
		
		printf("》数据段的内容:Data[3]= 0x%X ,Data[4]=0x%X ,编码器值=0x%X ,编码器值=%d \n",RXmessage[3],RXmessage[4],Encoder_value,Encoder_value);
		printf("》偏差 : %d  \n", Encoder_value_diff);	
		printf("》距离 : %lld  \n", Encoder_value_sum);		
		printf("》速度 : %.0f  \n", Encoder_speed);	
  }
}
/* USER CODE END 1 */

测试

在这里插入图片描述

源码下载:
https://gitee.com/Luweizhiyuan2020/stm32-f407_-cubemx.git
(can_TRx)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值