RoboMaster哨兵电控之路——云台控制以及自瞄联调

哨兵目前完成底盘的手动控制,大yaw轴手动控制。

当前任务是自瞄联调(上面的底盘运动逆解算就不提了,后面做小陀螺再介绍)

这篇介绍自瞄:

这里首先开启C板的串口DMA中断,我用的是串口1(丝印对应 usart2)

74a2c923912f46169f85f87252c4c868.png

下面是自瞄的开启,空闲中断后关闭,数据处理然后再开启DMA串口接收,还有新建一个结构体存储数据

#include "AutoGimbal.h"
#include "gimbal_behaviour.h"
extern UART_HandleTypeDef huart1;
extern DMA_HandleTypeDef hdma_usart1_rx;
visionDataStu_t visionDataStu;
uint8_t data_length;
uint8_t sbus_rx_buffer[BUFLENGTH];

void AUTO_control_init(void)
{
	__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);   //使能串口空闲中断  两次消息间隔会触发
	HAL_UART_Receive_DMA(&huart1,sbus_rx_buffer,BUFLENGTH);  //打开串口DMA接收  声明缓存数组  缓存数组长度
}

//利用串口接收不定长数据

void Usart1Receive_IDLE(void)
{
	HAL_UART_DMAStop(&huart1);//要停止DMA的接收来处理数据
	
	data_length=BUFLENGTH-__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
	
	//float是四个字节  32个位   
	if(data_length==DATALENGTH)
	{
		memcpy(visionDataStu.real_receive,sbus_rx_buffer,data_length);
	}
	
	memset(sbus_rx_buffer,0,BUFLENGTH);
	
	HAL_UART_Receive_DMA(&huart1,sbus_rx_buffer,BUFLENGTH);
}

 这个迭代一下:加上一个帧头帧尾校准

#include "AutoGimbal.h"
#include "gimbal_behaviour.h"
extern UART_HandleTypeDef huart1;
extern DMA_HandleTypeDef hdma_usart1_rx;
visionDataStu_t visionDataStu;
uint8_t data_length;
uint8_t sbus_rx_buffer[BUFLENGTH];

void AUTO_control_init(void)
{
	__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);   //使能串口空闲中断  两次消息间隔会触发
	HAL_UART_Receive_DMA(&huart1,sbus_rx_buffer,BUFLENGTH);  //打开串口DMA接收  声明缓存数组  缓存数组长度
}

//利用串口接收不定长数据

void Usart1Receive_IDLE(void)
{
	HAL_UART_DMAStop(&huart1);//要停止DMA的接收来处理数据
	
	data_length=BUFLENGTH-__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
	
	//int16是2个字节  8个位   
	//0x66 yaw pitch distance fire distance 0x67
	if(data_length==DATALENGTH)
	{
		if(sbus_rx_buffer[0]==0x66&&sbus_rx_buffer[7]==0x67)
		{
					memcpy(visionDataStu.real_receive,sbus_rx_buffer,data_length);
		}
	}
	
	memset(sbus_rx_buffer,0,BUFLENGTH);
	
	HAL_UART_Receive_DMA(&huart1,sbus_rx_buffer,BUFLENGTH);
}

void USART1_IRQHandler(void)
{
	if(RESET!=__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE))
	{
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);
		Usart1Receive_IDLE();
	}
	HAL_UART_IRQHandler(&huart1);
}	

注意在HAL库配置时候不要生成串口中断请求 

typedef struct
{
//	uint8_t mode;					//自瞄模式
//	uint8_t aim_amor;			//目标装甲板
//	uint8_t team;					//队伍颜色			从裁判系统读取,send
//	uint8_t spd;					//
//	int8_t fire;          //开火位
//	int16_t xerr;					//x差值
//	int16_t yerr;					//y差值
//	int8_t xdir;					//x方向
//	int8_t ydir;					//y方向
//	uint8_t allow;				//视觉判定结果
//	uint8_t sta;          //接收状态
//	uint8_t xun_sta;      //巡航标志位
//	int16_t x_ture;
//	int16_t y_ture;
//	int16_t x_ture_last;
//	int16_t y_ture_last;
//	
	uint8_t real_receive[DATALENGTH];   //自瞄实际接收到的数据
} visionDataStu_t;

注释了的是上一届学长的仅供参考

上效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值