单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7925|回复: 24
打印 上一主题 下一主题
收起左侧

领航者飞控源码 stm32 注释相当的详细 易于学习

  [复制链接]
跳转到指定楼层
楼主
匿名的领航者飞控源码,是用stm32单片机做的 注释很详细。


完整代码下载:
领航者飞控源码.zip (10.73 MB, 下载次数: 234)




飞控的初始化代码:
  1. /******************** (C) COPYRIGHT 2014 ANO Tech ********************************
  2.   * 作者   :匿名科创
  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);                //中断优先级组别设置
  18.        
  19.         SysTick_Configuration();         //滴答时钟
  20.        
  21.         I2c_Soft_Init();                                        //初始化模拟I2C
  22.        
  23.         PWM_IN_Init();                                                //初始化接收机采集功能
  24.        
  25.         PWM_Out_Init(400);                                //初始化电调输出功能       
  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初始化,函数参数为波特率
  38.         //Usart2_Init(256000);


  39.        
  40.         //TIM_INIT();
  41.        
  42.         Para_Init();                                                        //参数初始化
  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************/
复制代码

飞控遥控程序:
  1. /******************** (C) COPYRIGHT 2014 ANO Tech ********************************
  2.   * 作者   :匿名科创
  3. * 文件名  :rc.c
  4. * 描述    :遥控器通道数据处理
  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] ) //单通道数据错误
  64.                         {
  65.                                
  66.                         }
  67.                         else
  68.                         {
  69.                                 //CH_Max_Min_Record();
  70.                                 CH_TMP[i] = ( Mapped_CH[i] ); //映射拷贝数据,大约 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 //未接接收机或无信号(遥控关闭或丢失信号)
  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 )        //判断已经退出解锁上锁过程且已经解锁
  148.                         {
  149.                                 ready_cnt += 1000 *T;
  150.                         }
  151.                 }
  152.                 else if( CH_filter[3] > 400 )                              //右下满足
  153.                 {
  154.                         if( ready_cnt != -1 && !fly_ready )        //判断已经退出解锁上锁过程且已经上锁
  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内必须调用一次
  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************/

复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 转播转播 分享分享 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
w9669 发表于 2017-5-3 13:45 来自手机 | 只看该作者
支持一个
回复

使用道具 举报

板凳
jxdianqi 发表于 2017-5-3 23:59 | 只看该作者
新来的,学习中,支持一个
回复

使用道具 举报

地板
long2004y 发表于 2017-5-6 15:15 | 只看该作者
好帖,一定要顶!
回复

使用道具 举报

5#
zhougr 发表于 2017-7-12 09:57 | 只看该作者
新来的,学习中,支持一个
回复

使用道具 举报

6#
kylin_origin 发表于 2017-7-15 09:50 | 只看该作者
好东西  感谢分享
回复

使用道具 举报

7#
17863934608 发表于 2017-7-16 12:28 | 只看该作者
好东西,谢谢楼主分享
回复

使用道具 举报

8#
lanhua520 发表于 2017-7-19 11:05 | 只看该作者
有配套的电路图么?
回复

使用道具 举报

9#
865 发表于 2017-7-20 15:42 | 只看该作者
好东西,谢谢楼主分享
回复

使用道具 举报

10#
阿斯顿马丁 发表于 2017-8-2 22:56 | 只看该作者
好东西
回复

使用道具 举报

11#
ssnd001 发表于 2017-8-22 20:59 | 只看该作者

新来的,学习中,支持一个
回复

使用道具 举报

12#
ssnd001 发表于 2017-8-22 21:02 | 只看该作者
东西很好,就是没积分啊
回复

使用道具 举报

13#
rock2016 发表于 2017-12-28 09:07 | 只看该作者
这个东西好,回去要好好研究一下
回复

使用道具 举报

14#
DHuang 发表于 2017-12-28 15:19 | 只看该作者
支持一下
回复

使用道具 举报

15#
红海盗qs 发表于 2018-1-4 09:20 | 只看该作者
用什么软件写的源码阿?
回复

使用道具 举报

16#
liupudong 发表于 2018-2-3 18:16 | 只看该作者
支持一下
回复

使用道具 举报

17#
hjz1217283866 发表于 2018-2-26 10:09 | 只看该作者
支持 正需要
回复

使用道具 举报

18#
jessy8310 发表于 2018-3-5 14:22 | 只看该作者
支持,学习,学习。
回复

使用道具 举报

19#
老胖熊 发表于 2018-3-10 21:46 | 只看该作者
是否有电路原理图?
回复

使用道具 举报

20#
少年0508 发表于 2018-5-1 20:15 | 只看该作者
感谢分享  下载学习学习
回复

使用道具 举报

21#
赵胖纸吖 发表于 2018-6-11 23:34 | 只看该作者
正在搞飞控,感谢楼主分享
回复

使用道具 举报

22#
swpswpswp 发表于 2018-9-26 08:41 | 只看该作者
非常感谢,最近刚好要搞接收机的程序,终于找到了
回复

使用道具 举报

23#
xsj1877578806 发表于 2018-10-12 00:38 来自手机 | 只看该作者
感谢楼主分享
回复

使用道具 举报

24#
869996391 发表于 2019-3-7 19:23 | 只看该作者
赞一个
回复

使用道具 举报

25#
869996391 发表于 2019-3-7 19:24 | 只看该作者
感想楼主分享呀
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机. 联系QQ:125739409;技术交流QQ群582644647

Powered by 单片机教程网

快速回复 返回顶部 返回列表