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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

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

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

  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();   //調用按鍵驅動函數(shù)
  16.     }
  17. }
  18. /* 步進電機啟動函數(shù),angle-需轉過的角度 */
  19. void StartMotor(signed long angle)
  20. {
  21.     //在計算前關閉中斷,完成后再打開,以避免中斷打斷計算過程而造成錯誤
  22.     EA = 0;
  23.     beats = (angle * 4076) / 360; //實測為4076拍轉動一圈
  24.     EA = 1;
  25. }
  26. /* 步進電機停止函數(shù) */
  27. void StopMotor()
  28. {
  29.     EA = 0;
  30.     beats = 0;
  31.     EA = 1;
  32. }
  33. /* 按鍵動作函數(shù),根據(jù)鍵碼執(zhí)行相應的操作,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. /* 按鍵驅動函數(shù),檢測按鍵動作,調度相應動作函數(shù),需在主循環(huán)中調用 */
  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)           //按鍵按下時執(zhí)行動作
  81.                 {
  82.                     KeyAction(KeyCodeMap[i][j]); //調用按鍵動作函數(shù)
  83.                 }
  84.                 backup[i][j] = KeySta[i][j];     //刷新前一次的備份值
  85.             }
  86.         }
  87.     }
  88. }
  89. /* 電機轉動控制函數(shù) */
  90. void TurnMotor()
  91. {
  92.     unsigned char tmp;  //臨時變量
  93.     static unsigned char index = 0;  //節(jié)拍輸出索引
  94.     unsigned char code BeatCode[8] = {  //步進電機節(jié)拍對應的IO控制代碼
  95.         0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6
  96.     };
  97.    
  98.     if (beats != 0)  //節(jié)拍數(shù)不為0則產生一個驅動節(jié)拍
  99.     {
  100.         if (beats > 0)  //節(jié)拍數(shù)大于0時正轉
  101.         {
  102.             index++;               //正轉時節(jié)拍輸出索引遞增
  103.             index = index & 0x07;  //用&操作實現(xiàn)到8歸零
  104.             beats--;               //正轉時節(jié)拍計數(shù)遞減
  105.         }
  106.         else            //節(jié)拍數(shù)小于0時反轉
  107.         {
  108.             index--;               //反轉時節(jié)拍輸出索引遞減
  109.             index = index & 0x07;  //用&操作同樣可以實現(xiàn)到-1時歸7
  110.             beats++;               //反轉時節(jié)拍計數(shù)遞增
  111.         }
  112.         tmp = P1;                    //用tmp把P1口當前值暫存
  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則關閉電機所有的相
  118.     {
  119.         P1 = P1 | 0x0F;
  120.     }
  121. }
  122. /* T0中斷服務函數(shù),用于按鍵掃描與電機轉動控制 */
  123. void InterruptTimer0() interrupt 1
  124. {
  125.     static bit div = 0;
  126.    
  127.     TH0 = 0xFC;  //重新加載初值
  128.     TL0 = 0x67;
  129.     KeyScan();   //執(zhí)行按鍵掃描
  130.     //用一個靜態(tài)bit變量實現(xiàn)二分頻,即2ms定時,用于控制電機
  131.     div = ~div;
  132.     if (div == 1)
  133.     {
  134.         TurnMotor();
  135.     }
  136. }
復制代碼

回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

四線二相的呢
回復

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久综合影院 | 精品一区二区久久久久久久网站 | 日本午夜在线视频 | 久久久久久一区 | 国产精品久久久久久久久久久免费看 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 亚洲精品国产成人 | 在线日韩欧美 | 日韩欧美一区二区三区在线播放 | 国产成人免费视频网站高清观看视频 | 欧美日韩免费视频 | 亚洲电影在线播放 | 视频三区| 谁有毛片| 日本字幕在线观看 | 亚洲毛片在线 | 欧美另类日韩 | 色吊丝2288sds中文字幕 | 国产精品成人在线 | 99成人| 久久亚洲欧美日韩精品专区 | 国产精品久久久99 | 亚洲电影在线播放 | 日韩精品一区二区三区视频播放 | 久久久久国产一区二区三区 | 中文字幕亚洲专区 | 国产偷自视频区视频 | 久久精品国产一区二区电影 | 亚洲一区二区三区在线免费 | 国产精品a久久久久 | 91久久久久久久久久久 | 国产99热 | 污污免费网站 | 亚洲第一视频网 | 国产男女视频 | 欧美精品日韩 | 国产欧美一区二区三区在线看 | 精品成人免费视频 | 最新日韩在线 | 亚洲综合一区二区三区 | 成人在线观 |