亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標題: 帶位置感應器的直流無刷電機PMW控制仿真和單片機源碼 [打印本頁]

作者: 624779398    時間: 2017-11-13 20:18
標題: 帶位置感應器的直流無刷電機PMW控制仿真和單片機源碼
說明: 本例用PIC單片機控制帶感應器的直流無刷電機,通過調(diào)節(jié)RA0端口的可變電阻器可實現(xiàn)電機調(diào)速控制.由于當前版本PROTEUS不支持換向功能,連接RA1端口的SW1尚不能控制無刷電機的運行方向.

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)



單片機源程序如下:

  1. //-----------------------------------------------------------------
  2. //  名稱: 帶位置感應器的直流無刷電機PMW控制仿真
  3. //-----------------------------------------------------------------
  4. //  說明: 本例用PIC單片機控制帶感應器的直流無刷電機,通過調(diào)節(jié)RA0端口的
  5. //       可變電阻器可實現(xiàn)電機調(diào)速控制.
  6. //       由于當前版本PROTEUS不支持換向功能,連接RA1端口的SW1尚不能控制
  7. //       無刷電機的運行方向.
  8. //  
  9. //-----------------------------------------------------------------
  10. #include <xc.h>
  11. #define INT8U  unsigned char
  12. #define INT16U unsigned int
  13. #define _XTAL_FREQ 20000000UL           //20MHz
  14. #define  BLDC_StopMask       0B11010101 //關閉電機的掩碼(高邊設為全0)
  15. #define  BLDC_DrivePort      PORTC      //無刷直流電機驅(qū)動方向控制端口(6位)
  16. #define  BLDC_DrivePortTris  TRISC      //無刷直流電機驅(qū)動方向控制端口方向設置
  17. #define  BLDC_Direction      RA1        //無刷直流電機當前方向檢測位
  18. #define  BLDC_SensorPORT     PORTE      //無刷直流電機感應器輸入端口
  19. #define  BLDC_SensorTRIS     TRISE      //無刷直流電機感應器輸入端口方向寄存器
  20. volatile INT8U ADC_Result;              //控制PWM的AN0通道A/D轉(zhuǎn)換數(shù)據(jù)
  21. volatile INT8U DriveByte;               //電機驅(qū)動字節(jié)(低6位有效)
  22. //-----------------------------------------------------------------
  23. // 驅(qū)動表設置(更詳細說明可參閱本書相關章節(jié))
  24. //-----------------------------------------------------------------
  25. //1.6個驅(qū)動器共為3對,每2個為一對
  26. //2.每一對驅(qū)動線由一個高邊和一個低邊構(gòu)成
  27. //3.三個驅(qū)動器對應于三個電機繞組A,B,C
  28. //4.繞組 A 由RC[1..0]兩位驅(qū)動,其中RC1是 A 繞組的高邊
  29. //5.繞組 B 由RC[3..2]兩位驅(qū)動,其中RC3是 B 繞組的高邊
  30. //6.繞組 C 由RC[5..4]兩位驅(qū)動,其中RC5是 C 繞組的高邊
  31. //7.三個感應器位構(gòu)成了驅(qū)動表的偏移地址,感應器位[0..2]分別對應于繞組A,B,C
  32. //正向驅(qū)動數(shù)據(jù)表,第1-6字節(jié)對應于相位6,4,5,2,1,3的驅(qū)動位,各字節(jié)中僅低6位有效
  33. //驅(qū)動表中第0,7兩字節(jié)無效
  34. const INT8U FwdTable[] =
  35. {

  36. };
  37. //反向驅(qū)動數(shù)據(jù)表,第1-6字節(jié)對應于相位/6,/4,/5,/2,/1,/3的驅(qū)動位,0,7兩字節(jié)無效
  38. //表中每個字節(jié)后6位中,相鄰兩位為一組,與上表的差別是每組中的兩位顛倒
  39. const INT8U RevTable[] =
  40. {
  41. };
  42. //-----------------------------------------------------------------
  43. // 換向控制
  44. //-----------------------------------------------------------------
  45. void Get_Drive_Byte()
  46. {
  47.     //讀取PORTE端口輸入的感應器當前數(shù)據(jù)(三位)
  48.     INT8U CurrentSensor = PORTE & 0B00000111;
  49.     //根據(jù)RA1端口的方向位及當前位置感應器輸出,從正向或反向驅(qū)動表中讀取驅(qū)動字節(jié)
  50.     if (BLDC_Direction == 0)
  51.        DriveByte = FwdTable[CurrentSensor];
  52.     else
  53.        DriveByte = RevTable[CurrentSensor];
  54. }
  55. //-----------------------------------------------------------------
  56. // 初始化程序
  57. //-----------------------------------------------------------------
  58. void Initialize()
  59. {
  60.     Get_Drive_Byte();            //根據(jù)當前電機位置取得驅(qū)動字節(jié)
  61.     ADC_Result= 0x00;            //初始速度控制值為0
  62.     BLDC_DrivePort = 0x00;       //關閉BLDC驅(qū)動端口
  63.     BLDC_DrivePortTris = 0x00;   //BLDC驅(qū)動方向端口設為輸出
  64.     BLDC_SensorTRIS = 0xFF;      //無刷直流電機感應器端口設為輸入
  65.     TRISA  = 0B00000011;         //AN0為模擬量輸入,RA1為電機方向控制
  66.     T0CS = 0;                    //TMR0時鐘選擇:內(nèi)部時鐘
  67.     PSA = 0;                     //前分頻器分配給TMR0
  68.     PS2 = 1; PS1 = 1; PS0 = 1;   //256分頻(OPTION低3位為111,4M,256us)
  69.     ADCON1 = 0B00001110;         //A/D轉(zhuǎn)換結(jié)果左對齊,AN0為模擬端口,其余為數(shù)字端口
  70.     ADCON0 = 0B11000001;         //A/D時鐘源:RC,ADON置位,使能A/D模塊
  71.     GO_nDONE = 1;                //啟動ADC
  72. }
  73. //-----------------------------------------------------------------
  74. // 讀取A/D轉(zhuǎn)換結(jié)果的高8位
  75. //-----------------------------------------------------------------
  76. void ReadADC()
  77. {
  78.     //如果模/數(shù)轉(zhuǎn)換已經(jīng)就緒則讀取速度控制值并重新啟ADC,以便讀取一次ADC結(jié)果
  79.     if (GO_nDONE) return;
  80.     ADC_Result = ADRESH;         //讀取A/D結(jié)果的高8位
  81.     GO_nDONE = 1;                //重啟A/D模塊
  82. }        
  83. //-----------------------------------------------------------------
  84. // 主程序
  85. //-----------------------------------------------------------------
  86. void main()
  87. {
  88.     Initialize();
  89.     while (1)
  90.     {
  91.        ReadADC();//從模/數(shù)轉(zhuǎn)換端口讀取速度控制值
  92.        //如果A/D轉(zhuǎn)換值為最大值則電機全速運行,否則調(diào)節(jié)PWM
  93.        //占空比 = ADC_Result / 255
  94.        if (ADC_Result != 0xFF)
  95.        {
  96.           if (TMR0 + ADC_Result <= 0xFF) DriveByte &= BLDC_StopMask;
  97.        }
  98.        //發(fā)送電機驅(qū)動字節(jié)(6位),驅(qū)動電機運行
  99.        BLDC_DrivePort = DriveByte;
  100.        //根據(jù)電機位置感應器輸出的當前位置取得新的驅(qū)動字節(jié)
  101.        Get_Drive_Byte();
  102. ……………………

  103. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
帶位置感應器的直流無刷電機PMW控制仿真.rar (64.17 KB, 下載次數(shù): 228)



作者: lq3698    時間: 2017-11-14 09:53
程序不全
作者: GaoZhiYang    時間: 2018-3-1 09:20
謝謝分享。。。。
作者: GaoZhiYang    時間: 2018-3-1 09:20
謝謝分享。。。。。
作者: lvlv99    時間: 2018-3-2 17:03
樓主用的PROTEUS是哪個版本
作者: GUOXUAN    時間: 2018-4-15 16:40
感謝老師給學生分享,問下老師,程序是完整的嗎?
作者: xzq1971177058    時間: 2018-5-7 22:16
感謝!!!!!!!!!!!!!!!!!
作者: 劃破氣流的人    時間: 2018-5-28 12:26
驅(qū)動表怎么沒有呀,能發(fā)一下嗎
作者: zhengruifeng    時間: 2018-6-1 15:18
謝謝分享!!
作者: FRANKHILLW    時間: 2018-10-10 15:13
學習一下,程序齊全嗎?
作者: ken61132003    時間: 2019-1-31 16:21
正反轉(zhuǎn)的編碼如下,剛好我也在學馬達控制,分享給各位,感謝樓主的分享
const INT8U FwdTable[] = {0, 50, 11, 56, 44, 14, 35, 0
//0x00, 0x32, 0x0b, 0x38, 0x2c, 0x0e, 0x23, 0x00};

const INT8U RevTable[] = {0, 35, 14, 44, 56, 11, 50, 0
//0x00, 0x23, 0x0e, 0x2c, 0x38, 0x0b, 0x32, 0x00};
作者: liul8888    時間: 2019-4-22 13:54
謝謝分享!!!
作者: liul8888    時間: 2019-4-22 14:23
謝謝分享!!!
作者: 蔡小白    時間: 2020-1-4 23:31
太牛逼了
作者: pascal116    時間: 2020-2-22 10:38
謝謝分享,好好學習一下




歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1