四旋翼无人机从0到1的实现(十五)无人机外设驱动→Receiver

Author:家有仙妻谢掌柜
Date:2021/2/18

今年会更新一个系列,小四轴无人机从功能设计→思维导图→原理图设计→PCBLayout→焊接PCB→程序代码的编写→整机调试一系列,以此记录自己的成长历程!
这个小四轴无人机是大学时期学习制作的,加上现在工作学习对嵌入式的理解更加深入,因此想要重新梳理一下小四轴,之后在此基础上实现大四轴的飞控设计,这些都将在工作之余完成!

//小四轴无人机设计,接收机用的是NRF51822
#include "nrf51822.h"

/*******************************************************************************
 * fuction	nrf51822_get_data
 * brief	获取遥控器的数据
 * param	无
 * return	无
 *******************************************************************************/  
void nrf51822_get_data(void)
{
    
    
	if(RF_DATA_SUCCES == true)
	{
    
    
		RF_DATA_SUCCES = false;
		if(RF_DATA[0]==0x66)
		{
    
    
			/* 要控器的油门值,初始为171-853,减去171后变为0-680---- */
			//		RF_DATA[1]   RF_DATA[2]
			//		temp_throttle = RF_DATA[1];
			//		temp_throttle = temp_throttle*256 
			//		temp_throttle += RF_DATA[2];
			temp_throttle = (uint16_t)((( uint16_t)RF_DATA[1]<<8)|RF_DATA[2])-171.0f;
			throttle = Curve_Ctrl(temp_throttle);          //	float Curve_Ctrl(float Curve_X)
			if(throttle<=0) 		throttle = 0;
			if(throttle>=1000) 	throttle = 1000;	
			/* ,得到期望的ROLL舵值 */   
			temp_Expect.roll = (uint16_t)((( uint16_t)RF_DATA[3]<<8)|RF_DATA[4])-512.0f;
			/* ,得到期望的pitch舵值 */
			temp_Expect.pitch = (uint16_t)((( uint16_t)RF_DATA[5]<<8)|RF_DATA[6])-512.0f;
			/* ,得到期望的ROLL的角度,pitch的角度 */  
			temp_Expect.pitch = temp_Expect.pitch/8.0f;
			temp_Expect.roll = -temp_Expect.roll/8.0f;
			/* ,得到期望的yaw舵值 */   
			temp_Expect.yaw = (uint16_t)((( uint16_t)RF_DATA[7]<<8)|RF_DATA[8])-512.0f;
			/* pitch roll防斜边处理 弱化处理 */
			float expect_len = temp_Expect.roll*temp_Expect.roll+temp_Expect.pitch*temp_Expect.pitch;
			Expect.roll = temp_Expect.roll*fabs(temp_Expect.roll)/sqrtf(expect_len+1.0f);
			Expect.pitch = temp_Expect.pitch*fabs(temp_Expect.pitch)/sqrtf(expect_len+1.0f);
			/* pitch roll做死区处理,防止误动作 */
			Expect.roll = applyDeadband(Expect.roll,5.0f);
			Expect.pitch = applyDeadband(Expect.pitch,5.0f);
			/* yaw 弱化处理 */
			float expect_len_raw = temp_Expect.yaw*fabs(temp_Expect.yaw)/350.0f;
			//	Expect.yaw = float constrain_float(float amt,float low,float high )
			/* yaw 比大小,取值 */
			Expect.yaw =  constrain_float(expect_len_raw,-330.0f,330.0f);
			/* yaw做死区处理,防止误动作 */
			Expect.yaw = applyDeadband(Expect.yaw,35.0f);  // 取35.0f的目的是为了退油门摇杆时防止左右偏差,产生航向角的误动作
			/* 为了做按键处理 */
			if(start_input_once_flag == false)
			{
    
    
				start_input_once_flag = true;
				last_rfdata_9  = RF_DATA[9];
				last_rfdata_10 = RF_DATA[10];
			}
			/* 如果不等于则按键按下 ,做飞行状态处理 */
			if(RF_DATA[9] != last_rfdata_9)//如果不等于则按键按下
			{
    
                     
				if(Fly_Mode == FLYMODE_FLP)
				{
    
    
					Fly_Mode = FLYMODE_6AXIE;
				}
				else
					Fly_Mode = FLYMODE_FLP;
				last_rfdata_9 = RF_DATA[9];
			}
			if(RF_DATA[10] != last_rfdata_10)
			{
    
    
				if(Fly_State == FlyStop)
				{
    
    
					Fly_State = FlyIdle;
				}
				else
					Fly_State = FlyStop;
				last_rfdata_10 = RF_DATA[10];
			}
			//thr_lowest_flag   停机模式FlyStop   怠速模式FlyIdle  油门值throttle 
			if(Fly_State == FlyIdle && throttle<30.0f && thr_lowest_flag == false)
			thr_lowest_flag = true;
			if(Fly_State == FlyStop) thr_lowest_flag = false;
			if(Fly_State == FlyIdle && thr_lowest_flag == true && throttle>=30.0f)
			Fly_State = FlyStart;

			/* 判断是否为翻跟头模式 */
			if(Fly_Mode == FLYMODE_FLP)
			{
    
    
				/* 判断是否为前后翻 */
				if(fabs(Expect.pitch)>15)
				{
    
    
					/* 判断是否为前翻 */
					if(Expect.pitch>15)
						filp_dir = 1;	
					else if(Expect.pitch<-15)
						filp_dir = 2;
					filp_state = 0;
				}
				/* 判断是否为左右翻 */
				else if(fabs(Expect.roll)>15)
				{
    
    
					/* 判断是否为右翻 */
					if(Expect.roll>15)
						filp_dir = 3;
					else if(Expect.roll<-15)
						filp_dir = 4;
					filp_state = 0;
				}
				Expect.roll = 0;
				Expect.pitch = 0;
			}
		}
	}
}
#ifndef _NRF51822_H__
#define _NRF51822_H__

#include "board_define.h"
#include "var_global.h"
void nrf51822_get_data(void);
//extern uint8_t RF_DATA[13];
#endif

猜你喜欢

转载自blog.csdn.net/FutureStudio1994/article/details/113854534