调试磁条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 */
以上结束,学习撰写磁导航驱动过程