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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2909|回復: 5
打印 上一主題 下一主題
收起左側

單片機步進電機程序問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:880867 發表于 2021-3-2 12:34 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請問這里unsigned int MotorDelay,Speed=1,TIM,CT;中的TIM和CT分別代表什么意思?還有A = 0;        //0xf1
b = 1;
C = 1;
D = 1;
A=0,B=1表示什么意思?0XF1是怎么來的求求大神

單片機源程序如下:
  1. /*************************************************************************************
  2. *  標題:  步進電機試驗一                                                                                                                         *
  3. *                                                                                                                                                                          *
  4. *    通過本例程了解步進馬達使用及驅動程序編寫                                                                                 *
  5. *;   單雙八拍工作方式:                                                                    *
  6. *;   A-AB-B-BC-C-CD-D-DA (即一個脈沖,轉 3.75 度)                                                                       *
  7. *    J14短路冒需斷開                                                                       *
  8. *  請學員一定要消化掉本例程                                                                    *
  9.                                                                                                                                *
  10. **************************************************************************************/  
  11. #include "reg52.h"
  12. //Motor
  13. sbit A = P1^0;          //定義管腳
  14. sbit b = P1^1;
  15. sbit C = P1^2;
  16. sbit D = P1^3;

  17. ///////////////////////////////////////
  18. //步進電機驅動
  19. unsigned char MotorStep=0;
  20. unsigned int  MotorTimer = 0;
  21. unsigned int  MotorDelay,Speed=1,TIM,CT;

  22. #define speed 8   // 調整速度 數值不要設的太低 低了會引起震動。

  23. /*****************************************************
  24. *            初始化馬達                                                                 *
  25. ******************************************************/
  26. void InitMotor()
  27. {
  28.   A = 1;
  29.   b = 1;
  30.   C = 1;
  31.   D = 1;
  32. }



  33. void SetMotor()
  34. {
  35.   //  if(Speed == 0) return;

  36.     MotorDelay=Speed;        //調整速度
  37.     switch(MotorStep)
  38.     {
  39.        case 0:
  40.           if(TIM)   // A
  41.           {                                    
  42.             A = 0;                    //0xf1  
  43.             b = 1;
  44.                         C = 1;
  45.             D = 1;
  46.             MotorStep = 1;
  47.                         TIM=0;
  48.           }
  49.        break;

  50.        case 1:                 // AB
  51.          if(TIM)
  52.           {        
  53.             A = 0;                   //0xf3
  54.             b = 0;
  55.                    C = 1;
  56.             D = 1;
  57.             MotorStep = 2;
  58.                         TIM=0;
  59.           }
  60.        break;

  61.        case 2:           //B
  62.          if(TIM)
  63.           {
  64.            
  65.                   A = 1;
  66.             b = 0;                  //0xf2
  67.             C = 1;
  68.             D = 1;
  69.            
  70.             MotorStep = 3;
  71.                         TIM=0;
  72.           }
  73.        break;


  74.        case 3:                //BC
  75.          if(TIM)
  76.           {        
  77.             A = 1;
  78.             b = 0;                    //0xf6
  79.             C = 0;
  80.             D = 1;
  81.             MotorStep = 4;
  82.                         TIM=0;
  83.           }
  84.        break;
  85.      case 4:                 //C
  86.          if(TIM)
  87.           {        
  88.             A = 1;
  89.             b = 1;                    //0xf4
  90.             C = 0;
  91.             D = 1;
  92.             MotorStep = 5;
  93.                         TIM=0;
  94.            }
  95.        break;
  96.         case 5:                          //CD
  97.          if(TIM)
  98.           {        
  99.             A = 1;
  100.             b = 1;                    //0xfc
  101.             C = 0;
  102.             D = 0;
  103.             MotorStep = 6;
  104.                         TIM=0;
  105.           }
  106.        break;
  107.         case 6:                          //D
  108.          if(TIM)
  109.           {        
  110.             A = 1;
  111.             b = 1;                    //0xf8
  112.             C = 1;
  113.             D = 0;
  114.             MotorStep = 7;
  115.                         TIM=0;
  116.           }
  117.        break;
  118.         case 7:                        //DA
  119.          if(TIM)
  120.           {        
  121.             A = 0;
  122.             b = 1;                    //0xf9
  123.             C = 1;
  124.             D = 0;
  125.             MotorStep = 0;
  126.                         TIM=0;
  127.           }
  128.        break;
  129.         
  130.         }

  131. }


  132. void system_Ini()
  133. {
  134.     TMOD|= 0x11;
  135.     TH0=0xDC; //11.0592M
  136.     TL0=0x00;        
  137.         IE = 0x8A;        
  138.     TR0  = 1;


  139. }

  140. main()
  141. { system_Ini();
  142.    InitMotor();
  143.     while(1)
  144.         {
  145.          SetMotor();

  146.          }



  147.   }

  148. /************************************************
  149. *                                                                                                *
  150. *              定時中斷延時                                                    *
  151. ************************************************/
  152.   void Tzd(void) interrupt 1
  153. {
  154.    TH0 = 0xfe;    //11.0592
  155.          TL0 = 0x33;

  156.         if( CT++==speed)
  157.           {TIM=1;
  158.            CT=0;
  159.           }
  160. }
復制代碼





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

使用道具 舉報

沙發
ID:887875 發表于 2021-3-3 09:04 | 只看該作者
首先你要理解四線兩相步進電機控制原理哈。ABCD代表四線,一般AB為1相,CD為2相。分別按順序置位A-AB-B-BC-C-CD-D-DA,一共八步驟位。這是背景。
然后看回代碼第13行,ABCD分別對應P1端口的0~3bit,而4~7bit并沒用。
再看代碼39行整個SetMotor函數
步驟1置位A:  則是P1口:11110001,轉為16進制就是0xF1
步驟2置位AB:則是P1口:11110011,轉為16進制就是0xF3
步驟3置位B:  則是P1口:11110010,轉為16進制就是0xF2
后面如此類推。


而TIM只是一個標志位,=1:可以控制電機執行下一個步驟位  =0:不允許執行
CT則是記錄時間用的,>speed:可以置位TIM1,<speed:未可以置位TIM
也就是說,CT和speed控制了電機步驟位轉移的頻率,TIM決定電機在while循環里是否可以轉到下一步驟位。
回復

使用道具 舉報

板凳
ID:487569 發表于 2021-3-3 09:46 | 只看該作者
TIM是你自己定義的變量,就是用來計時的,每speed個中斷TIM=1;電機就走一步 MotorStep步數+1,8步走完。 A-AB-B-BC-C-CD-D-DA 。一共ABCD,4根線,按照這個順序,你程序寫的第一步A就是只有A=0(低電平),BCD沒寫出來的就是1(高電平),此時P1=11111110=0xfe才對。 至于后面備注了0xf1則是因為,步進電機初始化為P1=0xF0,這個時候第一步就是A寫1,即P1=11110001=0xf1。實際上后面的備注與你的程序并不符合
回復

使用道具 舉報

地板
ID:798631 發表于 2021-3-3 09:50 | 只看該作者
樓上解答的非常好,做單片機系統需要對被控對象很熟悉的,我一直認為單片機系統開發的重點在硬件  程序是處理事情的C語言具現     所以 還是  回過頭來再補學 一些基礎的好,重來一次手邊有實物容易太多了

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

5#
ID:213173 發表于 2021-3-3 11:20 | 只看該作者
A、B、C、D已被定義為P1口的低4位,只要按A-AB-B-BC-C-CD-D-DA順序輸出驅動信號即可。由于IO口與電機之間有驅動管反相放大,當P1口的低4位輸出1110,經反相就成0001,原作者只是用16進制的方式注釋表示電機端的電平狀態。其高4位的實際狀態是0或f不必過于糾結。其余7個注釋同理不贅述。
回復

使用道具 舉報

6#
ID:451718 發表于 2021-3-3 12:03 | 只看該作者
步進電機驅動的問題。關于步進電機的驅動可以簡單分為兩類。
1,通過控制芯片驅動,這時,只用對驅動芯片發送脈沖信號(脈沖的快慢決定電機的運行速度,當然還要看你的細分),發送方向信號dir,發送使能信號en,控制芯片就會給步進電機功率驅動信號。 這個功率驅動信號的原型,就是你程序中的a,b,c,d對應的電平邏輯值。
2,通過單片機io口和放大電路驅動。 步進電機的驅動是需要節拍的, 你程序中switch(MotoStep)語句,就是在產生節拍, 然后通過定時器控制CT自加來控制產生節拍的速度。這種驅動方式是很早期的,現在基本上不用了。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品精品3d动漫 | 久久久久国产一级毛片 | 日本成人毛片 | 日韩三级在线 | 99精品国自产在线 | 久久久av| 亚洲欧美日韩精品久久亚洲区 | 欧美自拍另类 | 久久男人 | 久久亚洲一区 | 亚洲综合电影 | 国产成人一区二区三区精 | 国产精品中文在线 | 亚洲黄色视屏 | 亚洲精品18 | 国产精品久久久久久一区二区三区 | 日韩欧美在线播放 | 亚洲一区视频在线 | 欧美成人手机在线 | 999观看免费高清www | 日韩欧美在线播放 | 成人久久18免费网站麻豆 | 国产精品亚洲精品日韩已方 | 国产日韩精品久久 | 亚洲欧洲中文日韩 | 国产日韩中文字幕 | 久久99久久 | 午夜激情视频在线 | 久久久久久久久久久一区二区 | 2020天天操 | 天天射网站 | 一级在线 | 一区二区在线观看av | www.久草.com | 五月婷婷激情网 | 亚洲va欧美va天堂v国产综合 | 国产乱码精品一品二品 | 欧美8一10sex性hd | 狠狠久久| 日本精品一区二区在线观看 | 精品国产乱码久久久久久久久 |