|
恒拓飛控源碼 stm32+mpu6050
0.png (63.55 KB, 下載次數(shù): 117)
下載附件
2017-2-28 23:14 上傳
完整的程序源碼下載:
HT-Hawk飛控源代碼.zip
(1.1 MB, 下載次數(shù): 245)
2017-2-28 12:00 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
下面提供部分程序來(lái)預(yù)覽:
飛控的主程序:
- /*
- ******************* (C) COPYRIGHT 2015 Air Nano Team ***************************
- * 模塊名稱 : 主程序模塊
- * 文件名 :main.c
- * 描述 :系統(tǒng)初始化
- * 實(shí)驗(yàn)平臺(tái) :HT_Hawk
- * 庫(kù)版本 :ST3.5.0
- * 作者 :Air Nano Team
- *********************************************************************************
- */
- #include "board_config.h"
- /*
- *********************************************************************************************************
- * 函 數(shù) 名: main
- * 功能說(shuō)明: c程序入口
- * 形 參:無(wú)
- * 返 回 值: 錯(cuò)誤代碼(無(wú)需處理)
- *********************************************************************************************************
- */
- int main(void)
- {
- // boot_loader 相關(guān)配置
- Bootloader_Set(); //單片機(jī)引導(dǎo)程序
-
- // 硬件初始化
- InitBoard();
- // 傳感器初始化
- Sensor_Init();
-
- // 加載參數(shù)
- paramLoad();
-
- /* 開(kāi)定時(shí)中斷 */
- EnTIMER;
- while(1)
- {
- loop(); //主函數(shù)循環(huán)執(zhí)行部分 與上位機(jī)通訊 刷新OLED屏 保存修改的PID數(shù)據(jù)
- }
- }
復(fù)制代碼 MultiRotor_app.c
- /******************** (C) COPYRIGHT 2014 Air Nano Team ***************************
- * 文件名 :INIT.c
- * 描述 :系統(tǒng)初始化
- * 實(shí)驗(yàn)平臺(tái):HT_Hawk
- * 庫(kù)版本 :ST3.5.0
- * 作者 :Air Nano Team
- **********************************************************************************/
- #include "include.h"
- #include "MultiRotor_app.h"
- fp32 Battery_Voltage;
- Flag_t flag; //【標(biāo)志的結(jié)構(gòu)體定義】 此處可以分開(kāi)定義
- ////*************************************************
- ////********* struct {
- //// u8 MpuExist; // MPU存在
- //// u8 MagExist; // MAG存在
- //// u8 NrfExist; // NRF存在
- //// u8 MagIssue; // MAG有問(wèn)題
- ////
- //// u8 ARMED; // 電機(jī)解鎖
- //// u8 LockYaw; // 航向鎖定
- //// u8 calibratingA; // 加速度采集
- //// u8 calibratingM; // 磁力計(jì)采集
- //// u8 calibratingM_pre; //磁力計(jì)預(yù)采集
- ////
- //// u8 ParamSave; // 參數(shù)保存標(biāo)志
- ////
- //// 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í)函數(shù)初始化 使用SYSCLK 分為 【ms級(jí)延時(shí) us級(jí)延時(shí) 普通軟件延時(shí)】
- Nvic_Init(); //中斷初始化 time.c中 配置 【TIM5-系統(tǒng)時(shí)基 TIM2 TIM3輸入捕捉 提供八通道】
-
- /* 初始化USB設(shè)備 */
- bsp_InitUsb(); //與上位機(jī)通訊使用
-
- ADC1_Init();
- OLED_Init();
- I2C_INIT();
- LED_GPIO_Config();
- USART1_Config();
- TIM5_Config(); //TIM5 2ms中斷一次 提供系統(tǒng)時(shí)基
- PWM_OUT_Config(); //PWM輸出控制無(wú)刷電機(jī) 【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(); //讀取初始化成功標(biāo)志
- flag.MagExist = Init_HMC5883L(); //傳感器初始化成功 傳感器存在的標(biāo)志
- flag.NrfExist = NRF24L01_Check();
- NRF24L01_Mode(1); //設(shè)置24l01為發(fā)送模式
-
- OLED_P6x8Str(0,1,"ROLL:"); //OLED顯示三個(gè)姿態(tài)歐拉角數(shù)值
- OLED_P6x8Str(0,2,"PITCH:");
- OLED_P6x8Str(0,3,"YAW:");
-
- OLED_P6x8Str(0,5,"YAW:"); //四個(gè)遙控器通道數(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);
- }
- //***********************************【劃分時(shí)間片,分配任務(wù)】******************************************//
- //======================================【主循環(huán)執(zhí)行函數(shù)】============================================//
- void loop(void)
- { //姿態(tài)解算 串級(jí)PID控制 在中斷函數(shù)中執(zhí)行 每2ms執(zhí)行一次
- // 250HZ
- if(flag.Loop_250Hz){
- flag.Loop_250Hz=0;
- UsbCmdPro(); //USB接收上位機(jī)數(shù)據(jù) 【4ms執(zhí)行一次】
- FailSafeLEDAlarm(); //閃爍燈
- }
-
- // 100HZ
- if(flag.Loop_100Hz){
- flag.Loop_100Hz=0;
- mavlink(); //飛控板循環(huán)發(fā)送數(shù)據(jù)到上位機(jī) 【10ms執(zhí)行一次】
- Screen_Update(); //更新OLED三個(gè)歐拉角和四個(gè)通道遙控器數(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
- **功能 :【時(shí)間片】
- **輸入 : 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ù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|