哨兵目前完成底盘的手动控制,大yaw轴手动控制。
当前任务是自瞄联调(上面的底盘运动逆解算就不提了,后面做小陀螺再介绍)
这篇介绍自瞄:
这里首先开启C板的串口DMA中断,我用的是串口1(丝印对应 usart2)
下面是自瞄的开启,空闲中断后关闭,数据处理然后再开启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;
注释了的是上一届学长的仅供参考
上效果: