標(biāo)題: 領(lǐng)航者飛控源碼 stm32 注釋相當(dāng)?shù)脑敿?xì) 易于學(xué)習(xí) [打印本頁]

作者: 空心杯ice    時間: 2017-3-2 22:36
標(biāo)題: 領(lǐng)航者飛控源碼 stm32 注釋相當(dāng)?shù)脑敿?xì) 易于學(xué)習(xí)
匿名的領(lǐng)航者飛控源碼,是用stm32單片機(jī)做的 注釋很詳細(xì)。


完整代碼下載:
領(lǐng)航者飛控源碼.zip (10.73 MB, 下載次數(shù): 392)




飛控的初始化代碼:
  1. /******************** (C) COPYRIGHT 2014 ANO Tech ********************************
  2.   * 作者   :匿名科創(chuàng)
  3. * 文件名  :init.c
  4. * 描述    :飛控初始化
  5. **********************************************************************************/

  6. #include "include.h"
  7. #include "pwm_out.h"
  8. #include "mpu6050.h"
  9. #include "i2c_soft.h"
  10. #include "led.h"
  11. #include "ctrl.h"
  12. #include "ms5611.h"
  13. #include "ak8975.h"
  14. #include "ultrasonic.h"

  15. u8 All_Init()
  16. {
  17.         NVIC_PriorityGroupConfig(NVIC_GROUP);                //中斷優(yōu)先級組別設(shè)置
  18.        
  19.         SysTick_Configuration();         //滴答時鐘
  20.        
  21.         I2c_Soft_Init();                                        //初始化模擬I2C
  22.        
  23.         PWM_IN_Init();                                                //初始化接收機(jī)采集功能
  24.        
  25.         PWM_Out_Init(400);                                //初始化電調(diào)輸出功能       
  26.        
  27.         Usb_Hid_Init();                                                //飛控usb接口的hid初始化
  28.        
  29.         MS5611_Init();                                                //氣壓計初始化
  30.        
  31.         Delay_ms(400);                                                //延時
  32.        
  33.         MPU6050_Init(20);                           //加速度計、陀螺儀初始化,配置20hz低通
  34.        
  35.         LED_Init();                                                                //LED功能初始化
  36.        
  37.         Usart2_Init(500000);                        //串口2初始化,函數(shù)參數(shù)為波特率
  38.         //Usart2_Init(256000);


  39.        
  40.         //TIM_INIT();
  41.        
  42.         Para_Init();                                                        //參數(shù)初始化
  43.        
  44.         Delay_ms(100);                                                //延時
  45.        
  46.         Ultrasonic_Init();                           //超聲波初始化
  47.        
  48.         Cycle_Time_Init();
  49.        
  50.         ak8975_ok = !(ANO_AK8975_Run());
  51.        
  52.         if( !mpu6050_ok )
  53.         {
  54.                 LED_MPU_Err();
  55.         }
  56.         else if( !ak8975_ok )
  57.         {
  58.                 LED_Mag_Err();
  59.         }
  60.         else if( !ms5611_ok )
  61.         {
  62.                 LED_MS5611_Err();
  63.         }
  64.         return (1);
  65. }
  66. /******************* (C) COPYRIGHT 2014 ANO TECH *****END OF FILE************/
復(fù)制代碼

飛控遙控程序:
  1. /******************** (C) COPYRIGHT 2014 ANO Tech ********************************
  2.   * 作者   :匿名科創(chuàng)
  3. * 文件名  :rc.c
  4. * 描述    :遙控器通道數(shù)據(jù)處理
  5. **********************************************************************************/

  6. #include "include.h"
  7. #include "rc.h"
  8. #include "mymath.h"
  9. #include "mpu6050.h"

  10. s8 CH_in_Mapping[CH_NUM] = {0,1,2,3,4,5,6,7};    //通道映射


  11. void CH_Mapping_Fun(u16 *in,u16 *Mapped_CH)
  12. {
  13.         u8 i;
  14.         for( i = 0 ; i < CH_NUM ; i++ )
  15.         {
  16.                 *( Mapped_CH + i ) = *( in + CH_in_Mapping[i] );
  17.         }
  18. }

  19. s16 CH[CH_NUM];

  20. float CH_Old[CH_NUM];
  21. float CH_filter[CH_NUM];
  22. float CH_filter_Old[CH_NUM];
  23. float CH_filter_D[CH_NUM];
  24. u8 NS,CH_Error[CH_NUM];
  25. u16 NS_cnt,CLR_CH_Error[CH_NUM];

  26. s16 MAX_CH[CH_NUM]  = {1900 ,1900 ,1900 ,1900 ,1900 ,1900 ,1900 ,1900 };        //搖桿最大
  27. s16 MIN_CH[CH_NUM]  = {1100 ,1100 ,1100 ,1100 ,1100 ,1100 ,1100 ,1100 };        //搖桿最小
  28. char CH_DIR[CH_NUM] = {0    ,0    ,0    ,0    ,0    ,0    ,0    ,0    };  //搖桿方向
  29. #define CH_OFFSET 500


  30. float filter_A;

  31. void RC_Duty( float T , u16 tmp16_CH[CH_NUM] )
  32. {
  33.         u8 i;
  34.         s16 CH_TMP[CH_NUM];
  35.         static u16 Mapped_CH[CH_NUM];

  36.         if( NS == 1 )
  37.         {
  38.                 CH_Mapping_Fun(tmp16_CH,Mapped_CH);
  39.         }
  40.         else if( NS == 2 )
  41.         {
  42.                 CH_Mapping_Fun(RX_CH,Mapped_CH);
  43.         }
  44.        
  45.         for( i = 0;i < CH_NUM ; i++ )
  46.         {
  47.                 if( (u16)Mapped_CH[i] > 2500 || (u16)Mapped_CH[i] < 500 )
  48.                 {
  49.                         CH_Error[i]=1;
  50.                         CLR_CH_Error[i] = 0;
  51.                 }
  52.                 else
  53.                 {
  54.                         CLR_CH_Error[i]++;
  55.                         if( CLR_CH_Error[i] > 200 )
  56.                         {
  57.                                 CLR_CH_Error[i] = 2000;
  58.                                 CH_Error[i] = 0;
  59.                         }
  60.                 }

  61.                 if( NS == 1 || NS == 2 )
  62.                 {
  63.                         if( CH_Error[i] ) //單通道數(shù)據(jù)錯誤
  64.                         {
  65.                                
  66.                         }
  67.                         else
  68.                         {
  69.                                 //CH_Max_Min_Record();
  70.                                 CH_TMP[i] = ( Mapped_CH[i] ); //映射拷貝數(shù)據(jù),大約 1000~2000
  71.                                
  72.                                 if( MAX_CH[i] > MIN_CH[i] )
  73.                                 {
  74.                                         if( !CH_DIR[i] )
  75.                                         {
  76.                                                 CH[i] =   LIMIT ( (s16)( ( CH_TMP[i] - MIN_CH[i] )/(float)( MAX_CH[i] - MIN_CH[i] ) *1000 - CH_OFFSET ), -500, 500); //歸一化,輸出+-500
  77.                                         }
  78.                                         else
  79.                                         {
  80.                                                 CH[i] = - LIMIT ( (s16)( ( CH_TMP[i] - MIN_CH[i] )/(float)( MAX_CH[i] - MIN_CH[i] ) *1000 - CH_OFFSET ), -500, 500); //歸一化,輸出+-500
  81.                                         }
  82.                                 }       
  83.                                 else
  84.                                 {
  85.                                         fly_ready = 0;
  86.                                 }
  87.                         }
  88.                 }       
  89.                 else //未接接收機(jī)或無信號(遙控關(guān)閉或丟失信號)
  90.                 {

  91.                 }
  92. //=================== filter ===================================
  93. //  全局輸出,CH_filter[],0橫滾,1俯仰,2油門,3航向 范圍:+-500       
  94. //=================== filter ===================================                
  95.                        
  96.                         filter_A = 3.14f *20 *T;
  97.                        
  98.                         if( ABS(CH_TMP[i] - CH_filter[i]) <100 )
  99.                         {
  100.                                 CH_filter[i] += filter_A *(CH[i] - CH_filter[i]) ;
  101.                         }
  102.                         else
  103.                         {
  104.                                 CH_filter[i] += 0.5f *filter_A *( CH[i] - CH_filter[i]) ;
  105.                         }
  106. //                                         CH_filter[i] = Fli_Tmp;
  107.                         CH_filter_D[i]         = ( CH_filter[i] - CH_filter_Old[i] );
  108.                         CH_filter_Old[i] = CH_filter[i];
  109.                         CH_Old[i]                 = CH[i];
  110.         }
  111.         //======================================================================
  112.         Fly_Ready(T);                //解鎖判斷
  113.         //======================================================================
  114.         if(++NS_cnt>200)  // 400ms  未插信號線。
  115.         {
  116.                 NS_cnt = 0;
  117.                 NS = 0;
  118.         }
  119. }

  120. u8 fly_ready = 0;
  121. s16 ready_cnt=0;

  122. void Fly_Ready(float T)
  123. {
  124.         if( CH_filter[2] < -400 )                                                          //油門小于10%
  125.         {
  126.                 if( fly_ready && ready_cnt != -1 ) //解鎖完成,且已退出解鎖上鎖過程
  127.                 {
  128.                         //ready_cnt += 1000 *T;
  129.                 }
  130. #if(USE_TOE_IN_UNLOCK)               
  131.                 if( CH_filter[3] < -400 )                                                       
  132.                 {
  133.                         if( CH_filter[1] > 400 )
  134.                         {
  135.                                 if( CH_filter[0] > 400 )
  136.                                 {
  137.                                         if( ready_cnt != -1 )                                   //外八滿足且退出解鎖上鎖過程
  138.                                         {
  139.                                                 ready_cnt += 3 *1000 *T;
  140.                                         }
  141.                                 }

  142.                         }

  143.                 }
  144. #else
  145.                 if( CH_filter[3] < -400 )                                              //左下滿足               
  146.                 {
  147.                         if( ready_cnt != -1 && fly_ready )        //判斷已經(jīng)退出解鎖上鎖過程且已經(jīng)解鎖
  148.                         {
  149.                                 ready_cnt += 1000 *T;
  150.                         }
  151.                 }
  152.                 else if( CH_filter[3] > 400 )                              //右下滿足
  153.                 {
  154.                         if( ready_cnt != -1 && !fly_ready )        //判斷已經(jīng)退出解鎖上鎖過程且已經(jīng)上鎖
  155.                         {
  156.                                 ready_cnt += 1000 *T;
  157.                         }
  158.                 }
  159. #endif               
  160.                 else if( ready_cnt == -1 )                                                //4通道(CH[3])回位
  161.                 {
  162.                         ready_cnt=0;
  163.                 }
  164.         }
  165.         else
  166.         {
  167.                 ready_cnt=0;
  168.         }

  169.        
  170.         if( ready_cnt > 1000 ) // 1000ms
  171.         {
  172.                 ready_cnt = -1;
  173.                 //fly_ready = ( fly_ready==1 ) ? 0 : 1 ;
  174.                 if( !fly_ready )
  175.                 {
  176.                         fly_ready = 1;
  177.                         mpu6050.Gyro_CALIBRATE = 2;
  178.                 }
  179.                 else
  180.                 {
  181.                         fly_ready = 0;
  182.                 }
  183.         }

  184. }

  185. void Feed_Rc_Dog(u8 ch_mode) //400ms內(nèi)必須調(diào)用一次
  186. {
  187.         NS = ch_mode;
  188.         NS_cnt = 0;
  189. }

  190. //=================== filter ===================================
  191. //  全局輸出,CH_filter[],0橫滾,1俯仰,2油門,3航向 范圍:+-500       
  192. //=================== filter ===================================        
  193. u8 height_ctrl_mode = 0;
  194. extern u8 ultra_ok;
  195. void Mode()
  196. {
  197.         if( !fly_ready || CH_filter[THR]<-400 ) //只在上鎖時 以及 油門 低于10% 的時候,允許切換模式,否則只能向模式0切換。
  198.         {
  199.                 if( CH_filter[AUX1] < -200 )
  200.                 {
  201.                         height_ctrl_mode = 0;
  202.                 }
  203.                 else if( CH_filter[AUX1] < 200 )
  204.                 {
  205.                         height_ctrl_mode = 1;
  206.                 }
  207.                 else
  208.                 {
  209.                         if(ultra_ok == 1)
  210.                         {
  211.                                 height_ctrl_mode = 2;
  212.                         }
  213.                         else
  214.                         {
  215.                                 height_ctrl_mode = 1;
  216.                         }
  217.                 }
  218.         }
  219.         else
  220.         {
  221.                 if( CH_filter[AUX1] < -200 )
  222.                 {
  223.                         height_ctrl_mode = 0;
  224.                 }
  225.         }
  226. }

  227. /******************* (C) COPYRIGHT 2014 ANO TECH *****END OF FILE************/

復(fù)制代碼

作者: w9669    時間: 2017-5-3 13:45
支持一個
作者: jxdianqi    時間: 2017-5-3 23:59
新來的,學(xué)習(xí)中,支持一個
作者: long2004y    時間: 2017-5-6 15:15
好帖,一定要頂!
作者: zhougr    時間: 2017-7-12 09:57
新來的,學(xué)習(xí)中,支持一個
作者: kylin_origin    時間: 2017-7-15 09:50
好東西  感謝分享
作者: 17863934608    時間: 2017-7-16 12:28
好東西,謝謝樓主分享
作者: lanhua520    時間: 2017-7-19 11:05
有配套的電路圖么?
作者: 865    時間: 2017-7-20 15:42
好東西,謝謝樓主分享
作者: 阿斯頓馬丁    時間: 2017-8-2 22:56
好東西
作者: ssnd001    時間: 2017-8-22 20:59

新來的,學(xué)習(xí)中,支持一個
作者: ssnd001    時間: 2017-8-22 21:02
東西很好,就是沒積分啊

作者: rock2016    時間: 2017-12-28 09:07
這個東西好,回去要好好研究一下
作者: DHuang    時間: 2017-12-28 15:19
支持一下

作者: 紅海盜qs    時間: 2018-1-4 09:20
用什么軟件寫的源碼阿?
作者: liupudong    時間: 2018-2-3 18:16
支持一下
作者: hjz1217283866    時間: 2018-2-26 10:09
支持 正需要
作者: jessy8310    時間: 2018-3-5 14:22
支持,學(xué)習(xí),學(xué)習(xí)。
作者: 老胖熊    時間: 2018-3-10 21:46
是否有電路原理圖?
作者: 少年0508    時間: 2018-5-1 20:15
感謝分享  下載學(xué)習(xí)學(xué)習(xí)
作者: 趙胖紙吖    時間: 2018-6-11 23:34
正在搞飛控,感謝樓主分享
作者: swpswpswp    時間: 2018-9-26 08:41
非常感謝,最近剛好要搞接收機(jī)的程序,終于找到了
作者: xsj1877578806    時間: 2018-10-12 00:38
感謝樓主分享
作者: 869996391    時間: 2019-3-7 19:23
贊一個
作者: 869996391    時間: 2019-3-7 19:24
感想樓主分享呀
作者: hotice0    時間: 2019-6-28 23:32
好東西,很有幫助
作者: 2545407140    時間: 2019-11-12 20:07
可以可以
作者: bryan_guan    時間: 2019-11-28 11:31
學(xué)習(xí)中,支持一個
作者: joinxp    時間: 2019-12-2 08:52
不錯,剛好一邊學(xué)一邊做,自己做個無人機(jī)玩玩,就是不知道有沒有遙控部分的




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1