標(biāo)題: 42步進(jìn)電機(jī)控制單片機(jī)程序和原理圖 [打印本頁]
作者: 412489601 時間: 2016-10-21 17:04
標(biāo)題: 42步進(jìn)電機(jī)控制單片機(jī)程序和原理圖
下面是仿真圖:
XHU(HM~O1K0PE0%K6MG2X3J.png (146.53 KB, 下載次數(shù): 333)
下載附件
2016-10-21 16:58 上傳
M8]W2B5VQ8JE1({Z3{3K`CD.png (146.48 KB, 下載次數(shù): 223)
下載附件
2016-10-21 16:58 上傳
KCTJ3Y9RT~G%RE0}6S19.png (145.61 KB, 下載次數(shù): 191)
下載附件
2016-10-21 16:58 上傳
`KD}JT)M(50C}J]M84J5(B1.png (146.41 KB, 下載次數(shù): 194)
下載附件
2016-10-21 16:58 上傳
- /****************************************Copyright (c)**************************************************
- **
- ** -----------------------------------------------------------------------------------------------------
- ** File Name :
- ** Version : V1.0.0
- ** Description :
- * 【外部晶振】: 11.0592mhz
- * 【主控芯片】: STC89C52
- * 【編譯環(huán)境】: Keil μVisio4
- * 【程序功能】:
- * 【使用說明】:
- ** -----------------------------------------------------------------------------------------------------
- ** Author : Creavalia
- ** Date : 2016年10月19日
- ** -----------------------------------------------------------------------------------------------------
- ** Modify Person:
- ** Modify Date :
- ** Description :
- *********************************************************************************************************/
- // Includes --------------------------------------------------------------------------------------------
- #include<reg51.h>
- /********************************************************************************************************
- ** Marcos define
- *********************************************************************************************************/
- #define MotorTabNum 5
- unsigned char T0_NUM;
- //IO設(shè)置
- sbit K1 = P3^5; // 啟動
- sbit K2 = P3^4; // 反向
- sbit K3 = P3^3; // 加速
- sbit K4 = P3^2; // 減速
- sbit FX = P2^4; // 方向
- sbit MotorEn = P2^5; // 使能
- sbit CLK = P2^6; // 脈沖
- //----數(shù)碼管---------------
- sbit SMG1 = P2^0; //數(shù)碼管第一位定義
- sbit SMG2 = P2^1; //數(shù)碼管第二位定義
- sbit SMG3 = P2^2; //數(shù)碼管第三位定義
- sbit SMG4 = P2^3; //數(shù)碼管第四位定義
- int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //共陰極數(shù)碼管段值
- //int table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,}; //共陽極數(shù)碼管段值
- unsigned char g_MotorSt = 0; // 啟停
- unsigned char g_MotorDir = 0; // 正反
- //unsigned char MotorTab[6] = {200, 160, 120, 80, 40, 20};
- unsigned char MotorTab[6] = {12, 10, 8, 6, 4, 2};
- //unsigned char MotorTab[6] = {6, 5, 4, 3, 2, 1};
- signed char g_MotorNum = 0;
- //--------------
- void delayms(xms);
- void mDelay(unsigned int DelayTime); //延時函數(shù)
- void T0_Init();
- void KeyScan(void);
- void Display(void);
- // 主程序 main()
- void main(void)
- {
- unsigned char i;
- T0_Init(); // 定時器0 初始化
- MotorEn = 0; // L297 使能(只有智能,才能正常工作,否則停止)
- FX = 0;
- while(1)
- {
- KeyScan(); // 按鍵
- for(i=0; i<10; i++)
- Display();
- }
- }
- /********定時器初始化***********************************************************/
- void T0_Init()
- {
- TMOD = 0x01;
- TH0 = (65535-100)/256; // 1ms
- TL0 = (65535-100)%256;
- EA = 1;
- ET0 = 1;
- // TR0 = 1;
- }
- /********定時器中斷*****************/
- void T0_time() interrupt 1
- {
- // TR0 = 0;
- TH0 = (65535-100)/256;
- TL0 = (65535-100)%256;
- T0_NUM++;
- if(T0_NUM >= MotorTab[g_MotorNum]) // 增加按鍵g_MotorNum++ 減小按鍵g_MotorNum--
- {
- T0_NUM = 0;
- CLK=CLK^0x01; // 輸出脈沖
- }
- // TR0 = 1;
- }
- //-----按鍵控制---------------------
- void KeyScan(void)
- {
- if(K1 == 0)
- {
- delayms(5); // 軟件延時消抖
- if(K1 == 0)
- {
- while(!K1){Display();};
- g_MotorSt = g_MotorSt ^ 0x01;
- MotorEn ^= 1;
- TR0 = 1;
- }
- }
- if(K2 == 0)
- {
- delayms(10); // 軟件延時消抖
- if(K2 == 0)
- {
- // while(!K2){Display();};
- g_MotorDir = g_MotorDir ^ 0x01;
- FX ^= 1;
- while(!K2){Display();};
- }
- }
- if(K3 == 0) // 加速
- {
- delayms(5); // 軟件延時消抖
- if(K3 == 0)
- {
- while(!K3){Display();};
- g_MotorNum++;
- if(g_MotorNum > MotorTabNum)
- g_MotorNum = MotorTabNum;
- }
- }
- if(K4 == 0) // 減速
- {
- delayms(5); // 軟件延時消抖
- if(K4 == 0)
- {
- while(!K4){Display();};
- g_MotorNum--;
- if(g_MotorNum < 0)
- g_MotorNum = 0;
- }
- }
- }
- /******************************************************************************
- * 名稱: Set_Display()
- * 功能: 數(shù)碼管顯示函數(shù)
- * 輸入: 無
- * 輸出: 無
- * 說明:
- ******************************************************************************/
- void Display(void)
- {
- unsigned char b1, b2;
- b1=g_MotorNum/10;
- b2=g_MotorNum%10;
- if(FX == 0)
- P0=0x71;//顯示F
- else
- P0=0x79;
- SMG1=0;
- delayms(3);
- SMG1=1;
- P0=0x40;
- SMG2=0; //顯示--
- delayms(3);
- SMG2=1;
- P0=table[b1];
- SMG3=0; //顯示十位
- delayms(3);
- SMG3=1;
- P0=table[b2];
- SMG4=0;
- delayms(3); //顯示個位
- SMG4=1;
- }
- /********************************延時函數(shù)***********************************************************/
- void delayms(xms)
- {
- unsigned int x,y;
- for(x=xms;x>0;x--)
- for(y=110;y>0;y--);
- }
- /*********************************************************************************************************
- ** End Of File
- ********************************************************************************************************/
復(fù)制代碼
1、步進(jìn)電機(jī)控制系統(tǒng)的主程序在對整個系統(tǒng)初始化后主要完成讀鍵盤和處理鍵盤的功能,如圖3-1所示:
圖3-1 步進(jìn)電機(jī)控制系統(tǒng)主程序流程圖
系統(tǒng)上電復(fù)位后,先調(diào)用初始化子程序,對步進(jìn)電機(jī)各端口,相關(guān)參數(shù)進(jìn)行初始化,設(shè)置T0、T1工作方式控制字和時間常數(shù)。初始化完成后,步進(jìn)電機(jī)處于停止?fàn)顟B(tài),T0、T1定時器處于關(guān)閉狀態(tài)。然后循環(huán)調(diào)用讀鍵盤子程序和鍵盤處理子程序,等待中斷,以便實現(xiàn)步進(jìn)電機(jī)轉(zhuǎn)動控制和轉(zhuǎn)速的動態(tài)顯示。
2、讀鍵盤子程序流程圖讀鍵盤子程序流程圖如圖3-2所示:
圖3-2讀鍵盤子程序流程圖
首先初始化實際鍵值參數(shù)為0FH,然后掃描P3口,與初始值比較,相等則說明沒有鍵按下,不相等則軟件消抖,以便確認(rèn)是否真的有鍵按下。延時10ms后再次掃描P3口,第二次與初始值比較,若相等則表明前一次比較不相等是由抖動產(chǎn)生;如果相等則表明確實有鍵按下。此時保存鍵值到臨時變量。接著第三次掃描鍵盤并與臨時變量比較,若相等則循環(huán),這是為了確保每一次按鍵只執(zhí)行一次相應(yīng)的處理程序。最后從臨時變量取出鍵值送實際鍵值參數(shù),為鍵盤處理子程序做準(zhǔn)備。
3、 鍵盤處理子程序流程圖按鍵處理子程序流程圖如圖3-3所示:
圖3-3鍵盤處理子程序流程圖
鍵盤處理子程序開始時要從存放實際鍵值的參數(shù)中取出剛讀取到的鍵值送到累加器A,依次判斷累加器A的低四位。若檢測到低電平,則說明與該位對應(yīng)的按鍵按下,從而轉(zhuǎn)到相應(yīng)的處理子程序段,完成相應(yīng)的操作,實現(xiàn)相應(yīng)的功能后返回。若沒有檢測到高電平,則返回。
步進(jìn)電機(jī)的啟停控制通過啟停定時器0來實現(xiàn),因為定時器0控制著脈沖信號的輸出,關(guān)閉定時器0也就阻止了脈沖信號的輸出。
4、 電機(jī)控制中斷程序流程圖定時器中斷0服務(wù)程序流程圖如圖3-4所示:
圖3-4定時器中斷0服務(wù)程序流程圖
定時器中斷0服務(wù)程序的中斷時間由當(dāng)前的轉(zhuǎn)速決定。進(jìn)入中斷程序后,首先要保護(hù)現(xiàn)場,再根據(jù)當(dāng)前速度進(jìn)行計算并查表得到T0定時時間常數(shù),設(shè)置TH0和TL0的值。然后判斷轉(zhuǎn)動方向控制位的值,如果是0則控制脈沖信號循環(huán)左移并輸出,如果是1則控制脈沖信號循環(huán)右移并輸出。最后恢復(fù)現(xiàn)場,返回,等待下次中斷。
通過用當(dāng)前轉(zhuǎn)速控制中斷時間,控制了脈沖的輸出頻率,也就到達(dá)了控制步進(jìn)電機(jī)轉(zhuǎn)動速度的目的;通過檢測方向控制位的電平,選擇脈沖信號的循環(huán)左移或循環(huán)右移,控制了步進(jìn)電機(jī)各引出端的接通順序,也就到實現(xiàn)了步進(jìn)電機(jī)轉(zhuǎn)動方向的控制。
5、 數(shù)碼顯示中斷程序流程圖定時中斷1服務(wù)程序流程圖如圖3-5所示:
圖3-5定時中斷1服務(wù)程序流程圖
數(shù)碼顯示中斷程序的定時時間為1ms。進(jìn)入中斷程序后,首先要保護(hù)現(xiàn)場,然后關(guān)閉個位數(shù)碼管,根據(jù)當(dāng)前轉(zhuǎn)速求出十位與個位的值。查表得到十位的字段碼送P1口,控制十位上的數(shù)碼管顯示。然后延時1ms,接著關(guān)閉十位數(shù)碼管,查表得到個位的字段碼送P1口,控制個位上的數(shù)碼管顯示。最后重新設(shè)置定時時間,恢復(fù)現(xiàn)場并返回。
作者: l851285812 時間: 2016-11-16 19:21
頂!d=====( ̄▽ ̄*)b
作者: shorr 時間: 2017-1-24 09:52
學(xué)習(xí)。。。。。。!
作者: qpzmg 時間: 2017-2-19 11:57
好資料,感謝分享
作者: hlywhp123 時間: 2017-2-19 23:34
謝謝提供
作者: 北方哥 時間: 2017-2-20 21:07
你這貼太好了。
作者: ljhya 時間: 2017-2-21 01:11
謝謝分享
作者: qxy 時間: 2017-2-24 13:26
感謝分享
作者: qxy 時間: 2017-2-24 13:26
感謝分享
作者: 勝戰(zhàn) 時間: 2017-2-26 17:51
感謝樓主分享
作者: cymcym 時間: 2017-3-28 12:11
51單片機(jī)學(xué)習(xí)板能用這程序控制直流電機(jī)嗎?
作者: 帥哥廣 時間: 2017-5-5 08:30
好資料,感謝分享
作者: yuyuchenfeng 時間: 2017-6-1 16:48
下載下來看看,不知道怎么用,先摸索起來
作者: jwjjwj123 時間: 2017-6-2 12:20
謝謝分享。。。
作者: gdatgb 時間: 2017-6-2 15:33
感謝樓主分享! 下載下來看看
作者: lehigh 時間: 2017-7-12 19:25
光給個代碼,放著仿真圖,尷尬
作者: tjaihy 時間: 2017-7-23 11:04
樓主,這個程序是L297驅(qū)動程序吧 ?請問L298的有嗎 ?
作者: q1833605807 時間: 2017-8-7 19:10
樓主有mirostep driver驅(qū)動的嘛
作者: haxiny 時間: 2017-8-14 10:30
目前正好需要這個。 謝謝樓主分享!
作者: shiftshift 時間: 2017-8-20 22:13
謝謝分享。。。!!!
作者: 走著走著就散了 時間: 2017-9-20 12:07
正好在做個東西,謝謝分享
作者: woaiheihei 時間: 2017-9-20 18:30
學(xué)習(xí)了 謝謝
作者: cenadzkj 時間: 2017-9-26 22:53
感謝分享
作者: xymiss 時間: 2017-10-7 10:30
厲害,這個全面,按圖接線試一下
作者: 583653368 時間: 2017-10-20 11:11
找了很久 應(yīng)該有用 學(xué)習(xí)中
作者: mzw1997724 時間: 2017-11-24 14:56
感謝樓主分享
作者: huangbin6262 時間: 2017-11-27 16:16
很好的學(xué)習(xí)材料
作者: cxdtrj 時間: 2018-2-22 18:12
只有源碼,沒有仿真
作者: casanava 時間: 2018-3-3 11:32
樓主,你用的兩相還是三相的步進(jìn)電機(jī)?三相步進(jìn)電機(jī)好象價格挺高哦
作者: 祝云章 時間: 2018-3-7 22:04
很好,感謝分享
作者: believe1 時間: 2018-3-12 17:02
非常感謝分享,很有幫助!
作者: dxk 時間: 2018-3-20 16:18
厲害厲害,受教了
作者: 龍行天下9558 時間: 2018-4-5 19:51
謝謝老鐵的分享
作者: Q314703 時間: 2018-4-21 16:33
謝謝提供,很有啟發(fā)
作者: superle 時間: 2018-4-27 16:17
沒有PROTEUS仿真圖啊
作者: 906267461 時間: 2018-4-28 11:57
謝謝分享
作者: shiwenyu 時間: 2018-4-28 21:42
厲害了,這個實用,不錯
作者: 51學(xué)徒 時間: 2018-5-11 00:13
樓主,能把數(shù)碼管改成lcd1602顯示嗎,有重賞
作者: 51學(xué)徒 時間: 2018-5-11 00:15
把數(shù)碼管換乘lcd1602顯示的程序有嗎?有重謝
作者: mfkfnhyxk123 時間: 2018-5-14 21:29
謝謝分享
作者: hao05020 時間: 2018-6-16 21:33
謝謝分享
作者: xiahailong90 時間: 2018-6-26 12:10
謝謝分享
作者: AOP 時間: 2018-6-29 23:00
有人做過嗎?效果如何。。。。。。。。。。。。。。。
作者: 小蜜蜂o 時間: 2018-9-9 16:08
是集成ic的,沒有脈沖信息
作者: dww465757120 時間: 2018-9-12 13:30
說好的全部資料呢,為啥只有程序
作者: 親衛(wèi)隊請問我去 時間: 2018-9-19 22:20
厲害了
作者: QNTAN 時間: 2018-10-26 20:12
厲害,這個全面,按圖接線試一下
作者: rsm 時間: 2019-1-1 21:47
謝謝分享!
作者: 1696767363 時間: 2019-1-2 10:10
感謝樓主分享
作者: 快樂眼淚 時間: 2019-1-2 20:21
感謝樓主分享
作者: hufter 時間: 2019-4-9 21:46
為什么程序流程圖看不到?
作者: luckzsh 時間: 2019-4-10 00:30
謝謝分享
作者: fangqiu0510 時間: 2019-5-21 20:38
謝謝分享
作者: 小屁歪歪 時間: 2019-12-14 18:16
厲害了,大佬
作者: 浮云人生 時間: 2020-2-19 15:15
可以用嗎?
作者: 99312312 時間: 2020-2-20 08:49
謝謝分享 感恩付出 新手路過
作者: lbjjshh 時間: 2021-5-27 16:13
老哥們,請問流程圖在哪里啊
作者: GHPWYC 時間: 2023-3-27 12:34
程序流程圖可以分享嗎,謝謝
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |