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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5669|回復: 5
收起左側

單片機如何寫用脈沖控制步進電機呢?

[復制鏈接]
ID:475888 發表于 2019-2-18 21:42 | 顯示全部樓層 |閱讀模式
1黑幣
  1. #include <reg52.h>

  2. signed long beats = 0;  //電機轉動節拍總數

  3. void KeyDriver();

  4. void main()
  5. {
  6.     EA = 1;       //使能總中斷
  7.     TMOD = 0x01;  //設置T0為模式1
  8.     TH0  = 0xFC;  //為T0賦初值0xFC67,定時1ms
  9.     TL0  = 0x67;
  10.     ET0  = 1;     //使能T0中斷
  11.     TR0  = 1;     //啟動T0
  12.         
  13.     while (1)
  14.     {
  15.         KeyDriver();   //調用按鍵驅動函數
  16.     }
  17. }
  18. /* 步進電機啟動函數,angle-需轉過的角度 */
  19. void StartMotor(signed long angle)
  20. {
  21.     //在計算前關閉中斷,完成后再打開,以避免中斷打斷計算過程而造成錯誤
  22.     EA = 0;
  23.     beats = (angle * 4076) / 360; //實測為4076拍轉動一圈
  24.     EA = 1;
  25. }
  26. /* 步進電機停止函數 */
  27. void StopMotor()
  28. {
  29.     EA = 0;
  30.     beats = 0;
  31.     EA = 1;
  32. }
  33. /* 按鍵動作函數,根據鍵碼執行相應的操作,keycode-按鍵鍵碼 */
  34. void KeyAction(unsigned char keycode)
  35. {
  36.     static bit dirMotor = 0;  //電機轉動方向
  37.    
  38.     if ((keycode>=0x30) && (keycode<=0x39))  //控制電機轉動1-9圈
  39.     {
  40.         if (dirMotor == 0)
  41.             StartMotor(360*(keycode-0x30));
  42.         else
  43.             StartMotor(-360*(keycode-0x30));
  44.     }
  45.     else if (keycode == 0x26)  //向上鍵,控制轉動方向為正轉
  46.     {
  47.         dirMotor = 0;
  48.     }
  49.     else if (keycode == 0x28)  //向下鍵,控制轉動方向為反轉
  50.     {
  51.         dirMotor = 1;
  52.     }
  53.     else if (keycode == 0x25)  //向左鍵,固定正轉90度
  54.     {
  55.         StartMotor(90);
  56.     }
  57.     else if (keycode == 0x27)  //向右鍵,固定反轉90度
  58.     {
  59.         StartMotor(-90);
  60.     }
  61.     else if (keycode == 0x1B)  //Esc鍵,停止轉動
  62.     {
  63.         StopMotor();
  64.     }
  65. }
  66. /* 按鍵驅動函數,檢測按鍵動作,調度相應動作函數,需在主循環中調用 */
  67. void KeyDriver()
  68. {
  69.     unsigned char i, j;
  70.     static unsigned char backup[4][4] = {  //按鍵值備份,保存前一次的值
  71.         {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1}
  72.     };
  73.    
  74.     for (i=0; i<4; i++)  //循環檢測4*4的矩陣按鍵
  75.     {
  76.         for (j=0; j<4; j++)
  77.         {
  78.             if (backup[i][j] != KeySta[i][j])    //檢測按鍵動作
  79.             {
  80.                 if (backup[i][j] != 0)           //按鍵按下時執行動作
  81.                 {
  82.                     KeyAction(KeyCodeMap[i][j]); //調用按鍵動作函數
  83.                 }
  84.                 backup[i][j] = KeySta[i][j];     //刷新前一次的備份值
  85.             }
  86.         }
  87.     }
  88. }
  89. /* 電機轉動控制函數 */
  90. void TurnMotor()
  91. {
  92.     unsigned char tmp;  //臨時變量
  93.     static unsigned char index = 0;  //節拍輸出索引
  94.     unsigned char code BeatCode[8] = {  //步進電機節拍對應的IO控制代碼
  95.         0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6
  96.     };
  97.    
  98.     if (beats != 0)  //節拍數不為0則產生一個驅動節拍
  99.     {
  100.         if (beats > 0)  //節拍數大于0時正轉
  101.         {
  102.             index++;               //正轉時節拍輸出索引遞增
  103.             index = index & 0x07;  //用&操作實現到8歸零
  104.             beats--;               //正轉時節拍計數遞減
  105.         }
  106.         else            //節拍數小于0時反轉
  107.         {
  108.             index--;               //反轉時節拍輸出索引遞減
  109.             index = index & 0x07;  //用&操作同樣可以實現到-1時歸7
  110.             beats++;               //反轉時節拍計數遞增
  111.         }
  112.         tmp = P1;                    //用tmp把P1口當前值暫存
  113.         tmp = tmp & 0xF0;            //用&操作清零低4位
  114.         tmp = tmp | BeatCode[index]; //用|操作把節拍代碼寫到低4位
  115.         P1  = tmp;                   //把低4位的節拍代碼和高4位的原值送回P1
  116.     }
  117.     else  //節拍數為0則關閉電機所有的相
  118.     {
  119.         P1 = P1 | 0x0F;
  120.     }
  121. }
  122. /* T0中斷服務函數,用于按鍵掃描與電機轉動控制 */
  123. void InterruptTimer0() interrupt 1
  124. {
  125.     static bit div = 0;
  126.    
  127.     TH0 = 0xFC;  //重新加載初值
  128.     TL0 = 0x67;
  129.     KeyScan();   //執行按鍵掃描
  130.     //用一個靜態bit變量實現二分頻,即2ms定時,用于控制電機
  131.     div = ~div;
  132.     if (div == 1)
  133.     {
  134.         TurnMotor();
  135.     }
  136. }
復制代碼

回復

使用道具 舉報

ID:477932 發表于 2019-2-19 00:07 | 顯示全部樓層
步進電機的程式很多,你那不叫脈沖,是占空比
回復

使用道具 舉報

ID:164602 發表于 2019-2-19 08:57 | 顯示全部樓層
步進電機有很多種吧,如:五線四相步進電機、四線雙極性步進電機等等,你用的是哪種呢?不同的電機的控制信號不一樣哦
回復

使用道具 舉報

ID:475888 發表于 2019-2-19 12:54 | 顯示全部樓層
HC6800-ES-V2.0 發表于 2019-2-19 08:57
步進電機有很多種吧,如:五線四相步進電機、四線雙極性步進電機等等,你用的是哪種呢?不同的電機的控制信 ...

四線二相的呢
回復

使用道具 舉報

ID:475888 發表于 2019-2-19 14:39 | 顯示全部樓層
static 發表于 2019-2-19 00:07
步進電機的程式很多,你那不叫脈沖,是占空比

想學脈沖   然后轉動一定角度的例程
回復

使用道具 舉報

ID:475888 發表于 2019-2-19 14:40 | 顯示全部樓層
HC6800-ES-V2.0 發表于 2019-2-19 08:57
步進電機有很多種吧,如:五線四相步進電機、四線雙極性步進電機等等,你用的是哪種呢?不同的電機的控制信 ...

大佬有脈沖 控制轉動固定角度的51單片機例程參考嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91嫩草精品 | 伊人久久免费视频 | 日本亚洲精品成人欧美一区 | 欧美日韩黄 | 亚洲免费精品 | 久久精品久久久 | 久久国产精品-久久精品 | 国产精品国产三级国产aⅴ浪潮 | 久草久草久草 | 国产成人精品一区二区三区视频 | 日韩精品一区二 | 九九国产 | 视频第一区 | 精品国产乱码久久久久久蜜柚 | 亚洲日本免费 | 免费成人高清在线视频 | 美女久久久久久久 | 欧洲高清转码区一二区 | 日韩欧美网 | 天天澡天天操 | 午夜爽爽爽男女免费观看影院 | 特黄色一级毛片 | 亚洲高清视频在线观看 | 久久伊人精品一区二区三区 | 国产色播av在线 | caoporn国产| 麻豆一区一区三区四区 | 国产日韩精品久久 | 国产农村妇女精品一二区 | 亚洲综合一区二区三区 | 久久久人成影片免费观看 | 国产99久久精品一区二区永久免费 | 亚洲一区二区三区久久久 | 中文字幕在线电影观看 | 日韩欧美在线视频 | 精品在线看 | 天天干天天操天天爽 | 国产精品一区网站 | 午夜精品久久久久久久星辰影院 | 久久日韩粉嫩一区二区三区 | 羞羞色视频 |