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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5696|回復: 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. }
復制代碼

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

使用道具 舉報

沙發
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
步進電機有很多種吧,如:五線四相步進電機、四線雙極性步進電機等等,你用的是哪種呢?不同的電機的控制信 ...

四線二相的呢
回復

使用道具 舉報

5#
ID:475888 發表于 2019-2-19 14:39 | 只看該作者
static 發表于 2019-2-19 00:07
步進電機的程式很多,你那不叫脈沖,是占空比

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

使用道具 舉報

6#
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲网站免费看 | 青青草视频网 | 亚洲在线免费观看 | 亚洲精品国产精品国自产在线 | 97超碰站| 欧美激情一区二区三级高清视频 | 四虎影院免费在线 | 国产精品一区在线观看 | 免费一区二区三区在线视频 | 亚洲日本三级 | 日日操夜夜操天天操 | av香蕉| 国产精品一区二区三区免费观看 | 国产精品区二区三区日本 | 日韩成人免费av | 欧美视频第二页 | 中文天堂在线一区 | 成人av网站在线观看 | 日韩在线一区二区三区 | 国产精品毛片无码 | 狠狠草视频 | 日日天天 | 免费国产一区 | 亚洲狠狠爱 | 日韩av一区二区在线观看 | 91成人精品视频 | 国产精品久久久亚洲 | www.97国产| 欧美一区二 | 国产成人av一区二区三区 | 久久国产视频网站 | 久久精品国产清自在天天线 | 久久久久一区二区三区 | 亚洲v日韩v综合v精品v | 亚洲黄色高清视频 | 四虎国产 | 午夜国产一级 | 国产欧美日韩精品在线观看 | 亚洲一区二区三区在线播放 | 黄色a视频| 亚洲免费婷婷 |