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