跳转至

飞控主控代码

这份实验室飞控主控任务代码可用于对照 C 语言导学案,观察循环、分支、状态变量和结构体在实际项目中的组织方式。

阅读提示

代码来自具体飞控项目,依赖项目中的硬件和其他程序模块,仅供阅读参考,不能脱离完整工程独立编译或运行。

#include "Ano_FlightCtrl.h"
#include "Ano_RC.h"
#include "Ano_ProgramCtrl_User.h"
#include "Ano_OF.h"
#include "ZXH_Land.h"
#include "ZXH_FlightCtrl.h"
#include "ZXH_TakeOff.h"
#include "ZXH_SendData.h"
#include "LZY_TaskManager.h"
#include "LZY_DT.h"
#include "LZY_RPLidar.h"
#include "LZY_LoRa.h"
#include "Drv_OpenMV.h"

unsigned char SFlag = 1;
uint16_t ZGS_tm = 0;
uint16_t ZGS_tm1 = 0;
unsigned int TaskTimer_ms = 0;
unsigned int TaskConfirmCount = 0;
unsigned char OrdinalNum = 0;
u8 ModeChangedFlag = 0;
// unsigned int USART2_TaskTimer_ms = 0;

// u8 userCnt = 0;

/*
函数名:ZGS_FlightCtrlTask
参数:dT_ms
返回值:无
作用:一键飞行任务
*/
void ZXH_FlightCtrlTask(unsigned char dT_ms)
{
    ZXH_DataSand(jsdata.valid_of_alt_cm);
    LZY_DataSand_F4(rplidar_st.x, rplidar_st.y,rplidar_st.yaw, rplidar_st.iflag);
    ZGS_tm1 = TaskTimer_ms/100;
    ZXH_DataSand2(ZGS_tm1);
    // if (userCnt++ == 0) LoRa_Send(lora_st.c1, lora_st.c2, lora_st.c3);

    if (flag.unlock_sta == 1)       
    {       
        Remote_Control(dT_ms);
        ZXH_AutoLand(dT_ms);
        // 正常定高
        if (KHFlag == 1 && LandProgramUnlock_sta == 0)
        {
            KeepHeight(OFF_CM);
        }

        switch(OrdinalNum)
        {
            case 0:     // 一键起飞
            {           
                if (SFlag == 1)
                {
                    SFlag = 0;
                    TaskConfirmCount = 0;
                }

                ZXH_AutoTakeOff(dT_ms);     
                LZY_DataSand_F3(0x00);
                if(ABS(OFF_CM - RELATIVE_HEIGHT_CM) <= 5){
                    ZGS_tm ++;
                }else {
                    ZGS_tm = 0;
                }

                if (KHFlag == 1 && ZGS_tm>20)
                {
                    if (TaskConfirmCount <= 10)
                    {
                        if(ABS(OFF_CM - RELATIVE_HEIGHT_CM) <= 5){
                        TaskConfirmCount ++;
                        }else {
                            TaskConfirmCount = 0;
                        }
                    }
                    else
                    {
                        TaskConfirmCount = 0;
                        TaskTimer_ms = 0;                   
                        SFlag = 1;

                        OrdinalNum++;                       
                    }
                }
            }break;
            case 1:     // 短悬停
            {
                if (SFlag == 1)
                {
                    SFlag = 0;
                    TaskTimer_ms = 0;
                }
                LZY_DataSand_F3(0x01);
                if (TaskTimer_ms <= 5000)
                {
                    if (rplidar_st.iflag) {
                        LZY_Scheduler(TASK_MODE_POSITION_CTRL, 0, 0, 0, 0.02, &ModeChangedFlag);
                    }
                    TaskTimer_ms += dT_ms;
                }
                else
                {
                    TaskTimer_ms = 0;
                    OrdinalNum++;
                }
            }break;
            case 2:
            {
                if (SFlag == 1)
                {
                    ModeChangedFlag = 1;
                    SFlag = 0;
                    TaskTimer_ms = 0;
                    TaskConfirmCount = 0;
                }
                LZY_DataSand_F3(0x02);
                if (rplidar_st.iflag) {
                    LZY_Scheduler(TASK_MODE_POSITION_CTRL, 150, 0, 0, 0.02, &ModeChangedFlag);
                }
                else {
                    LZY_Scheduler(TASK_MODE_VELOCITY_HOVER, 0, 0, 0, 0.02, &ModeChangedFlag);
                }

                if (InRange(150, 0, 8)) {
                    TaskConfirmCount++;
                    OFF_CM = 100;
                }
                else {
                    TaskConfirmCount = 0;
                }

                if (TaskConfirmCount >= 200)
                {
                    TaskTimer_ms = 0;
                    TaskConfirmCount = 0;
                    ModeChangedFlag = 1;
                    OrdinalNum++;
                }
            }break;
            case 3:
            {
                if (SFlag == 1)
                {
                    ModeChangedFlag = 1;
                    SFlag = 0;
                    TaskTimer_ms = 0;
                    TaskConfirmCount = 0;
                }
                LZY_DataSand_F3(0x03);
                if (rplidar_st.iflag) {
                    LZY_Scheduler(TASK_MODE_POSITION_CTRL, 150, 150, 0, 0.02, &ModeChangedFlag);
                }
                else {
                    LZY_Scheduler(TASK_MODE_VELOCITY_HOVER, 0, 0, 0, 0.02, &ModeChangedFlag);
                }

                if (InRange(150, 150, 8)) {
                    TaskConfirmCount++;
                    OFF_CM = 150;
                }
                else {
                    TaskConfirmCount = 0;
                }

                if (TaskConfirmCount >= 200)
                {
                    TaskTimer_ms = 0;
                    TaskConfirmCount = 0;
                    ModeChangedFlag = 1;
                    OrdinalNum++;
                }
            }break;
            case 4:
            {
                if (SFlag == 1)
                {
                    ModeChangedFlag = 1;
                    SFlag = 0;
                    TaskTimer_ms = 0;
                    TaskConfirmCount = 0;
                }
                LZY_DataSand_F3(0x04);
                if (rplidar_st.iflag) {
                    LZY_Scheduler(TASK_MODE_POSITION_CTRL, 0, 150, 0, 0.02, &ModeChangedFlag);
                }
                else {
                    LZY_Scheduler(TASK_MODE_VELOCITY_HOVER, 0, 0, 0, 0.02, &ModeChangedFlag);
                }

                if (InRange(0, 150, 8)) {
                    TaskConfirmCount++;
                }
                else {
                    TaskConfirmCount = 0;
                }

                if (TaskConfirmCount >= 100)
                {
                    TaskTimer_ms = 0;
                    TaskConfirmCount = 0;
                    ModeChangedFlag = 1;
                    OrdinalNum++;
                }
            }break;
            case 5:
            {
                if (SFlag == 1)
                {
                    ModeChangedFlag = 1;
                    SFlag = 0;
                    TaskTimer_ms = 0;
                    TaskConfirmCount = 0;
                }
                LZY_DataSand_F3(0x05);
                if (rplidar_st.iflag) {
                    LZY_Scheduler(TASK_MODE_POSITION_CTRL, 0, 0, 0, 0.02, &ModeChangedFlag);
                }
                else {
                    LZY_Scheduler(TASK_MODE_VELOCITY_HOVER, 0, 0, 0, 0.02, &ModeChangedFlag);
                }

                if (InRange(0, 0, 8)) {
                    TaskConfirmCount++;
                }
                else {
                    TaskConfirmCount = 0;
                }

                if (TaskConfirmCount >= 100)
                {
                    TaskTimer_ms = 0;
                    TaskConfirmCount = 0;
                    OrdinalNum = 99;
                }
            }break;

            case 99:    // 降落
            {
                LZY_DataSand_F3(0x63);
                LandProgramUnlock_sta = 1;
                ZXH_Land = Yes; 
            }break;
        }   
    }
}