找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 46723|回復(fù): 57
收起左側(cè)

42步進(jìn)電機(jī)控制單片機(jī)程序和原理圖

  [復(fù)制鏈接]
ID:143400 發(fā)表于 2016-10-21 17:04 | 顯示全部樓層 |閱讀模式
下面是仿真圖:

XHU(HM~O1K0PE0%K6MG2X3J.png M8]W2B5VQ8JE1({Z3{3K`CD.png KCTJ3Y9RT~G%RE0}6S19.png `KD}JT)M(50C}J]M84J5(B1.png

  1. /****************************************Copyright (c)**************************************************                           
  2. **                                    
  3. ** -----------------------------------------------------------------------------------------------------
  4. ** File Name    :
  5. ** Version      : V1.0.0
  6. ** Description  :                                 
  7. * 【外部晶振】: 11.0592mhz        
  8. * 【主控芯片】: STC89C52
  9. * 【編譯環(huán)境】: Keil μVisio4        
  10. * 【程序功能】:                                                                                                   
  11. * 【使用說(shuō)明】:
  12. ** -----------------------------------------------------------------------------------------------------
  13. ** Author       : Creavalia
  14. ** Date         : 2016年10月19日
  15. ** -----------------------------------------------------------------------------------------------------
  16. ** Modify Person:
  17. ** Modify Date  :
  18. ** Description  :
  19. *********************************************************************************************************/
  20. // Includes --------------------------------------------------------------------------------------------
  21. #include<reg51.h>
  22. /********************************************************************************************************
  23. **                         Marcos define
  24. *********************************************************************************************************/
  25. #define MotorTabNum 5
  26. unsigned char T0_NUM;
  27. //IO設(shè)置
  28. sbit K1 = P3^5;        // 啟動(dòng)
  29. sbit K2 = P3^4;        // 反向
  30. sbit K3 = P3^3;        // 加速
  31. sbit K4 = P3^2;        // 減速

  32. sbit FX      = P2^4;     // 方向
  33. sbit MotorEn = P2^5;     // 使能
  34. sbit CLK     = P2^6;     // 脈沖

  35. //----數(shù)碼管---------------
  36. sbit SMG1 = P2^0;                                        //數(shù)碼管第一位定義
  37. sbit SMG2 = P2^1;                                        //數(shù)碼管第二位定義
  38. sbit SMG3 = P2^2;                                        //數(shù)碼管第三位定義
  39. sbit SMG4 = P2^3;                                        //數(shù)碼管第四位定義

  40. int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};           //共陰極數(shù)碼管段值
  41. //int table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,};           //共陽(yáng)極數(shù)碼管段值


  42. unsigned char g_MotorSt = 0;     // 啟停
  43. unsigned char g_MotorDir = 0;    // 正反

  44. //unsigned char MotorTab[6] = {200, 160, 120, 80, 40, 20};
  45. unsigned char MotorTab[6] = {12, 10, 8, 6, 4, 2};
  46. //unsigned char MotorTab[6] = {6, 5, 4, 3, 2, 1};

  47. signed char g_MotorNum = 0;

  48. //--------------
  49. void delayms(xms);
  50. void mDelay(unsigned int DelayTime);                //延時(shí)函數(shù)
  51. void T0_Init();

  52. void KeyScan(void);
  53. void Display(void);


  54. // 主程序  main()
  55. void main(void)
  56. {
  57.         unsigned char i;
  58.         T0_Init();             // 定時(shí)器0 初始化
  59.         MotorEn = 0;     // L297 使能(只有智能,才能正常工作,否則停止)
  60.         FX = 0;
  61.         while(1)
  62.         {
  63.                 KeyScan();              // 按鍵
  64.                 for(i=0; i<10; i++)
  65.                 Display();
  66.         }

  67. }

  68. /********定時(shí)器初始化***********************************************************/
  69. void T0_Init()
  70. {
  71.         TMOD = 0x01;
  72.         TH0 = (65535-100)/256;  // 1ms
  73.         TL0 = (65535-100)%256;
  74.         EA = 1;
  75.         ET0 = 1;
  76. //        TR0 = 1;

  77. }

  78. /********定時(shí)器中斷*****************/
  79. void T0_time() interrupt 1
  80. {
  81. //        TR0 = 0;
  82.         TH0 = (65535-100)/256;   
  83.         TL0 = (65535-100)%256;
  84.         T0_NUM++;
  85.         if(T0_NUM >= MotorTab[g_MotorNum])        // 增加按鍵g_MotorNum++   減小按鍵g_MotorNum--
  86.         {
  87.                 T0_NUM = 0;
  88.                 CLK=CLK^0x01;               //   輸出脈沖
  89.         }
  90. //        TR0 = 1;
  91. }         


  92. //-----按鍵控制---------------------
  93. void KeyScan(void)
  94. {
  95.         if(K1 == 0)
  96.         {
  97.                 delayms(5);   // 軟件延時(shí)消抖
  98.                 if(K1 == 0)
  99.                 {
  100.                         while(!K1){Display();};
  101.                         g_MotorSt = g_MotorSt ^ 0x01;
  102.                         MotorEn ^= 1;
  103.                         TR0 = 1;
  104.                 }
  105.         }

  106.         if(K2 == 0)
  107.         {
  108.                 delayms(10);   // 軟件延時(shí)消抖
  109.                 if(K2 == 0)
  110.                 {
  111.                 //        while(!K2){Display();};        
  112.                         g_MotorDir = g_MotorDir ^ 0x01;
  113.                         FX ^= 1;
  114.                         while(!K2){Display();};        
  115.                 }
  116.         }

  117.         if(K3 == 0)  // 加速
  118.         {
  119.                 delayms(5);   // 軟件延時(shí)消抖
  120.                 if(K3 == 0)
  121.                 {
  122.                         while(!K3){Display();};        
  123.                         g_MotorNum++;
  124.                         if(g_MotorNum > MotorTabNum)
  125.                                 g_MotorNum = MotorTabNum;
  126.                 }
  127.         }

  128.         if(K4 == 0)  // 減速
  129.         {
  130.                 delayms(5);   // 軟件延時(shí)消抖
  131.                 if(K4 == 0)
  132.                 {
  133.                         while(!K4){Display();};        
  134.                         g_MotorNum--;
  135.                         if(g_MotorNum < 0)
  136.                                 g_MotorNum = 0;
  137.                 }
  138.         }


  139. }


  140. /******************************************************************************
  141. * 名稱(chēng): Set_Display()
  142. * 功能: 數(shù)碼管顯示函數(shù)
  143. * 輸入: 無(wú)
  144. * 輸出: 無(wú)
  145. * 說(shuō)明:
  146. ******************************************************************************/
  147. void Display(void)
  148. {
  149.         unsigned char b1, b2;
  150.         b1=g_MotorNum/10;               
  151.     b2=g_MotorNum%10;
  152.         if(FX == 0)
  153.                 P0=0x71;//顯示F
  154.     else
  155.                 P0=0x79;
  156.         SMG1=0;                                                         
  157.     delayms(3);
  158.     SMG1=1;

  159.         P0=0x40;
  160.     SMG2=0;                                                         //顯示--
  161.     delayms(3);
  162.     SMG2=1;

  163.         P0=table[b1];
  164.         SMG3=0;                                                         //顯示十位
  165.         delayms(3);
  166.         SMG3=1;

  167.         P0=table[b2];
  168.     SMG4=0;
  169.     delayms(3);                                                 //顯示個(gè)位
  170.     SMG4=1;
  171. }



  172. /********************************延時(shí)函數(shù)***********************************************************/
  173. void delayms(xms)
  174. {
  175.          unsigned int x,y;
  176.          for(x=xms;x>0;x--)
  177.                  for(y=110;y>0;y--);
  178. }
  179. /*********************************************************************************************************
  180. **                            End Of File
  181. ********************************************************************************************************/


復(fù)制代碼



1、步進(jìn)電機(jī)控制系統(tǒng)的主程序在對(duì)整個(gè)系統(tǒng)初始化后主要完成讀鍵盤(pán)和處理鍵盤(pán)的功能,如圖3-1所示:
圖3-1 步進(jìn)電機(jī)控制系統(tǒng)主程序流程圖
系統(tǒng)上電復(fù)位后,先調(diào)用初始化子程序,對(duì)步進(jìn)電機(jī)各端口,相關(guān)參數(shù)進(jìn)行初始化,設(shè)置T0、T1工作方式控制字和時(shí)間常數(shù)。初始化完成后,步進(jìn)電機(jī)處于停止?fàn)顟B(tài),T0、T1定時(shí)器處于關(guān)閉狀態(tài)。然后循環(huán)調(diào)用讀鍵盤(pán)子程序和鍵盤(pán)處理子程序,等待中斷,以便實(shí)現(xiàn)步進(jìn)電機(jī)轉(zhuǎn)動(dòng)控制和轉(zhuǎn)速的動(dòng)態(tài)顯示。

2、讀鍵盤(pán)子程序流程圖
讀鍵盤(pán)子程序流程圖如圖3-2所示:
圖3-2讀鍵盤(pán)子程序流程圖
首先初始化實(shí)際鍵值參數(shù)為0FH,然后掃描P3口,與初始值比較,相等則說(shuō)明沒(méi)有鍵按下,不相等則軟件消抖,以便確認(rèn)是否真的有鍵按下。延時(shí)10ms后再次掃描P3口,第二次與初始值比較,若相等則表明前一次比較不相等是由抖動(dòng)產(chǎn)生;如果相等則表明確實(shí)有鍵按下。此時(shí)保存鍵值到臨時(shí)變量。接著第三次掃描鍵盤(pán)并與臨時(shí)變量比較,若相等則循環(huán),這是為了確保每一次按鍵只執(zhí)行一次相應(yīng)的處理程序。最后從臨時(shí)變量取出鍵值送實(shí)際鍵值參數(shù),為鍵盤(pán)處理子程序做準(zhǔn)備。
3、 鍵盤(pán)處理子程序流程圖
按鍵處理子程序流程圖如圖3-3所示:
圖3-3鍵盤(pán)處理子程序流程圖
鍵盤(pán)處理子程序開(kāi)始時(shí)要從存放實(shí)際鍵值的參數(shù)中取出剛讀取到的鍵值送到累加器A,依次判斷累加器A的低四位。若檢測(cè)到低電平,則說(shuō)明與該位對(duì)應(yīng)的按鍵按下,從而轉(zhuǎn)到相應(yīng)的處理子程序段,完成相應(yīng)的操作,實(shí)現(xiàn)相應(yīng)的功能后返回。若沒(méi)有檢測(cè)到高電平,則返回。
步進(jìn)電機(jī)的啟?刂仆ㄟ^(guò)啟停定時(shí)器0來(lái)實(shí)現(xiàn),因?yàn)槎〞r(shí)器0控制著脈沖信號(hào)的輸出,關(guān)閉定時(shí)器0也就阻止了脈沖信號(hào)的輸出。
4、 電機(jī)控制中斷程序流程圖
定時(shí)器中斷0服務(wù)程序流程圖如圖3-4所示:
圖3-4定時(shí)器中斷0服務(wù)程序流程圖
定時(shí)器中斷0服務(wù)程序的中斷時(shí)間由當(dāng)前的轉(zhuǎn)速?zèng)Q定。進(jìn)入中斷程序后,首先要保護(hù)現(xiàn)場(chǎng),再根據(jù)當(dāng)前速度進(jìn)行計(jì)算并查表得到T0定時(shí)時(shí)間常數(shù),設(shè)置TH0和TL0的值。然后判斷轉(zhuǎn)動(dòng)方向控制位的值,如果是0則控制脈沖信號(hào)循環(huán)左移并輸出,如果是1則控制脈沖信號(hào)循環(huán)右移并輸出。最后恢復(fù)現(xiàn)場(chǎng),返回,等待下次中斷。
通過(guò)用當(dāng)前轉(zhuǎn)速控制中斷時(shí)間,控制了脈沖的輸出頻率,也就到達(dá)了控制步進(jìn)電機(jī)轉(zhuǎn)動(dòng)速度的目的;通過(guò)檢測(cè)方向控制位的電平,選擇脈沖信號(hào)的循環(huán)左移或循環(huán)右移,控制了步進(jìn)電機(jī)各引出端的接通順序,也就到實(shí)現(xiàn)了步進(jìn)電機(jī)轉(zhuǎn)動(dòng)方向的控制。
5、 數(shù)碼顯示中斷程序流程圖
定時(shí)中斷1服務(wù)程序流程圖如圖3-5所示:
圖3-5定時(shí)中斷1服務(wù)程序流程圖
數(shù)碼顯示中斷程序的定時(shí)時(shí)間為1ms。進(jìn)入中斷程序后,首先要保護(hù)現(xiàn)場(chǎng),然后關(guān)閉個(gè)位數(shù)碼管,根據(jù)當(dāng)前轉(zhuǎn)速求出十位與個(gè)位的值。查表得到十位的字段碼送P1口,控制十位上的數(shù)碼管顯示。然后延時(shí)1ms,接著關(guān)閉十位數(shù)碼管,查表得到個(gè)位的字段碼送P1口,控制個(gè)位上的數(shù)碼管顯示。最后重新設(shè)置定時(shí)時(shí)間,恢復(fù)現(xiàn)場(chǎng)并返回。

評(píng)分

參與人數(shù) 2黑幣 +55 收起 理由
PinIthS + 5 絕世好帖!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:113385 發(fā)表于 2016-11-16 19:21 | 顯示全部樓層
頂!d=====( ̄▽?zhuān)?)b
回復(fù)

使用道具 舉報(bào)

ID:162850 發(fā)表于 2017-1-24 09:52 | 顯示全部樓層
學(xué)習(xí)。。。。。。。
回復(fù)

使用道具 舉報(bào)

ID:165363 發(fā)表于 2017-2-19 11:57 | 顯示全部樓層
好資料,感謝分享
回復(fù)

使用道具 舉報(bào)

ID:163070 發(fā)表于 2017-2-19 23:34 來(lái)自手機(jī) | 顯示全部樓層
謝謝提供
回復(fù)

使用道具 舉報(bào)

ID:60965 發(fā)表于 2017-2-20 21:07 | 顯示全部樓層
你這貼太好了。
回復(fù)

使用道具 舉報(bào)

ID:165456 發(fā)表于 2017-2-21 01:11 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:166382 發(fā)表于 2017-2-24 13:26 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

ID:166382 發(fā)表于 2017-2-24 13:26 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

ID:166447 發(fā)表于 2017-2-26 17:51 | 顯示全部樓層
感謝樓主分享
回復(fù)

使用道具 舉報(bào)

ID:167215 發(fā)表于 2017-3-28 12:11 | 顯示全部樓層
51單片機(jī)學(xué)習(xí)板能用這程序控制直流電機(jī)嗎?
回復(fù)

使用道具 舉報(bào)

ID:195441 發(fā)表于 2017-5-5 08:30 | 顯示全部樓層
好資料,感謝分享
回復(fù)

使用道具 舉報(bào)

ID:206764 發(fā)表于 2017-6-1 16:48 | 顯示全部樓層
下載下來(lái)看看,不知道怎么用,先摸索起來(lái)
回復(fù)

使用道具 舉報(bào)

ID:61390 發(fā)表于 2017-6-2 12:20 | 顯示全部樓層
謝謝分享。。!
回復(fù)

使用道具 舉報(bào)

ID:165117 發(fā)表于 2017-6-2 15:33 | 顯示全部樓層
感謝樓主分享!   下載下來(lái)看看
回復(fù)

使用道具 舉報(bào)

ID:110866 發(fā)表于 2017-7-12 19:25 | 顯示全部樓層
光給個(gè)代碼,放著仿真圖,尷尬
回復(fù)

使用道具 舉報(bào)

ID:169394 發(fā)表于 2017-7-23 11:04 | 顯示全部樓層
樓主,這個(gè)程序是L297驅(qū)動(dòng)程序吧 ?請(qǐng)問(wèn)L298的有嗎 ?
回復(fù)

使用道具 舉報(bào)

ID:187532 發(fā)表于 2017-8-7 19:10 | 顯示全部樓層
樓主有mirostep driver驅(qū)動(dòng)的嘛
回復(fù)

使用道具 舉報(bào)

ID:193324 發(fā)表于 2017-8-14 10:30 | 顯示全部樓層
目前正好需要這個(gè)。 謝謝樓主分享!
回復(fù)

使用道具 舉報(bào)

ID:67692 發(fā)表于 2017-8-20 22:13 | 顯示全部樓層

 謝謝分享。。。!!!
回復(fù)

使用道具 舉報(bào)

ID:232168 發(fā)表于 2017-9-20 12:07 | 顯示全部樓層
正好在做個(gè)東西,謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:234458 發(fā)表于 2017-9-20 18:30 來(lái)自手機(jī) | 顯示全部樓層
學(xué)習(xí)了 謝謝
回復(fù)

使用道具 舉報(bào)

ID:228228 發(fā)表于 2017-9-26 22:53 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

ID:217754 發(fā)表于 2017-10-7 10:30 來(lái)自手機(jī) | 顯示全部樓層
厲害,這個(gè)全面,按圖接線試一下
回復(fù)

使用道具 舉報(bào)

ID:241215 發(fā)表于 2017-10-20 11:11 | 顯示全部樓層
找了很久 應(yīng)該有用 學(xué)習(xí)中
回復(fù)

使用道具 舉報(bào)

ID:252235 發(fā)表于 2017-11-24 14:56 | 顯示全部樓層
感謝樓主分享
回復(fù)

使用道具 舉報(bào)

ID:252165 發(fā)表于 2017-11-27 16:16 | 顯示全部樓層
很好的學(xué)習(xí)材料
回復(fù)

使用道具 舉報(bào)

ID:282486 發(fā)表于 2018-2-22 18:12 | 顯示全部樓層
只有源碼,沒(méi)有仿真
回復(fù)

使用道具 舉報(bào)

ID:189772 發(fā)表于 2018-3-3 11:32 | 顯示全部樓層
樓主,你用的兩相還是三相的步進(jìn)電機(jī)?三相步進(jìn)電機(jī)好象價(jià)格挺高哦
回復(fù)

使用道具 舉報(bào)

ID:288930 發(fā)表于 2018-3-7 22:04 | 顯示全部樓層
很好,感謝分享
回復(fù)

使用道具 舉報(bào)

ID:290884 發(fā)表于 2018-3-12 17:02 | 顯示全部樓層
非常感謝分享,很有幫助!
回復(fù)

使用道具 舉報(bào)

ID:294575 發(fā)表于 2018-3-20 16:18 | 顯示全部樓層
厲害厲害,受教了
回復(fù)

使用道具 舉報(bào)

ID:302501 發(fā)表于 2018-4-5 19:51 | 顯示全部樓層
謝謝老鐵的分享
回復(fù)

使用道具 舉報(bào)

ID:281632 發(fā)表于 2018-4-21 16:33 | 顯示全部樓層
謝謝提供,很有啟發(fā)
回復(fù)

使用道具 舉報(bào)

ID:144054 發(fā)表于 2018-4-27 16:17 | 顯示全部樓層
沒(méi)有PROTEUS仿真圖啊
回復(fù)

使用道具 舉報(bào)

ID:313702 發(fā)表于 2018-4-28 11:57 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:318653 發(fā)表于 2018-4-28 21:42 | 顯示全部樓層
厲害了,這個(gè)實(shí)用,不錯(cuò)
回復(fù)

使用道具 舉報(bào)

ID:319643 發(fā)表于 2018-5-11 00:13 來(lái)自手機(jī) | 顯示全部樓層
樓主,能把數(shù)碼管改成lcd1602顯示嗎,有重賞
回復(fù)

使用道具 舉報(bào)

ID:319643 發(fā)表于 2018-5-11 00:15 來(lái)自手機(jī) | 顯示全部樓層
把數(shù)碼管換乘lcd1602顯示的程序有嗎?有重謝
回復(fù)

使用道具 舉報(bào)

ID:300063 發(fā)表于 2018-5-14 21:29 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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