欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10759|回復: 7
打印 上一主題 下一主題
收起左側

STC15W401AS-實現四軸飛行器無刷電機的電調控制-參考程序和電路

  [復制鏈接]
跳轉到指定樓層
樓主
STC15W401AS-實現四軸飛行器無刷電機的電調控制電路原理圖如下:


單片機源程序如下:

  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU International Limited ----------------------------------*/
  3. /* --- STC 1T Series MCU Demo Programme -------------------------------*/
  4. /* --- QQ:  800003751 -------------------------------------------------*/
  5. /* 如果要在程序中使用此代碼,請在程序中注明使用了宏晶科技的資料及程序   */
  6. /*---------------------------------------------------------------------*/


  7. /*************        功能說明        **************

  8. 本程序試驗使用STC15W401AS-35I-SOP16<RMB1.6>來驅動航模用的無傳感器無刷三相直流馬達.

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

  10. 電路圖見文件 "BLDC-V10-實驗電路.pdf".

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

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

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

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

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

  16. ******************************************/




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

  18. #include "STC15Fxxxx.H"

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



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

  29. //CMPCR2
  30. #define        INVCMPO        0x80        //1: 比較器輸出取反,  0: 不取反
  31. #define        DISFLT        0x40        //1: 關閉0.1uF濾波,   0: 允許
  32. #define        LCDTY        0x00        //0~63, 比較結果變化延時周期數

  33. #if        (MCU_PIN == 20)
  34.         sbit PWM2_L = P3^4;
  35.         sbit PWM1_L = P3^5;
  36.         sbit PWM0_L = P3^6;
  37. #endif

  38. #if        (MCU_PIN == 16)
  39.         sbit PWM2_L = P5^5;
  40.         sbit PWM1_L = P3^3;
  41.         sbit PWM0_L = P3^6;
  42. #endif

  43. u8        Step;
  44. u8        PWM_Value; // 決定PWM占空比的值
  45. u16        RxPulseWide;
  46. bit        B_RxOk;
  47. bit        B_RUN;
  48. u8        PWW_Set;
  49. u8        cnt10ms;
  50. u8        Rx_cnt;
  51. u8        TimeOut;        //堵轉超時

  52. #define DISABLE_CMP_INT CMPCR1 &= ~0X40                // 關閉比較器中斷
  53. #define ENABLE_CMP_INT  CMPCR1 |= 0X40                // 打開比較器中斷

  54. /*************************/

  55. void        Delay_n_ms(u8 dly)
  56. {
  57.         u16        j;
  58.         do
  59.         {
  60.                 j = MAIN_Fosc / 13000;        //延時1ms, 主程序在此節拍下運行
  61.                 while(--j)        ;
  62.         }while(--dly);
  63. }


  64. void delay_us(u8 us)
  65. {
  66.         do
  67.         {
  68.                 NOP(20);        //@24MHz
  69.         }
  70.         while(--us);
  71. }

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



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

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

  162. void ADC_Init(void)
  163. {
  164.         P1n_pure_input(0x38);
  165.         P1ASF = 0X38; // 開通P1.3 P1.4 P1.5的AD輸入口
  166. }

  167. void CMP_INT(void) interrupt 21
  168. {
  169.         CMPCR1 &= ~0X40; // 需軟件清除中斷標志位
  170.         if(Step<5)        Step++;
  171.         else                Step = 0;
  172.         StepXL();
  173.         TimeOut = 10;        //10ms超時
  174. }

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

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

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

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

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

  217. /********************* INT0中斷函數 *************************/
  218. void INT0_int (void) interrupt INT0_VECTOR
  219. {
  220.         u16        j;
  221.        
  222.         TR0 = 0;
  223.         j = ((u16)TH0 << 8) + TL0;
  224.         TH0 = 0;
  225.         TL0 = 0;
  226.         TR0 = 1;

  227.         if(++Rx_cnt >= 5)        Rx_cnt = 5;
  228.         j >>= 1;        //為了好處理, 轉成單位為us
  229.         if((j >= 800) && (j <= 2000) && (Rx_cnt == 5))
  230.         {
  231.                 RxPulseWide = j;
  232.                 B_RxOk = 1;                //標志收到一個脈沖
  233.         }

  234. }


  235. /**********************************************/
  236. void main(void)
  237. {
  238.         u16 j;

  239.         PWM_Init();
  240.         ADC_Init();
  241.         CMP_Init();
  242.         T0_Iint();

  243.         IE0 = 0;        // 清除外中斷0標志位
  244.         EX0 = 1;        // INT0 Enable
  245.         IT0 = 1;        //INT0 下降沿中斷
  246.        
  247.         RxPulseWide = 1000;
  248.         PWW_Set = 0;
  249.         cnt10ms = 0;
  250.         Rx_cnt  = 0;
  251.         TimeOut = 0;

  252.         EA  = 1; // 打開總中斷
  253.        
  254.         while (1)
  255.         {
  256.                 Delay_n_ms(1);        //延時1ms, 主程序在此節拍下運行

  257.                 if(TimeOut > 0)
  258.                 {
  259.                         if(--TimeOut == 0)        //堵轉超時
  260.                         {
  261.                                 CCAP0H=0;        CCAP1H=0;        CCAP2H=0;  // 占空比為0
  262.                                 PWM0_L=0;        PWM1_L=0;        PWM2_L=0;
  263.                                 DISABLE_CMP_INT; // 關比較器中斷
  264.                                 Delay_n_ms(250);        //堵轉時,延時1秒再啟動
  265.                                 Delay_n_ms(250);
  266.                                 Delay_n_ms(250);
  267.                                 Delay_n_ms(250);

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

所有資料51hei提供下載:
STC15W401AS-實現四軸飛行器無刷電機的電調控制-參考程序和電路.zip (161.85 KB, 下載次數: 247)


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

使用道具 舉報

沙發
ID:56665 發表于 2019-9-2 19:27 | 只看該作者
我怎么沒有看到哪里有過流檢測。
回復

使用道具 舉報

板凳
ID:639666 發表于 2021-2-11 10:48 | 只看該作者
本電路和程序沒過流保護,要用到大功率P溝場管,限制了高電源電壓的應用,在15伏左右的電源電壓下玩玩是可以的。食之無味,棄之可惜。
回復

使用道具 舉報

地板
ID:671687 發表于 2021-3-30 12:44 | 只看該作者
問個問題,樓主P13 P14 P15 P54是干嘛用的 ,可以省嗎?
回復

使用道具 舉報

5#
ID:73327 發表于 2021-8-26 22:37 | 只看該作者
感謝樓主分享!學習學習啦!
回復

使用道具 舉報

6#
ID:73327 發表于 2021-8-26 22:38 | 只看該作者
stc8a864a12 發表于 2021-3-30 12:44
問個問題,樓主P13 P14 P15 P54是干嘛用的 ,可以省嗎?

不可以省,過零點檢測用的!
回復

使用道具 舉報

7#
無效樓層,該帖已經被刪除
8#
無效樓層,該帖已經被刪除
9#
ID:1014955 發表于 2022-4-1 17:07 | 只看該作者
可以做普通單相電機嗎?4極矽鋼片,普通散熱風扇。有做過程序嗎?
回復

使用道具 舉報

10#
ID:378732 發表于 2022-4-3 16:55 | 只看該作者
這不是STC官網的例程嗎
回復

使用道具 舉報

11#
無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表