调试磁条AGV小结_编写磁导航部分驱动

本文详细介绍了调试磁条引导的AGV的过程,包括硬件检查、程序配置、HMI交互和安全措施。重点讲解了磁传感器的驱动开发,如学习传感器数据结构,配置CAN通讯参数,以及通过CAN调试助手验证数据。同时,提到了单片机如何获取和解析传感器数据,并提供了驱动部分的源代码片段。文章还强调了调试中的注意事项,如逐路排查线路故障和严格按照步骤操作。
摘要由CSDN通过智能技术生成

调试磁条AGV
一、调试一台车需要整体观
硬件、程序、HMI人机交互;最后上线自动运行;安全防护;

二、测试开发驱动流程(磁传感器)
2.1学习手册数据收发结构
1)结合硬件确认
产品型号:mpmgs200-f01
在这里插入图片描述
2)了解接线硬件原理图
在这里插入图片描述
后面和厂家沟通过,发现配置曼普拉斯磁条传感器,只适合485配置
3)查看所用的Raw CAN协议
RawCAN 自定义协议导航数据获取有主动上报、触发主动上报和被动查询三种模式。 主动上报模
式下传感器启动完成之后就开始以设定的速率持续向 CAN 总线发送数据报文。而触发主动上报
模式下传感器启动完成之后不会主动发送数据报文,只有在接收到触发指令后才会启动主动上报
机制, 再次收到触发指令则停止发送数据。被动模式下主机发送数据请求指令报文,传感器响应
并返回导航数据报文。
在这里插入图片描述
a先发送唤醒0x601   4D 04唤醒磁条传感器;
接下来磁条传感器主动上报,数据,程序解析处理数据即可;
4)具体配置该传感器(CAN通讯、500Kbps、站点1、N极识别)
在这里插入图片描述
5)配置完成后,需要上位机获取数据验证发送正确否
此处上位机器支持演示模式

2.2通过CAN调试助手抓取数据
1)模拟单片机发送唤醒指令,看到反馈数据(空,未放置磁条时)
在这里插入图片描述
2)下端放置1根磁条
在这里插入图片描述
下端放置2根磁条
在这里插入图片描述
下端放置3根磁条
在这里插入图片描述
3)依次拿开下方磁条:把中间磁条拿开
在这里插入图片描述
把另外一段也撤掉
在这里插入图片描述
小结:从CAN数据分析,第一位置表示磁条数量;第二位置表示磁便值(依次往后)
调试过程中:a线路故障,需要细心一点点排查,先单独测试一路,在接两路,在接三路;
b、结合说明文档,发送指令,一定按照步骤去操作,不要跳步;

2.3单片机获取数据,解析数据
1)唤醒磁条传感器
在这里插入图片描述
在这里插入图片描述
2)接收处理主动上报的数据
在这里插入图片描述
在这里插入图片描述
补充,一个传感器最多识别3段磁条,所以此处存放三段值,可用3或者动态读取到的磁条段数;

三、驱动部分源码
3.1 mangnet_strip_mengs200.c

#include "magnet_strip_memgs200.h"
//#include "myMath.h"
#include "include.h"

CAN_RxPacketTypeDef magnet_strip_rxbuffer[MEGNET_STRIP_RXBUFFER_SIZE];	//接收数组
CAN_RxPacketTypeDef magnet_strip_rxbuffer[MEGNET_STRIP_TXBUFFER_SIZE];	//接收数组

MagnetStrip_t magstrip[MagnetStripNum];	//磁条传感器

uint8_t mag_choose_index = 0;

/*******************************************************************************
* 函数名 : void MagStrip_Memgs200_Init(uint32_t can_id)
* 描  述 : 磁条传感器初始化
* 输  入 : 设备ID
* 输  出 : 无
* 返回值 : 无
* 说  明 : 无
*******************************************************************************/
void MagStrip_Memgs200_Init(void)
{
	MagStrip_Memgs200_WakeUp(1);
	MagStrip_Memgs200_WakeUp(2);
	MagStrip_Memgs200_WakeUp(3);
}
/*******************************************************************************
* 函数名 : void MagStrip_WakeUp(uint32_t can_id,uint32_t mag_id)
* 描  述 : 磁条传感器唤醒主动发送
* 输  入 : 设备ID
* 输  出 : 无
* 返回值 : 无
* 说  明 : 无
*******************************************************************************/
void MagStrip_Memgs200_WakeUp(uint32_t mag_id)
{
	uint8_t _send_data[] = {0x4D,0x04};
	MAGNET_STRIP_SEND_MSG(0x600 + mag_id,2,CAN_RTR_DATA,_send_data);
}
/*******************************************************************************
* 函数名 : void Magnet_Strip_Response_Decoder(can_rx_msg_t rxmsg)
* 描  述 : 对磁传感器数据解析
* 输  入 : 磁传感器数据
* 输  出 : 无
* 返回值 : 无
* 说  明 : 无
*******************************************************************************/
int32_t Magnet_Strip_Memgs200_Response_Handle(CAN_RxPacketTypeDef rxmsg)//
{
	int32_t res = 0;
	 switch(rxmsg.header.StdId)
	 {
	     case 0x581: //前
		 {
			 magstrip[MagFrontFront].strip_num = rxmsg.payload[0];
			 for(uint8_t i=0;i<3;i++)
			 {
				 magstrip[MagFrontFront].strip_position[i] = rxmsg.payload[i+1];
			 }
		 }break;
	     case 0x582: //后
		 {
			 magstrip[1].strip_num = rxmsg.payload[0];
			 for(uint8_t i=0;i<magstrip[1].strip_num;i++)
			 {
				 magstrip[1].strip_position[i] = rxmsg.payload[i+1];
			 }
		 }break;
	     case 0x583: //左
		 {
			 magstrip[2].strip_num = rxmsg.payload[0];
			 for(uint8_t i=0;i<magstrip[2].strip_num;i++)
			 {
				 magstrip[2].strip_position[i] = rxmsg.payload[i+1];
			 }
		 }break;

	     default:
	    	 break;
	 }
	 return res;
}


2、mangnet_strip_mengs200.h

/*
 * magnet_strip.h
 *
 *  Created on: 2023年3月16日
 *      Author:
 */
#ifndef MAGNET_STRIP_MEMGS200_H
#define MAGNET_STRIP_MEMGS200_H

#include "stm32f7xx_hal.h"
#include "can.h"
#include "magnet_strip.h"

#define ALL_MEGSTRIP_IP	0x000

#define MEGNET_STRIP_RXBUFFER_SIZE  16
#define MEGNET_STRIP_TXBUFFER_SIZE  16

extern CAN_RxPacketTypeDef magnet_strip_rxbuffer[MEGNET_STRIP_RXBUFFER_SIZE];	//接收数组
extern CAN_RxPacketTypeDef magnet_strip_rxbuffer[MEGNET_STRIP_TXBUFFER_SIZE];	//发送数组

#define MAGNET_STRIP_SEND_MSG can2_send_msg



extern MagnetStrip_t magstrip[MagnetStripNum];	//磁条传感器
//typedef struct{
//	uint8_t strip_num;
//	int8_t strip_position[3];
//}MagnetStrip_t;


void MagStrip_Memgs200_Init(void);
void MagStrip_Memgs200_WakeUp(uint32_t mag_id);
int32_t Magnet_Strip_Memgs200_Response_Handle(CAN_RxPacketTypeDef rxmsg);
#endif /* MAGNET_STRIP_MEMGS200_H */

以上结束,学习撰写磁导航驱动过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值