找回密码
 立即注册

QQ登录

只需一步,快速开始

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

mwc基于stm32四轴飞行器源码

[复制链接]
跳转到指定楼层
楼主
ID:320177 发表于 2018-5-2 03:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于stm32四轴飞行器源码有c语言源码,应用keil5 即可得到最终结果

单片机源程序如下:
  1. /**********************************************************************************
  2. * 文件名  :incap.c
  3. * 描述    :四通道输入捕获

  4. * 实验平台:四轴飞行器STM3主控板
  5. * 库版本  :ST3.5
  6. * 作者    :
  7. * 时间    :
  8. **********************************************************************************/        
  9. #include "PPM.h"

  10. //定时器5通道1输入捕获配置

  11. u8  TIM5CH1_CAPTURE_STA=0;        //通道1输入捕获状态                                                   
  12. u16        TIM5CH1_CAPTURE_VAL;        //通道1输入捕获值

  13. u8  TIM5CH2_CAPTURE_STA=0;        //通道2输入捕获状态                                                   
  14. u16        TIM5CH2_CAPTURE_VAL;        //通道2输入捕获值

  15. u8  TIM5CH3_CAPTURE_STA=0;        //通道3输入捕获状态                                                   
  16. u16        TIM5CH3_CAPTURE_VAL;        //通道3输入捕获值

  17. u8  TIM5CH4_CAPTURE_STA=0;        //通道4输入捕获状态                                                   
  18. u16        TIM5CH4_CAPTURE_VAL;        //通道4输入捕获值

  19. u32 tempup1=0;//捕获总高电平的时间us单位
  20. u32 tempup2=0;//捕获总高电平的时间us单位
  21. u32 tempup3=0;//捕获总高电平的时间us单位
  22. u32 tempup4=0;//捕获总高电平的时间us单位

  23. unsigned int pwmout1,pwmout2,pwmout3,pwmout4;                                 //输出占空比

  24. void TIM5_Cap_Init(u16 arr,u16 psc)
  25. {         
  26.         GPIO_InitTypeDef GPIO_InitStructure;
  27.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  28.         TIM_ICInitTypeDef  TIM5_ICInitStructure;

  29.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);        //使能TIM5时钟
  30.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟
  31.         
  32.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;  //PA0 清除之前设置  
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入  
  34.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  35.         GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);                                                
  36.         
  37.         //初始化定时器5 TIM5         
  38.         TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值
  39.         TIM_TimeBaseStructure.TIM_Prescaler =psc;         //预分频器   
  40.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
  41.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  42.         TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  43.   
  44.         //初始化TIM5输入捕获参数
  45.         TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01         选择输入端 IC1映射到TI1上
  46.           TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
  47.           TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
  48.           TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
  49.           TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
  50.           TIM_ICInit(TIM5, &TIM5_ICInitStructure);
  51.         
  52.         TIM5_ICInitStructure.TIM_Channel = TIM_Channel_2; //CC1S=01         选择输入端 IC1映射到TI1上
  53.           TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
  54.           TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
  55.           TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
  56.           TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
  57.           TIM_ICInit(TIM5, &TIM5_ICInitStructure);

  58.         TIM5_ICInitStructure.TIM_Channel = TIM_Channel_3; //CC1S=01         选择输入端 IC1映射到TI1上
  59.           TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
  60.           TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
  61.           TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
  62.           TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
  63.           TIM_ICInit(TIM5, &TIM5_ICInitStructure);

  64.         TIM5_ICInitStructure.TIM_Channel = TIM_Channel_4; //CC1S=01         选择输入端 IC1映射到TI1上
  65.           TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
  66.           TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
  67.           TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
  68.           TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
  69.           TIM_ICInit(TIM5, &TIM5_ICInitStructure);
  70.         
  71.         TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4,ENABLE);//允许更新中断 ,允许CC1IE捕获中断        
  72.         
  73.            TIM_Cmd(TIM5,ENABLE );         //使能定时器5

  74. }

  75. void get_pulsewidth(void)                                         //计算捕获的高电平时间
  76. {

  77. /*-------------------------------------------获取通道1高电平-----------------------------------*/
  78.                         if(TIM5CH1_CAPTURE_STA&0X80)        //CH1 成功捕获到了一次上升沿
  79.                     {
  80.                            tempup1=TIM5CH1_CAPTURE_STA&0X3F;
  81.                            tempup1*=65536;//溢出时间总和
  82.                            tempup1+=TIM5CH1_CAPTURE_VAL;//得到总的高电平时间

  83.                            pwmout1=tempup1/4;
  84.                         
  85.                            TIM5CH1_CAPTURE_STA=0;//开启下一次捕获

  86. /*--------------------------------------pwm输出限制-----------------------------------------*/
  87.         //                        if(pwmout1<250)        pwmout1=250;
  88.         //                        if(pwmout1>420)        pwmout1=420;                                                //油门限制
  89. /*---------------------------------------------------------------------------------------------*/
  90.                     }

  91. /*-------------------------------------------获取通道2高电平-----------------------------------*/
  92.                         if(TIM5CH2_CAPTURE_STA&0X80)             //CH2成功捕获到了一次上升沿
  93.                     {
  94.                            tempup2=TIM5CH2_CAPTURE_STA&0X3F;
  95.                            tempup2*=65536;//溢出时间总和
  96.                            tempup2+=TIM5CH2_CAPTURE_VAL;//得到总的高电平时间

  97.                            pwmout2=tempup2/4;
  98.                
  99.                            TIM5CH2_CAPTURE_STA=0;//开启下一次捕获
  100.                     }
  101. /*-------------------------------------------获取通道3高电平-----------------------------------*/
  102.                         if(TIM5CH3_CAPTURE_STA&0X80)          //CH3 成功捕获到了一次上升沿
  103.                     {
  104.                         
  105.                            tempup3=TIM5CH3_CAPTURE_STA&0X3F;
  106.                            tempup3*=65536;//溢出时间总和
  107.                            tempup3+=TIM5CH3_CAPTURE_VAL;//得到总的高电平时间

  108.                            pwmout3=tempup3/4;
  109.                         
  110.                            TIM5CH3_CAPTURE_STA=0;//开启下一次捕获
  111.                     }
  112. /*-------------------------------------------获取通道4高电平-----------------------------------*/
  113.                         if(TIM5CH4_CAPTURE_STA&0X80)             //CH4 成功捕获到了一次上升沿
  114.                     {                        
  115.                            tempup4=TIM5CH4_CAPTURE_STA&0X3F;
  116.                            tempup4*=65536;//溢出时间总和
  117.                            tempup4+=TIM5CH4_CAPTURE_VAL;//得到总的高电平时间
  118.                   
  119.                            pwmout4=tempup4/4;
  120.                         
  121.                            TIM5CH4_CAPTURE_STA=0;//开启下一次捕获
  122.                     }        


  123. }

  124. //定时器5中断服务程序         
  125. void TIM5_IRQHandler(void)
  126. {
  127.    /*                                                                  */
  128.          if((TIM5CH2_CAPTURE_STA&0X80)==0)//CH2还未成功捕获        
  129.         {         
  130.                 if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
  131.                  
  132.                 {            
  133.                         if(TIM5CH2_CAPTURE_STA&0X40)//已经捕获到高电平了
  134.                         {
  135.                                 
  136.                                 if((TIM5CH2_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
  137.                                 {
  138.                                         TIM5CH2_CAPTURE_STA|=0X80;//标记成功捕获了一次
  139.                                         TIM5CH2_CAPTURE_VAL=0XFFFF;
  140.                                 }
  141.                                 else TIM5CH2_CAPTURE_STA++;
  142.                         }         
  143.                 }
  144.                 if (TIM_GetITStatus(TIM5, TIM_IT_CC2) != RESET)//捕获1发生捕获事件
  145.                 {        
  146.                         if(TIM5CH2_CAPTURE_STA&0X40)                //捕获到一个下降沿                 
  147.                         {                                 
  148.                                 TIM5CH2_CAPTURE_STA|=0X80;                //标记成功捕获到一次上升沿
  149.                                 TIM5CH2_CAPTURE_VAL=TIM_GetCapture2(TIM5);
  150.                                    TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
  151.                         }
  152.                         else                                                                  //还未开始,第一次捕获上升沿
  153.                         {
  154.                                 TIM5CH2_CAPTURE_STA=0;                        //清空
  155.                                 TIM5CH2_CAPTURE_VAL=0;
  156.                                  TIM_SetCounter(TIM5,0);
  157.                                 TIM5CH2_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
  158.                                    TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
  159.                         }                    
  160.                 }                                                                                    
  161.          }
  162.          if((TIM5CH1_CAPTURE_STA&0X80)==0)//CH1 还未成功捕获        
  163.         {         
  164.                 if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
  165.                  
  166.                 {            
  167.                         if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
  168.                         {
  169.                                 
  170.                                 if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
  171.                                 {
  172.                                         TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
  173.                                         TIM5CH1_CAPTURE_VAL=0XFFFF;
  174.                                 }
  175.                                 else TIM5CH1_CAPTURE_STA++;
  176.                         }         
  177.                 }
  178.                 if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
  179.                 {        
  180.                         if(TIM5CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿                 
  181.                         {                                 
  182.                                 TIM5CH1_CAPTURE_STA|=0X80;                //标记成功捕获到一次上升沿
  183.                                 TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
  184.                                    TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
  185.                         }
  186.                         else                                                                  //还未开始,第一次捕获上升沿
  187.                         {
  188.                                 TIM5CH1_CAPTURE_STA=0;                        //清空
  189.                                 TIM5CH1_CAPTURE_VAL=0;
  190.                                  TIM_SetCounter(TIM5,0);
  191.                                 TIM5CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
  192.                                    TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
  193.                         }                    
  194.                         }                                                                                    
  195.          }
  196.                                                                           


  197.          if((TIM5CH3_CAPTURE_STA&0X80)==0)//CH3还未成功捕获        
  198.         {         
  199.                 if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
  200.                  
  201.                 {            
  202.                         if(TIM5CH3_CAPTURE_STA&0X40)//已经捕获到高电平了
  203.                         {
  204.                                 
  205.                                 if((TIM5CH3_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
  206.                                 {
  207.                                         TIM5CH3_CAPTURE_STA|=0X80;//标记成功捕获了一次
  208.                                         TIM5CH3_CAPTURE_VAL=0XFFFF;
  209.                                 }
  210.                                 else TIM5CH3_CAPTURE_STA++;
  211.                         }         
  212.                 }
  213.                 if (TIM_GetITStatus(TIM5, TIM_IT_CC3) != RESET)//捕获1发生捕获事件
  214.                 {        
  215.                         if(TIM5CH3_CAPTURE_STA&0X40)                //捕获到一个下降沿                 
  216.                         {                                 
  217.                                 TIM5CH3_CAPTURE_STA|=0X80;                //标记成功捕获到一次上升沿
  218.                                 TIM5CH3_CAPTURE_VAL=TIM_GetCapture3(TIM5);
  219.                                    TIM_OC3PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
  220.                         }else                                                                  //还未开始,第一次捕获上升沿
  221.                         {
  222.                                 TIM5CH3_CAPTURE_STA=0;                        //清空
  223.                                 TIM5CH3_CAPTURE_VAL=0;
  224.                                  TIM_SetCounter(TIM5,0);
  225.                                 TIM5CH3_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
  226.                                    TIM_OC3PolarityConfig(TIM5,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
  227.                         }                    
  228.                         }                                                                                    
  229.          }


  230.          if((TIM5CH4_CAPTURE_STA&0X80)==0)//CH4 还未成功捕获        
  231.         {         
  232.                 if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
  233.                  
  234.                 {            
  235.                         if(TIM5CH4_CAPTURE_STA&0X40)//已经捕获到高电平了
  236.                         {
  237.                                 
  238.                                 if((TIM5CH4_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
  239.                                 {
  240.                                         TIM5CH4_CAPTURE_STA|=0X80;//标记成功捕获了一次
  241.                                         TIM5CH4_CAPTURE_VAL=0XFFFF;
  242.                                 }
  243.                                 else TIM5CH4_CAPTURE_STA++;
  244.                         }         
  245.                 }
  246.                 if (TIM_GetITStatus(TIM5, TIM_IT_CC4) != RESET)//捕获1发生捕获事件
  247.                 {        
  248.                         if(TIM5CH4_CAPTURE_STA&0X40)                //捕获到一个下降沿                 
  249.                         {                                 
  250.                                 TIM5CH4_CAPTURE_STA|=0X80;                //标记成功捕获到一次上升沿
  251.                                 TIM5CH4_CAPTURE_VAL=TIM_GetCapture4(TIM5);
  252.                                    TIM_OC4PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
  253.                         }
  254.                         else                                                                  //还未开始,第一次捕获上升沿
  255. ……………………

  256. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:

mwc基于stm32的飞控代码.7z

459.92 KB, 下载次数: 17, 下载积分: 黑币 -5

基于STM32的四轴飞行器设计最终代码.7z

218.46 KB, 下载次数: 37, 下载积分: 黑币 -5

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

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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