久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3271|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

mwc基于stm32四軸飛行器源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:320177 發(fā)表于 2018-5-2 03:55 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
基于stm32四軸飛行器源碼有c語(yǔ)言源碼,應(yīng)用keil5 即可得到最終結(jié)果

單片機(jī)源程序如下:
  1. /**********************************************************************************
  2. * 文件名  :incap.c
  3. * 描述    :四通道輸入捕獲

  4. * 實(shí)驗(yàn)平臺(tái):四軸飛行器STM3主控板
  5. * 庫(kù)版本  :ST3.5
  6. * 作者    :
  7. * 時(shí)間    :
  8. **********************************************************************************/        
  9. #include "PPM.h"

  10. //定時(shí)器5通道1輸入捕獲配置

  11. u8  TIM5CH1_CAPTURE_STA=0;        //通道1輸入捕獲狀態(tài)                                                   
  12. u16        TIM5CH1_CAPTURE_VAL;        //通道1輸入捕獲值

  13. u8  TIM5CH2_CAPTURE_STA=0;        //通道2輸入捕獲狀態(tài)                                                   
  14. u16        TIM5CH2_CAPTURE_VAL;        //通道2輸入捕獲值

  15. u8  TIM5CH3_CAPTURE_STA=0;        //通道3輸入捕獲狀態(tài)                                                   
  16. u16        TIM5CH3_CAPTURE_VAL;        //通道3輸入捕獲值

  17. u8  TIM5CH4_CAPTURE_STA=0;        //通道4輸入捕獲狀態(tài)                                                   
  18. u16        TIM5CH4_CAPTURE_VAL;        //通道4輸入捕獲值

  19. u32 tempup1=0;//捕獲總高電平的時(shí)間us單位
  20. u32 tempup2=0;//捕獲總高電平的時(shí)間us單位
  21. u32 tempup3=0;//捕獲總高電平的時(shí)間us單位
  22. u32 tempup4=0;//捕獲總高電平的時(shí)間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時(shí)鐘
  30.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA時(shí)鐘
  31.         
  32.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;  //PA0 清除之前設(shè)置  
  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.         //初始化定時(shí)器5 TIM5         
  38.         TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)定計(jì)數(shù)器自動(dòng)重裝值
  39.         TIM_TimeBaseStructure.TIM_Prescaler =psc;         //預(yù)分頻器   
  40.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
  41.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計(jì)數(shù)模式
  42.         TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位
  43.   
  44.         //初始化TIM5輸入捕獲參數(shù)
  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 );         //使能定時(shí)器5

  74. }

  75. void get_pulsewidth(void)                                         //計(jì)算捕獲的高電平時(shí)間
  76. {

  77. /*-------------------------------------------獲取通道1高電平-----------------------------------*/
  78.                         if(TIM5CH1_CAPTURE_STA&0X80)        //CH1 成功捕獲到了一次上升沿
  79.                     {
  80.                            tempup1=TIM5CH1_CAPTURE_STA&0X3F;
  81.                            tempup1*=65536;//溢出時(shí)間總和
  82.                            tempup1+=TIM5CH1_CAPTURE_VAL;//得到總的高電平時(shí)間

  83.                            pwmout1=tempup1/4;
  84.                         
  85.                            TIM5CH1_CAPTURE_STA=0;//開(kāi)啟下一次捕獲

  86. /*--------------------------------------pwm輸出限制-----------------------------------------*/
  87.         //                        if(pwmout1<250)        pwmout1=250;
  88.         //                        if(pwmout1>420)        pwmout1=420;                                                //油門(mén)限制
  89. /*---------------------------------------------------------------------------------------------*/
  90.                     }

  91. /*-------------------------------------------獲取通道2高電平-----------------------------------*/
  92.                         if(TIM5CH2_CAPTURE_STA&0X80)             //CH2成功捕獲到了一次上升沿
  93.                     {
  94.                            tempup2=TIM5CH2_CAPTURE_STA&0X3F;
  95.                            tempup2*=65536;//溢出時(shí)間總和
  96.                            tempup2+=TIM5CH2_CAPTURE_VAL;//得到總的高電平時(shí)間

  97.                            pwmout2=tempup2/4;
  98.                
  99.                            TIM5CH2_CAPTURE_STA=0;//開(kāi)啟下一次捕獲
  100.                     }
  101. /*-------------------------------------------獲取通道3高電平-----------------------------------*/
  102.                         if(TIM5CH3_CAPTURE_STA&0X80)          //CH3 成功捕獲到了一次上升沿
  103.                     {
  104.                         
  105.                            tempup3=TIM5CH3_CAPTURE_STA&0X3F;
  106.                            tempup3*=65536;//溢出時(shí)間總和
  107.                            tempup3+=TIM5CH3_CAPTURE_VAL;//得到總的高電平時(shí)間

  108.                            pwmout3=tempup3/4;
  109.                         
  110.                            TIM5CH3_CAPTURE_STA=0;//開(kāi)啟下一次捕獲
  111.                     }
  112. /*-------------------------------------------獲取通道4高電平-----------------------------------*/
  113.                         if(TIM5CH4_CAPTURE_STA&0X80)             //CH4 成功捕獲到了一次上升沿
  114.                     {                        
  115.                            tempup4=TIM5CH4_CAPTURE_STA&0X3F;
  116.                            tempup4*=65536;//溢出時(shí)間總和
  117.                            tempup4+=TIM5CH4_CAPTURE_VAL;//得到總的高電平時(shí)間
  118.                   
  119.                            pwmout4=tempup4/4;
  120.                         
  121.                            TIM5CH4_CAPTURE_STA=0;//開(kāi)啟下一次捕獲
  122.                     }        


  123. }

  124. //定時(shí)器5中斷服務(wù)程序         
  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)//已經(jīng)捕獲到高電平了
  134.                         {
  135.                                 
  136.                                 if((TIM5CH2_CAPTURE_STA&0X3F)==0X3F)//高電平太長(zhǎng)了
  137.                                 {
  138.                                         TIM5CH2_CAPTURE_STA|=0X80;//標(biāo)記成功捕獲了一次
  139.                                         TIM5CH2_CAPTURE_VAL=0XFFFF;
  140.                                 }
  141.                                 else TIM5CH2_CAPTURE_STA++;
  142.                         }         
  143.                 }
  144.                 if (TIM_GetITStatus(TIM5, TIM_IT_CC2) != RESET)//捕獲1發(fā)生捕獲事件
  145.                 {        
  146.                         if(TIM5CH2_CAPTURE_STA&0X40)                //捕獲到一個(gè)下降沿                 
  147.                         {                                 
  148.                                 TIM5CH2_CAPTURE_STA|=0X80;                //標(biāo)記成功捕獲到一次上升沿
  149.                                 TIM5CH2_CAPTURE_VAL=TIM_GetCapture2(TIM5);
  150.                                    TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 設(shè)置為上升沿捕獲
  151.                         }
  152.                         else                                                                  //還未開(kāi)始,第一次捕獲上升沿
  153.                         {
  154.                                 TIM5CH2_CAPTURE_STA=0;                        //清空
  155.                                 TIM5CH2_CAPTURE_VAL=0;
  156.                                  TIM_SetCounter(TIM5,0);
  157.                                 TIM5CH2_CAPTURE_STA|=0X40;                //標(biāo)記捕獲到了上升沿
  158.                                    TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Falling);                //CC1P=1 設(shè)置為下降沿捕獲
  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)//已經(jīng)捕獲到高電平了
  168.                         {
  169.                                 
  170.                                 if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高電平太長(zhǎng)了
  171.                                 {
  172.                                         TIM5CH1_CAPTURE_STA|=0X80;//標(biāo)記成功捕獲了一次
  173.                                         TIM5CH1_CAPTURE_VAL=0XFFFF;
  174.                                 }
  175.                                 else TIM5CH1_CAPTURE_STA++;
  176.                         }         
  177.                 }
  178.                 if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕獲1發(fā)生捕獲事件
  179.                 {        
  180.                         if(TIM5CH1_CAPTURE_STA&0X40)                //捕獲到一個(gè)下降沿                 
  181.                         {                                 
  182.                                 TIM5CH1_CAPTURE_STA|=0X80;                //標(biāo)記成功捕獲到一次上升沿
  183.                                 TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
  184.                                    TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 設(shè)置為上升沿捕獲
  185.                         }
  186.                         else                                                                  //還未開(kāi)始,第一次捕獲上升沿
  187.                         {
  188.                                 TIM5CH1_CAPTURE_STA=0;                        //清空
  189.                                 TIM5CH1_CAPTURE_VAL=0;
  190.                                  TIM_SetCounter(TIM5,0);
  191.                                 TIM5CH1_CAPTURE_STA|=0X40;                //標(biāo)記捕獲到了上升沿
  192.                                    TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);                //CC1P=1 設(shè)置為下降沿捕獲
  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)//已經(jīng)捕獲到高電平了
  203.                         {
  204.                                 
  205.                                 if((TIM5CH3_CAPTURE_STA&0X3F)==0X3F)//高電平太長(zhǎng)了
  206.                                 {
  207.                                         TIM5CH3_CAPTURE_STA|=0X80;//標(biāo)記成功捕獲了一次
  208.                                         TIM5CH3_CAPTURE_VAL=0XFFFF;
  209.                                 }
  210.                                 else TIM5CH3_CAPTURE_STA++;
  211.                         }         
  212.                 }
  213.                 if (TIM_GetITStatus(TIM5, TIM_IT_CC3) != RESET)//捕獲1發(fā)生捕獲事件
  214.                 {        
  215.                         if(TIM5CH3_CAPTURE_STA&0X40)                //捕獲到一個(gè)下降沿                 
  216.                         {                                 
  217.                                 TIM5CH3_CAPTURE_STA|=0X80;                //標(biāo)記成功捕獲到一次上升沿
  218.                                 TIM5CH3_CAPTURE_VAL=TIM_GetCapture3(TIM5);
  219.                                    TIM_OC3PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 設(shè)置為上升沿捕獲
  220.                         }else                                                                  //還未開(kāi)始,第一次捕獲上升沿
  221.                         {
  222.                                 TIM5CH3_CAPTURE_STA=0;                        //清空
  223.                                 TIM5CH3_CAPTURE_VAL=0;
  224.                                  TIM_SetCounter(TIM5,0);
  225.                                 TIM5CH3_CAPTURE_STA|=0X40;                //標(biāo)記捕獲到了上升沿
  226.                                    TIM_OC3PolarityConfig(TIM5,TIM_ICPolarity_Falling);                //CC1P=1 設(shè)置為下降沿捕獲
  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)//已經(jīng)捕獲到高電平了
  236.                         {
  237.                                 
  238.                                 if((TIM5CH4_CAPTURE_STA&0X3F)==0X3F)//高電平太長(zhǎng)了
  239.                                 {
  240.                                         TIM5CH4_CAPTURE_STA|=0X80;//標(biāo)記成功捕獲了一次
  241.                                         TIM5CH4_CAPTURE_VAL=0XFFFF;
  242.                                 }
  243.                                 else TIM5CH4_CAPTURE_STA++;
  244.                         }         
  245.                 }
  246.                 if (TIM_GetITStatus(TIM5, TIM_IT_CC4) != RESET)//捕獲1發(fā)生捕獲事件
  247.                 {        
  248.                         if(TIM5CH4_CAPTURE_STA&0X40)                //捕獲到一個(gè)下降沿                 
  249.                         {                                 
  250.                                 TIM5CH4_CAPTURE_STA|=0X80;                //標(biāo)記成功捕獲到一次上升沿
  251.                                 TIM5CH4_CAPTURE_VAL=TIM_GetCapture4(TIM5);
  252.                                    TIM_OC4PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 設(shè)置為上升沿捕獲
  253.                         }
  254.                         else                                                                  //還未開(kāi)始,第一次捕獲上升沿
  255. ……………………

  256. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:

mwc基于stm32的飛控代碼.7z

459.92 KB, 下載次數(shù): 17, 下載積分: 黑幣 -5

基于STM32的四軸飛行器設(shè)計(jì)最終代碼.7z

218.46 KB, 下載次數(shù): 37, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区二区在线播放 | 欧美九九九 | 欧美视频免费在线 | 日韩av一区二区在线观看 | 一区二区三区四区免费视频 | 亚洲免费大片 | 男女网站免费观看 | 激情小视频 | 欧美精品一区二区在线观看 | a在线观看免费 | 成人国产一区二区三区精品麻豆 | 国产精品欧美一区二区 | 国产精品欧美一区二区三区不卡 | 欧美午夜精品理论片a级按摩 | 精品一区在线免费观看 | 黄色大片毛片 | 日韩一区二区在线视频 | 亚洲免费视频播放 | 中文字幕在线播放第一页 | 亚洲欧美国产一区二区三区 | 中文字幕一区二区三区在线观看 | 国产中文字幕在线观看 | 色综合视频 | 国产中文字幕在线观看 | 国产三级一区二区三区 | 国产午夜久久久 | 久久久久一区二区三区 | 欧美成人a∨高清免费观看 欧美日韩中 | 久久伊| 日韩1区| 成人自拍av | 中文字幕乱码视频32 | 欧美综合在线视频 | 一级女毛片 | 国产成人精品一区二区三 | 久久精品99| 欧美日韩理论 | 欧美专区在线 | www.五月天婷婷.com | 亚洲最色视频 | 蜜月aⅴ国产精品 |