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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

新手入手carzepony四軸飛行器,有點(diǎn)沒頭緒,求大神指導(dǎo)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
如題
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:282850 發(fā)表于 2019-9-13 09:40 | 只看該作者
多想想有就頭緒了,我做2.4G搖控就是這樣的。
回復(fù)

使用道具 舉報(bào)

板凳
ID:155507 發(fā)表于 2019-9-14 07:15 | 只看該作者
我給你來個驅(qū)動航模用的無傳感器無刷三相直流馬達(dá)程序



  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU International Limited ----------------------------------*/
  3. /* --- STC 1T Series MCU Demo Programme -------------------------------*/
  4. /* --- Mobile: 13922805190 --------------------------------------------*/
  5. /* --- Fax: 0513-55012956,55012947,55012969 ---------------------------*/
  6. /* --- Tel: 0513-55012928,55012929,55012966 ---------------------------*/
  7. /* --- Web: www.GXWMCU.com   www.stcmcu.com ---------------------------*/
  8. /* --- QQ:  800003751 -------------------------------------------------*/
  9. /* 如果要在程序中使用此代碼,請?jiān)诔绦蛑凶⒚魇褂昧撕昃Э萍嫉馁Y料及程序   */
  10. /*---------------------------------------------------------------------*/


  11. /*************        功能說明        **************

  12. 本程序試驗(yàn)使用STC15W401AS-35I-SOP16<RMB1.6>來驅(qū)動航模用的無傳感器無刷三相直流馬達(dá).

  13. 本程序參考自網(wǎng)上的代碼(作者: 瑞生), 改良而來.

  14. 電路圖見文件 "BLDC-V10-實(shí)驗(yàn)電路.pdf".

  15. 控制信號由P3.2輸入正脈沖信號, 間隔5~20ms, 脈沖寬度1.000~1.610ms.

  16. 1.160ms開始啟動, 1.610ms為最高速度, 分辨率為2us.

  17. 本程序僅僅是簡單控制, 軟件沒有處理 過0延時30度切換 過流檢測.

  18. 由于過0檢測部分有RC濾波, 所以改變電容值可以大約的對應(yīng)在最高速時延時30度的時間.

  19. 有意者可自行完善電路和程序.

  20. ******************************************/




  21. #define MAIN_Fosc                24000000L        //定義主時鐘

  22. #include "STC15Fxxxx.H"

  23. #define                MCU_PIN                16        /* 選擇MCU引腳數(shù), 只支持16或20腳(28腳或32腳跟20腳一樣) */



  24. //CMPCR1
  25. #define        CMPEN        0x80        //1: 允許比較器, 0: 禁止,關(guān)閉比較器電源
  26. #define        CMPIF        0x40        //比較器中斷標(biāo)志, 包括上升沿或下降沿中斷, 軟件清0
  27. #define        PIE                0x20        //1: 比較結(jié)果由0變1, 產(chǎn)生上升沿中斷
  28. #define        NIE                0x10        //1: 比較結(jié)果由1變0, 產(chǎn)生下降沿中斷
  29. #define        PIS                0x08        //輸入正極性選擇, 0: 選擇外部P5.5做正輸入,           1: 由ADCIS[2:0]所選擇的ADC輸入端做正輸入.
  30. #define        NIS                0x04        //輸入負(fù)極性選擇, 0: 選擇內(nèi)部BandGap電壓BGv做負(fù)輸入, 1: 選擇外部P5.4做輸入.
  31. #define        CMPOE        0x02        //1: 允許比較結(jié)果輸出到P1.2, 0: 禁止.
  32. #define        CMPRES        0x01        //比較結(jié)果, 1: CMP+電平高于CMP-,  0: CMP+電平低于CMP-,  只讀

  33. //CMPCR2
  34. #define        INVCMPO        0x80        //1: 比較器輸出取反,  0: 不取反
  35. #define        DISFLT        0x40        //1: 關(guān)閉0.1uF濾波,   0: 允許
  36. #define        LCDTY        0x00        //0~63, 比較結(jié)果變化延時周期數(shù)

  37. #if        (MCU_PIN == 20)
  38.         sbit PWM2_L = P3^4;
  39.         sbit PWM1_L = P3^5;
  40.         sbit PWM0_L = P3^6;
  41. #endif

  42. #if        (MCU_PIN == 16)
  43.         sbit PWM2_L = P5^5;
  44.         sbit PWM1_L = P3^3;
  45.         sbit PWM0_L = P3^6;
  46. #endif

  47. u8        Step;
  48. u8        PWM_Value; // 決定PWM占空比的值
  49. u16        RxPulseWide;
  50. bit        B_RxOk;
  51. bit        B_RUN;
  52. u8        PWW_Set;
  53. u8        cnt10ms;
  54. u8        Rx_cnt;
  55. u8        TimeOut;        //堵轉(zhuǎn)超時

  56. #define DISABLE_CMP_INT CMPCR1 &= ~0X40                // 關(guān)閉比較器中斷
  57. #define ENABLE_CMP_INT  CMPCR1 |= 0X40                // 打開比較器中斷

  58. /*************************/

  59. void        Delay_n_ms(u8 dly)
  60. {
  61.         u16        j;
  62.         do
  63.         {
  64.                 j = MAIN_Fosc / 13000;        //延時1ms, 主程序在此節(jié)拍下運(yùn)行
  65.                 while(--j)        ;
  66.         }while(--dly);
  67. }


  68. void delay_us(u8 us)
  69. {
  70.         do
  71.         {
  72.                 NOP(20);        //@24MHz
  73.         }
  74.         while(--us);
  75. }

  76. void StepXL(void) // 換相序列函數(shù)
  77. {
  78. switch(Step)
  79.   {
  80.    case 0:  // AB
  81.                         PWM0_L=0;        PWM2_L=0;
  82.                         CCAP0H = PWM_Value;        CCAP1H=0;        CCAP2H=0;        // 打開A相的高端
  83.                         PWM1_L = 1;                 // 打開B相的低端
  84.                         ADC_CONTR = 0XED;        // 選擇P1.5作為ADC輸入 即c相電壓
  85.                         CMPCR1 = 0x9C;                //bit7=1 允許比較器, bit4=1 比較結(jié)果由1變0, 產(chǎn)生下降沿中斷 (不能響應(yīng)下降沿中斷?)
  86.                         break;
  87.    case 1:  // AC
  88.                         PWM0_L=0;        PWM1_L=0;
  89.                         CCAP0H = PWM_Value;        CCAP1H=0;        CCAP2H=0;        // 打開A相的高端
  90.                         PWM2_L = 1;                        // 打開C相的低端
  91.                         ADC_CONTR = 0XEC;        // 選擇P1.4作為ADC輸入 即B相電壓
  92.                         CMPCR1 = 0xAC;                //上升沿中斷
  93.          
  94.       break;
  95.    case 2:  // BC
  96.                         PWM0_L=0;        PWM1_L=0;
  97.                         CCAP0H=0;        CCAP2H=0;        CCAP1H = PWM_Value; // 打開B相的高端
  98.                         PWM2_L = 1;                        // 打開C相的低端
  99.                         ADC_CONTR = 0XEB;        // 選擇P1.3作為ADC輸入 即a相電壓
  100.                         CMPCR1 = 0x9C;                //下降沿中斷
  101.       break;
  102.    case 3:  // BA
  103.                         PWM1_L=0;        PWM2_L=0;
  104.                         CCAP0H=0;        CCAP2H=0;        CCAP1H = PWM_Value; // 打開B相的高端
  105.                         PWM0_L = 1;                        // 打開A相的低端
  106.                         ADC_CONTR = 0XED;        // 選擇P1.5作為ADC輸入 即c相電壓
  107.                         CMPCR1 = 0xAC;                //上升沿中斷
  108.                        
  109.       break;
  110.    case 4: // CA
  111.                         PWM1_L=0;        PWM2_L=0;
  112.                         CCAP0H=0;        CCAP1H=0;        CCAP2H = PWM_Value; // 打開C相的高端
  113.                         PWM0_L = 1;                        // 打開A相的低端
  114.                         ADC_CONTR = 0XEC;        // 選擇P1.4作為ADC輸入 即B相電壓
  115.                         CMPCR1 = 0x9C;                //下降沿中斷
  116.       break;
  117.    case 5: // CB
  118.                       PWM0_L=0;        PWM2_L=0;
  119.                         CCAP0H=0;        CCAP1H=0;        CCAP2H = PWM_Value;// 打開C相的高端
  120.                       PWM1_L = 1;                        // 打開B相的低端
  121.                         ADC_CONTR = 0XEB;        // 選擇P1.3作為ADC輸入 即a相電壓
  122.                         CMPCR1 = 0xAC;                //上升沿中斷
  123.          
  124.                 break;
  125.          
  126.         default:
  127.                 break;
  128.   }       
  129. }



  130. void PWM_Init(void)
  131. {
  132.         PWM0_L = 0;
  133.         PWM1_L = 0;
  134.         PWM2_L = 0;
  135.        
  136. #if        (MCU_PIN == 20)
  137.         P3n_push_pull(0x70);
  138. #endif
  139. #if        (MCU_PIN == 16)
  140.         P3n_push_pull(0x48);
  141.         P5n_push_pull(0x20);
  142. #endif

  143. //        CMOD = 1 << 1; //選擇系統(tǒng)時鐘/2為時鐘源,即PWM頻率=24M/2/256=46.9K
  144.         CMOD = 5 << 1; //選擇系統(tǒng)時鐘/4為時鐘源,即PWM頻率=24M/4/256=23.4K
  145. //        CMOD = 6 << 1; //選擇系統(tǒng)時鐘/6為時鐘源,即PWM頻率=24M/6/256=15.6K
  146.         CL=0;                        // PCA計(jì)數(shù)器清零
  147.         CH=0;
  148.        
  149.         PCA_PWM0 = 0X00;
  150.         CCAP0H=0;    // 初始化占空比為0% H的值裝載到L中
  151.         CCAP0L=0;
  152.         CCAPM0=0x42;        // 設(shè)置為PWM模式
  153.        
  154.         PCA_PWM1 = 0X00;
  155.         CCAP1H=0;    // 初始化占空比為0%
  156.         CCAP1L=0;
  157.         CCAPM1=0x42;        // 設(shè)置為PWM模式
  158.        
  159.         PCA_PWM2 = 0X00;
  160.         CCAP2H=0;    // 初始化占空比為0%
  161.         CCAP2L=0;
  162.         CCAPM2=0x42;        // 設(shè)置為PWM模式
  163.        
  164.         CR = 1;
  165. }

  166. void ADC_Init(void)
  167. {
  168.         P1n_pure_input(0x38);
  169.         P1ASF = 0X38; // 開通P1.3 P1.4 P1.5的AD輸入口
  170. }

  171. void CMP_INT(void) interrupt 21
  172. {
  173.         CMPCR1 &= ~0X40; // 需軟件清除中斷標(biāo)志位
  174.         if(Step<5)        Step++;
  175.         else                Step = 0;
  176.         StepXL();
  177.         TimeOut = 10;        //10ms超時
  178. }

  179. void CMP_Init(void)
  180. {
  181.         CMPCR1 = 0X8C;        // 1000 1100 打開比較器,P5.4作為比較器的反相輸入端,ADC引腳作為正輸入端
  182.         CMPCR2 = 60;        // 60個時鐘濾波
  183.         P5n_pure_input(0x10);
  184. }

  185. u8 StartMotor(void)
  186. {
  187.         u16 timer,i;
  188.         DISABLE_CMP_INT;        // 禁止比較器中斷
  189.         PWM_Value = 30;                // 初始占空比=16/256=6%
  190.         Step = 0;
  191.         StepXL();                        // 初始位置
  192.         Delay_n_ms(5);//delay_ms(5);
  193.         timer = 300;

  194.         while(1)
  195.         {
  196.                 for(i=0; i<timer; i++)        delay_us(50);  //
  197.                 timer -= timer /15 + 1;
  198.                 if(timer < 25)        return(1);
  199.                 if( Step < 5)        Step++;
  200.                 else                        Step = 0;
  201.                 StepXL();
  202.         }
  203. }

  204. void T0_Iint(void)
  205. {
  206.         Timer0_AsTimer();        /* 時器0用做定時器        */
  207.         Timer0_12T();                /* Timer0 clodk = fo/12        12分頻,        default        */
  208.         Timer0_16bit();
  209.         Timer0_Gate_INT0_P32();        /* 時器0由外部INT0高電平允許定時計(jì)數(shù) */
  210.         TH0 = 0;
  211.         TL0 = 0;
  212.         TR0 = 1; // 打開定時器0
  213.         ET0 = 1;// 允許ET0中斷
  214. }

  215. void T0_Interrupt(void) interrupt 1
  216. {
  217.         Rx_cnt = 0;                        //一旦出現(xiàn)溢出, 則開始的n個脈沖無效
  218.         RxPulseWide = 1000;        //停止
  219.         B_RxOk = 1;                        //虛擬收到一個脈沖
  220. }

  221. /********************* INT0中斷函數(shù) *************************/
  222. void INT0_int (void) interrupt INT0_VECTOR
  223. {
  224.         u16        j;
  225.        
  226.         TR0 = 0;
  227.         j = ((u16)TH0 << 8) + TL0;
  228.         TH0 = 0;
  229.         TL0 = 0;
  230.         TR0 = 1;

  231.         if(++Rx_cnt >= 5)        Rx_cnt = 5;
  232.         j >>= 1;        //為了好處理, 轉(zhuǎn)成單位為us
  233.         if((j >= 800) && (j <= 2000) && (Rx_cnt == 5))
  234.         {
  235.                 RxPulseWide = j;
  236.                 B_RxOk = 1;                //標(biāo)志收到一個脈沖
  237.         }

  238. }


  239. /**********************************************/
  240. void main(void)
  241. {
  242.         u16 j;

  243.         PWM_Init();
  244.         ADC_Init();
  245.         CMP_Init();
  246.         T0_Iint();

  247.         IE0 = 0;        // 清除外中斷0標(biāo)志位
  248.         EX0 = 1;        // INT0 Enable
  249.         IT0 = 1;        //INT0 下降沿中斷
  250.        
  251.         RxPulseWide = 1000;
  252.         PWW_Set = 0;
  253.         cnt10ms = 0;
  254.         Rx_cnt  = 0;
  255.         TimeOut = 0;

  256.         EA  = 1; // 打開總中斷
  257.        
  258.         while (1)
  259.         {
  260.                 Delay_n_ms(1);        //延時1ms, 主程序在此節(jié)拍下運(yùn)行

  261.                 if(TimeOut > 0)
  262.                 {
  263.                         if(--TimeOut == 0)        //堵轉(zhuǎn)超時
  264.                         {
  265.                                 CCAP0H=0;        CCAP1H=0;        CCAP2H=0;  // 占空比為0
  266.                                 PWM0_L=0;        PWM1_L=0;        PWM2_L=0;
  267.                                 DISABLE_CMP_INT; // 關(guān)比較器中斷
  268.                                 Delay_n_ms(250);        //堵轉(zhuǎn)時,延時1秒再啟動
  269.                                 Delay_n_ms(250);
  270.                                 Delay_n_ms(250);
  271.                                 Delay_n_ms(250);

  272.                                 RxPulseWide = 1000;
  273.                                 PWW_Set   = 0;
  274.                                 PWM_Value = 0;
  275.                                 B_RxOk = 0;
  276.                                 B_RUN  = 0;
  277.                                 Rx_cnt = 0;
  278.                                 TimeOut = 0;
  279.                         }
  280.                 }
  281.                
  282.                 if(B_RxOk)        //收到一個脈沖
  283.                 {
  284.                         B_RxOk = 0;
  285.                         j = RxPulseWide;
  286.                         if(j >= 1100)                                // 1100~1610對應(yīng)PWM占空比值0~255
  287.                         {
  288.                                 j = (j - 1100) >> 1;        //2us對應(yīng)PWM一個步進(jìn)
  289.                                 if(j > 256)        j = 255;
  290.                         }
  291.                         else        j = 0;
  292.                         PWW_Set = (u8)j;
  293.                 }
  294.                
  295.                 if(!B_RUN && (PWW_Set >= 30))                // PWM_Set >= 30, 并且馬達(dá)未運(yùn)行, 則啟動馬達(dá)
  296.                 {
  297.                         StartMotor();        // 啟動馬達(dá)
  298.                         CMPCR1 &= ~0X40; // 需軟件清除中斷標(biāo)志位
  299.                         ENABLE_CMP_INT; // 打開比較器中斷
  300.                         B_RUN = 1;
  301.                         TimeOut = 0;
  302.                 }
  303.                
  304.                
  305.                 if(++cnt10ms >= 10)                // 10ms時隙
  306.                 {
  307.                         cnt10ms = 0;
  308.                         if(B_RUN)
  309.                         {
  310.                                 if(PWM_Value < PWW_Set)        PWM_Value++;
  311.                                 if(PWM_Value > PWW_Set)        PWM_Value--;
  312.                                 if(PWM_Value < 20)        // 停轉(zhuǎn)
  313.                                 {
  314.                                         PWM_Value = 0;
  315.                                         B_RUN = 0;
  316.                                         CCAP0H=0;        CCAP1H=0;        CCAP2H=0;  // 占空比為0
  317.                                         PWM0_L=0;        PWM1_L=0;        PWM2_L=0;
  318.                                         DISABLE_CMP_INT; // 關(guān)比較器中斷
  319.                                 }
  320.                         }
  321.                 }
  322.        
  323.         }
  324. }



復(fù)制代碼





STC15W401AS-實(shí)現(xiàn)四軸飛行器無刷電機(jī)的電調(diào)控制-參考程序和電路 (2).ZIP

161.85 KB, 下載次數(shù): 3

回復(fù)

使用道具 舉報(bào)

地板
ID:155507 發(fā)表于 2019-9-14 07:37 | 只看該作者
你可以試試這個

DIY四軸飛行器如何入門?
www點(diǎn)crazepony點(diǎn)com/2014/07/31/diy-quadcopter.html
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: av黄色在线 | 天天久久 | 国产高清视频在线观看 | 亚洲综合久久精品 | 一区二区三区日本 | 色www精品视频在线观看 | 成人h动漫精品一区二区器材 | 99热精品在线观看 | 国产在线精品一区二区 | 国产综合久久久久久鬼色 | 毛片链接| 中文字幕第7页 | 亚洲一区中文字幕 | 在线免费观看色 | 日韩中文字幕 | 91福利网 | 三级国产三级在线 | 国产电影一区二区在线观看 | 在线播放一区二区三区 | 成人免费在线播放 | 一区二区三区在线观看免费视频 | www狠狠干 | 欧美精品导航 | 一区二区三区久久 | 日韩在线看片 | 亚洲精品福利视频 | 一级高清视频 | 久久久久久久久久久成人 | 久久亚洲91| 在线免费观看欧美 | 人人看人人爽 | 国产亚洲网站 | 色婷婷综合久久久中字幕精品久久 | 操久久 | 在线色网| 九九热九九 | www.天天操 | 国产精品中文在线 | 婷婷成人在线 | 久久国产精品网站 | 毛片毛片毛片毛片毛片 |