找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2516|回復(fù): 0
收起左側(cè)

飛控代碼

[復(fù)制鏈接]
ID:253045 發(fā)表于 2017-11-24 15:16 | 顯示全部樓層 |閱讀模式
  • /*
  • ******************* (C) COPYRIGHT 2015 Air Nano Team ***************************
  • * 模塊名稱 : 主程序模塊
  • * 文件名   :main.c
  • * 描述     :系統(tǒng)初始化
  • * 實驗平臺 :HT_Hawk
  • * 庫版本   :ST3.5.0
  • * 作者     :Air Nano Team
  • *********************************************************************************
  • */
  • #include "board_config.h"
  • /*
  • *********************************************************************************************************
  • *        函 數(shù) 名: main
  • *        功能說明: c程序入口
  • *        形    參:無
  • *        返 回 值: 錯誤代碼(無需處理)
  • *********************************************************************************************************
  • */
  • int main(void)
  • {
  •         // boot_loader 相關(guān)配置
  •     Bootloader_Set();              //單片機引導(dǎo)程序
  •         // 硬件初始化
  •         InitBoard();
  •         // 傳感器初始化
  •         Sensor_Init();
  •         // 加載參數(shù)
  •         paramLoad();
  •         /* 開定時中斷 */
  •     EnTIMER;
  •         while(1)
  •         {
  •      loop();   //主函數(shù)循環(huán)執(zhí)行部分  與上位機通訊  刷新OLED屏  保存修改的PID數(shù)據(jù)
  •         }
  • }
  • 復(fù)制代碼MultiRotor_app.c
  • /******************** (C) COPYRIGHT 2014 Air Nano Team ***************************
  • * 文件名  :INIT.c
  • * 描述    :系統(tǒng)初始化
  • * 實驗平臺:HT_Hawk
  • * 庫版本  :ST3.5.0
  • * 作者    :Air Nano Team
  • **********************************************************************************/
  • #include "include.h"
  • #include "MultiRotor_app.h"
  • fp32 Battery_Voltage;
  • Flag_t flag;    //【標志的結(jié)構(gòu)體定義】 此處可以分開定義
  • ////*************************************************
  • ////********* struct {
  • ////              u8 MpuExist;      // MPU存在
  • ////              u8 MagExist;      // MAG存在
  • ////              u8 NrfExist;      // NRF存在
  • ////              u8 MagIssue;      // MAG有問題
  • ////
  • ////          u8 ARMED;         // 電機解鎖
  • ////              u8 LockYaw;       // 航向鎖定
  • ////          u8 calibratingA;  // 加速度采集
  • ////              u8 calibratingM;  // 磁力計采集
  • ////              u8 calibratingM_pre; //磁力計預(yù)采集
  • ////
  • ////              u8 ParamSave;     // 參數(shù)保存標志
  • ////
  • ////              u8 Loop_250Hz;
  • ////              u8 Loop_100Hz;
  • ////              u8 Loop_10Hz;
  • ////********* }Flag_t;
  • ////************************************************
  • /*====================================================================================================*/
  • /*====================================================================================================*
  • **函數(shù) : Bootloader_Set
  • **功能 : BOOT相關(guān)設(shè)置
  • **輸入 : None
  • **輸出 : None
  • **備注 : None
  • **====================================================================================================*/
  • /*====================================================================================================*/
  • void Bootloader_Set(void)
  • {
  •          u16 i;
  •         // 設(shè)置偏移量
  •         SCB->VTOR = FLASH_BASE | FLASH_EXCURSION ;
  •         i=0x0505;
  •         STMFLASH_Write(pro_FALG_ADD,&i,1);
  • }
  • /*====================================================================================================*/
  • /*====================================================================================================*
  • **函數(shù) : Sensor_Init
  • **功能 : ===============================【硬件初始化】===============================================//
  • **輸入 : None
  • **輸出 : None
  • **備注 : None
  • **====================================================================================================*/
  • /*====================================================================================================*/
  • void InitBoard(void)
  • {
  •         delay_init(72);     //延時函數(shù)初始化  使用SYSCLK  分為  【ms級延時  us級延時 普通軟件延時】
  •         Nvic_Init();        //中斷初始化      time.c中 配置     【TIM5-系統(tǒng)時基  TIM2 TIM3輸入捕捉 提供八通道】
  •         /* 初始化USB設(shè)備 */
  •     bsp_InitUsb();      //與上位機通訊使用
  •         ADC1_Init();
  •         OLED_Init();
  •         I2C_INIT();
  •     LED_GPIO_Config();
  •         USART1_Config();
  •         TIM5_Config();      //TIM5 2ms中斷一次 提供系統(tǒng)時基
  •         PWM_OUT_Config();   //PWM輸出控制無刷電機 【TIM1 TIM4 提供八路PWM輸出】
  •         PWM_IN_Config();    //PWM輸入捕捉初始化 使用TIM2輸入捕捉
  •         NRF24L01_Init();
  •          LED_SHOW();
  •          FLASH_Unlock();
  •          EE_Init();          //EEPROM掉電保存數(shù)據(jù)
  • }
  • /*====================================================================================================*/
  • /*====================================================================================================*
  • **函數(shù) : Sensor_Init
  • **功能 : ================================【傳感器初始化】============================================//
  • **輸入 : None
  • **輸出 : None
  • **備注 : None
  • **====================================================================================================*/
  • /*====================================================================================================*/
  • void Sensor_Init(void)
  • {
  •         flag.MpuExist = InitMPU6050();     //讀取初始化成功標志
  •         flag.MagExist = Init_HMC5883L();   //傳感器初始化成功   傳感器存在的標志
  •     flag.NrfExist = NRF24L01_Check();
  •     NRF24L01_Mode(1);                  //設(shè)置24l01為發(fā)送模式
  •         OLED_P6x8Str(0,1,"ROLL:");         //OLED顯示三個姿態(tài)歐拉角數(shù)值
  •         OLED_P6x8Str(0,2,"PITCH:");
  •         OLED_P6x8Str(0,3,"YAW:");
  •         OLED_P6x8Str(0,5,"YAW:");          //四個遙控器通道數(shù)據(jù)
  •         OLED_P6x8Str(0,6,"THR:");
  •         OLED_P6x8Str(56,5,"ROLL:");
  •         OLED_P6x8Str(56,6,"PITCH:");
  • }
  • /*====================================================================================================*/
  • /*====================================================================================================*
  • **函數(shù) : Screen_Update
  • **功能 : 屏幕數(shù)據(jù)更新
  • **輸入 : None
  • **輸出 : None
  • **備注 : None
  • **====================================================================================================*/
  • /*====================================================================================================*/
  • void Screen_Update(void)
  • {
  •         Dis_Float(1,40,AngE.Roll,1);
  •         Dis_Float(2,40,AngE.Pitch,1);
  •         Dis_Float(3,40,AngE.Yaw,1);
  •     OLED_4num(4,5,RC_Data.YAW);
  •         OLED_4num(4,6,RC_Data.THROTTLE);
  •         OLED_4num(57,5,RC_Data.ROLL);
  •         OLED_4num(58,6,RC_Data.PITCH);
  • }
  • //***********************************【劃分時間片,分配任務(wù)】******************************************//
  • //======================================【主循環(huán)執(zhí)行函數(shù)】============================================//
  • void loop(void)
  • {                               //姿態(tài)解算 串級PID控制 在中斷函數(shù)中執(zhí)行 每2ms執(zhí)行一次
  •         // 250HZ
  •         if(flag.Loop_250Hz){
  •                 flag.Loop_250Hz=0;
  •                 UsbCmdPro();                //USB接收上位機數(shù)據(jù) 【4ms執(zhí)行一次】
  •     FailSafeLEDAlarm();         //閃爍燈
  •         }
  •         // 100HZ
  •         if(flag.Loop_100Hz){
  •                 flag.Loop_100Hz=0;
  •     mavlink();                  //飛控板循環(huán)發(fā)送數(shù)據(jù)到上位機 【10ms執(zhí)行一次】
  •                 Screen_Update();            //更新OLED三個歐拉角和四個通道遙控器數(shù)據(jù)
  •         }
  •                 if(flag.Loop_10Hz){
  •                 flag.Loop_10Hz=0;
  •     EE_SAVE_Attitude_PID();     //如果調(diào)節(jié)了PID參數(shù)則用EEPROM保存數(shù)據(jù) 【100ms執(zhí)行一次】
  •         }
  • }
  • /*====================================================================================================*/
  • /*====================================================================================================*
  • **函數(shù) : Time_slice
  • **功能 :【時間片】
  • **輸入 : None
  • **輸出 : None
  • **備注 : None
  • **====================================================================================================*/
  • /*====================================================================================================*/
  • void Time_slice(void)      //每中斷一次執(zhí)行一次本函數(shù)
  • {
  •   static u16 tick[3]={0,0,0};
  •         tick[0]++;tick[1]++;tick[2]++;
  •         if(tick[0]>=2){          //4ms    2次中斷  一次2ms
  •                  tick[0] = 0;
  •                  flag.Loop_250Hz = 1;
  •         }
  •   if(tick[1]>=5){          //10ms   5次
  •                 tick[1] = 0;
  •                 flag.Loop_100Hz = 1;
  •         }
  •   if(tick[2] >= 50)        {      //100ms  50次
  •                 tick[2] = 0;
  •                 flag.Loop_10Hz = 1;
  •         }
  • }
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表