找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)如何寫用脈沖控制步進(jìn)電機(jī)呢?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:475888 發(fā)表于 2019-2-18 21:42 | 只看該作者 回帖獎勵(lì) |倒序?yàn)g覽 |閱讀模式
1黑幣
  1. #include <reg52.h>

  2. signed long beats = 0;  //電機(jī)轉(zhuǎn)動節(jié)拍總數(shù)

  3. void KeyDriver();

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

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

使用道具 舉報(bào)

沙發(fā)
ID:477932 發(fā)表于 2019-2-19 00:07 | 只看該作者
步進(jìn)電機(jī)的程式很多,你那不叫脈沖,是占空比
回復(fù)

使用道具 舉報(bào)

板凳
ID:164602 發(fā)表于 2019-2-19 08:57 | 只看該作者
步進(jìn)電機(jī)有很多種吧,如:五線四相步進(jìn)電機(jī)、四線雙極性步進(jìn)電機(jī)等等,你用的是哪種呢?不同的電機(jī)的控制信號不一樣哦
回復(fù)

使用道具 舉報(bào)

地板
ID:475888 發(fā)表于 2019-2-19 12:54 | 只看該作者
HC6800-ES-V2.0 發(fā)表于 2019-2-19 08:57
步進(jìn)電機(jī)有很多種吧,如:五線四相步進(jìn)電機(jī)、四線雙極性步進(jìn)電機(jī)等等,你用的是哪種呢?不同的電機(jī)的控制信 ...

四線二相的呢
回復(fù)

使用道具 舉報(bào)

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

想學(xué)脈沖   然后轉(zhuǎn)動一定角度的例程
回復(fù)

使用道具 舉報(bào)

6#
ID:475888 發(fā)表于 2019-2-19 14:40 | 只看該作者
HC6800-ES-V2.0 發(fā)表于 2019-2-19 08:57
步進(jìn)電機(jī)有很多種吧,如:五線四相步進(jìn)電機(jī)、四線雙極性步進(jìn)電機(jī)等等,你用的是哪種呢?不同的電機(jī)的控制信 ...

大佬有脈沖 控制轉(zhuǎn)動固定角度的51單片機(jī)例程參考嗎
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表