步進電機實際上是一個數(shù)字/角度轉換器,也是一個串行的數(shù)/模轉換器。因此,需把并行的二進制轉換成串行的脈沖序列,并實現(xiàn)方向控制。每當步進電機脈沖輸入線上得到一個脈沖,它便沿著特定的方向走一步。
設計要求:
采用單片機來控制一個三相單三拍的步進電機工作。步進電機的旋轉方向由正反轉控制信號來控制。步進電機的步數(shù)由鍵盤輸入,可輸入的步數(shù)分別為3,6,9,12,15,18,21,24,27步。并且鍵盤具有鍵盤鎖的功能,當鍵盤上鎖的時候,步進電機是不接受輸入步數(shù)的,也不會運轉。只有當鍵盤鎖打開并輸入步數(shù)的時候,步進電機才開始工作 。電機運轉的時候有正轉和反轉指示燈指示。當電機在運轉的過程當中,如果過熱,則電機停止運轉,同時紅色指示燈亮.,同時警報響。
目錄
1、緒論4
2、方案論證(規(guī)劃、選定)7
3、方案說明(設計)7
4、硬件方案設計8
5、軟件方案設計12
6、調(diào)試13
7、技術小結(結束語)14
8、參考文獻15
9、附錄(源程序代碼、電路圖等)16
1. 緒論 1.1步進電機是用電脈沖信號控制,以實現(xiàn)對生產(chǎn)過程或設備的數(shù)字控制,它是過程控制中一種十分重要和常用的功率執(zhí)行器件,它可以把脈沖信號轉換成角位移,并且可用作電磁制動輪、電磁差分器或角位移發(fā)生器等,近年來由于計算機應用技術的迅速發(fā)展,步進電機常常和計算機一起組成高精度的數(shù)字控制系統(tǒng)。由于它是由數(shù)字脈沖控制,因此非常適合于用單片機控制,本設計便是在此基礎上,AT89C51型單片機為核心,并結合外圍電路以步進電機為控制對象的控制系統(tǒng)。
1.2單片機控制步進電機原理 步進電機的不同驅動方式,都是在工作時,脈沖信號按一定順序輪流加到三相繞組上,從而實現(xiàn)不同的工作狀態(tài)。由于通電順序不同,其運行方式有三相單三相拍、三相雙三拍和三相單、雙六拍三種(注意:上面“三相單三拍”中的“三相”指定子有三相繞組;“拍”是指定子繞組改變一次通電方式;“三拍”表示通電三次完成一個循環(huán)。“三相雙三拍”中的“雙”是指同時有兩相繞組通電)。 1.2.1三相單三拍運行方式:下頁圖所示為反應式步進電動機工作原理圖,若通過脈沖分配器輸出的第一個脈沖使A相繞組通電,B,C相繞組不通電,在A相繞組通電后產(chǎn)生的磁場將使轉子 上產(chǎn)生反應轉矩,轉子的1、3齒將與定子磁極對齊,如果圖(a)所示。第二個脈沖到來,使B相繞組通電,而A、C相繞組不通電;B相繞組產(chǎn)生的磁場將 使轉子的2、4齒與B相磁極對齊,如圖(b)所示,與圖(a)相比,轉子逆時針方向轉動了一個角度。第三個脈沖到來后,是C相繞組通電,而 A、B相不通電,這時轉子的1、3齒會與C組對齊,轉子的位置如圖(c)所示,與圖(b)比較,又逆時針轉過了一個角度。 
圖1.1 反應式步進電機工作原理圖 當脈沖不斷到來時,通過分配器使定子的繞組按著A相--B相--C相--A相……的規(guī)律不斷地接通與斷開,這時步進電動機的轉子就連續(xù)不停地一步步的逆時 針方向轉動。如果改變步進電動機的轉動方向,只要將定子各繞組通電的順序改為A相--C相--B相--A相,轉子轉動方向即改為順時針方向。 單三拍分配方式時,步進電動機由A相通電轉換到B相通電,步進電動機的轉子轉過一個角度,稱為一步。這時轉子轉過的角度是30度。步進電動機每一步轉過的角度稱為步距角。 1.2.2三相雙三拍運行方式三相雙三拍運行方式:每次都有兩個繞組通電,通電方式是AB--BC--CA--AB……,如果通電順序改為AB--CA--BC--AB……則步進電機反轉。雙三拍分配方式時,步進電動機的步距角也是30度 1.2.3三相單,雙六拍運行方式:三相六拍分配方式就是每個周期內(nèi)有六個通電狀態(tài)。這六中通電狀態(tài)的順序可以使A--AB--B--BC--C--CA--A……或者A-- CA--C--BC--B--AB--A……六拍通電方式中,有一個時刻兩個繞組同時通電,這時轉子齒的位置將位于通電的兩相的中間位置。在三相六拍分配 方式下,轉子每一步轉過的角度只是三相三拍方式下的一半,步距角是15度。 單三拍運行的突出問題是每次只有一相繞組通電,在轉換過程中,一相繞組斷電,另一相繞組通電,容易發(fā)生失步;另外單靠一相繞組通電吸引轉子,穩(wěn)定性不好,容易在平衡位置附近震蕩,故用的較少。 雙三拍運行的特點是每次都有兩相繞組通電,且在轉換過程中始終有一相繞組保持通電狀態(tài),因此工作穩(wěn)定,且步距角與單三拍相同。 六拍運行方式轉換時始終有一相繞組通電,且步距角較小,故工作穩(wěn)定性好,但電源較復雜,實際應用較多。
2.方案論證 2.1本設計由于需要實現(xiàn)9個不同部數(shù)的輸入以及其他功能的輸入,所以可以采用鍵盤輸入,實現(xiàn)步進電機的步數(shù)由鍵盤輸入且具有鍵盤鎖功能。而本實驗單片機的端口數(shù)量充足,最后決定直接采用鍵盤輸入。 2.2在步進電機方面由于此次設計的軟件采用proteus,在此軟件中只有一個四相步進電機的模型,然后考慮到步進電機控制方法的難易度最后決定采用四相八拍控制法,由于單片機不能直接驅動步進電機,通過芯片放大控制電壓。 2.3在測量溫度方面一開始打算用一個溫度傳感器開關去實現(xiàn)監(jiān)測電機的溫度,當溫度過高的時候就斷開開關;但考慮到系統(tǒng)的可操作性,準確性,編程的難以度及仿真軟件的限制,最后決定用DS18B20代替電機的測量系統(tǒng),實現(xiàn)電機在運動過程中,如果過熱,則電機停止運轉,同時紅色指示燈亮,同時報警。而轉向方面用不同的指示燈指示正轉和反轉。當溫度超過安全溫度時,報警燈會亮和報警鈴會鳴響,并讓電機停止運轉同時鎖住鍵盤。
3.方案說明 步進電機和普通電動機不同之處是步進電機接受脈沖信號的控制。即步進電機是將電脈沖信號轉換為機械角位移的執(zhí)行元件。步進電機的控制可以用硬件,也可以用軟件通過單片機實現(xiàn)。硬件方法是采用脈沖分配器芯片進行通用換相控制;而軟件方法是用單片機產(chǎn)生控制脈沖來控制步進電機的運行狀態(tài),這種方法可簡化電路,降低成本。 在用軟件控制時,主要設計要點如下: - 判斷旋轉方向;
- 按相序確定控制字;
- 按順序輸入控制字;
- 確定控制步數(shù)和每一步的延時時間。
由于單片機的驅動電流一般都比較小,不能直接驅動電機工作,所以單片機的I/O口輸出必須接驅動電路,即功率驅動,才得以控制電機正常工作。控制框圖如下圖所示: 開始啟動時點擊處于停止轉動狀態(tài),用鍵盤按鍵控制鍵盤鎖、步數(shù)、正轉、反轉。用80c51作為總控制芯片。ULN2003用于步進電機的驅動控制。其中在鍵盤控制時用鍵盤掃描程序。 圖3.1 總方案圖 4.硬件方案設計 系統(tǒng)硬件設計 4.1最小單片機系統(tǒng) 5V電源:給系統(tǒng)供電。 復位電路:程序跑飛時復位電路可以使程序從新執(zhí)行,相當于電腦的重啟。 晶振:給單片機運行提供時鐘。 EA接高電平:表示運行內(nèi)部程序存儲器下載的程序。 P0接排阻:P0口開漏結構,使用時一般接排阻拉高電平。 4.2鍵盤設計 該電路中采用獨立鍵盤工作方式,共設有十二個按鍵,分別是3,6,9,12,15,18,21,24,27布局選擇功能,鍵盤鎖功能以及步進電機轉動方向選擇功能。其中有程序決定起作用。 4.3步進電機 步進電機的驅動采用ULN2003,接到單片機的P1.0~P1.3,如圖步進電機驅動和單片機連線圖。
4.4正反轉顯示燈和報警燈鈴
4.5溫度傳感器模塊 5.軟件設計 主程序流程圖所示如下: 6.調(diào)試 6.1 Proteus仿真軟件 Proteus是世界上著名的EDA工具(仿真軟件),從原理圖布圖、代碼調(diào)試到單片機與外圍電路協(xié)同仿真,一鍵切換到PCB設計,真正實現(xiàn)了從概念到產(chǎn)品的完整設計。是目前世界上唯一將電路仿真軟件、PCB設計軟件和虛擬模型仿真軟件三合一的設計平臺,其處理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列處理器,并持續(xù)增加其他系列處理器模型。在編譯方面,它也支持IAR、Keil和MPLAB等多種編譯器。 6.2 調(diào)試步驟及方法 本電路經(jīng)調(diào)試符合題目要求,各項技術指標均達到設計的目的。具體操作控制方法如下: 1、當電機按下啟動按鈕時,步進電機根據(jù)制定默認狀態(tài)開始轉動; 2、當電機按下停止按鈕時,步進電機停止轉動; 3、當電機按下正轉按鈕時,步進電機正轉; 4、當電機按下反轉按鈕時,步進電機反轉; 5﹑當電機按下步數(shù)按鈕時,步進電機根據(jù)步數(shù)實現(xiàn)轉動
7.技術小結 為期一周的單片機課程設計在忙碌中已接近尾聲,經(jīng)過這么多天的努力,終于完成了這次課程設計基本設計要求,在充實中也學到了很多知識,是真正將所學知識運用于實踐中的一次很好的體驗,使人受益匪淺。由于此次控制要求不是很高,選用51系列80C51。接下來就是硬件接口分配問題和如何去驅動電機。對于步進電機之前沒有什么接觸,所以我上網(wǎng)查了許多關于步進電機的資料,知道了其基本工作原理以及怎么去實現(xiàn)其控制運轉和驅動。接下來的主要問題就是如何編程去實現(xiàn)控制它了,這次程序的編寫和調(diào)試對我來說是個不小的挑戰(zhàn),因為之前只編寫過一些簡短的小程序,對較大的程序總體性方面還不能很好的把握。經(jīng)過反復的嘗試和調(diào)試,用發(fā)現(xiàn)一個問題,解決一個問題的方法,還參考了一些別人的經(jīng)驗方法,完成了程序的編寫。這對我以后編寫程序是一次很好的經(jīng)驗積累。通過這次課程設計,我也了解到了自己的不足,以前自己學習單片機的時候,往往只去看懂別人寫的程序,以為看懂了自己就知道寫了,但事實并不是這樣,雖然這次課程設計程序是完成了,但棘手的地方很多,編程并不像以前認為的簡單。所以在以后的學習中,不能手高眼低,一定要腳踏實地,一步步地走,自己動手去做,這樣才能將知識真正學到手。這次課程設計能得以順利完成,還要感謝毛老師的指導,感受很深,是一次很好的經(jīng)驗積累和設計經(jīng)歷。
仿真圖
單片機源程序如下: - #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define led P0//數(shù)碼管段選
- #define haha P2
- sbit s1 = P0^1;
- sbit s2 = P0^2;//按鍵定義,s1正轉,s2反轉
- sbit s3 = P0^3;//按鍵定義,停止
- sbit speaker = P0^4;
- sbit LED1 = P0^5;
- sbit LED2 = P0^6;
- sbit LED3 = P0^7;
-
- sbit a = P2^3;
- sbit b = P2^2;
- sbit c = P2^1;
- sbit d = P2^0;//脈沖信號輸入端定義
-
- sbit _key3 =P1^0; //3步
- sbit _key6 =P1^1; //6步
- sbit _key9 =P1^2; //9步
- sbit _key12 =P1^3; //12步
- sbit _key15 =P1^4; //15步
- sbit _key18 =P1^5; //18步
- sbit _key21 =P1^6; //21步
- sbit _key24 =P1^7; //24步
- sbit _key27 =P0^0; //27步
-
- unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 顯示段碼值0~9
- unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應相應的數(shù)碼管點亮,即位碼
- unsigned char TempData[8]; //存儲顯示值的全局變量
-
- /*------------------------------------------------
- DS18B20 端口定義
- ------------------------------------------------*/
- sbit DQ=P2^7;//ds18b20 端口
- bit ReadTempFlag;//定義讀時間標志
- /*------------------------------------------------
- 函數(shù)聲明
- ------------------------------------------------*/
- unsigned int ReadTemperature(void);
- bit Init_DS18B20(void);
- unsigned char ReadOneChar(void);
- void WriteOneChar(unsigned char dat);
- void DelayUs2x(unsigned char t);
- void DelayMs(unsigned char t);
- void _18b20(void);
- //DS18B20定義
- /*-----------------------------------------------*/
-
- uchar code display[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共陽數(shù)碼管驅動信號0---9,不顯示
- uchar code time_counter[10][2]={{0xda,0x1c},{0xde,0xe4},{0xe1,0xec},{0xe5,0xd4},{0xe9,0xbc}, //9.7 ----1ms
- {0xed,0xa4},{0xf1,0x8c},{0xf5,0x74},{0xf9,0x5c},{0xfc,0x18}};
- uchar num1 = 0;//控制取勵磁信號變量
- uchar num2 = 8;
- uchar bushu = 0;
-
- uchar k=1;//加減檔位控制,1為最小檔
- bit flag1 = 0;//初始正轉,正反轉標志
- uchar buf[4]={0,10,10,1};//數(shù)碼管顯示緩存,正轉,不顯示,不顯示,顯示1檔位,高----低(不能去掉)
- void key(void);
- void keyscan(void);
- //================================定時器0/1初始化函數(shù)================================
- void T0_T1_init()
- {
- TMOD = 0x11;//定時器0/1均工作于方式1,16位計時方式
- TH0 = (65536 - 4000)/256;
- TL0 = (65536 - 4000)%256;//定時器0,定時4ms用于數(shù)碼管掃描顯示
- TH1 = time_counter[k-1][0];
- TL1 = time_counter[k-1][1];//定時器1,定時10ms用于步進電機轉速控制
- TR0 = 1;
- TR1 = 1;
- ET0 = 1;
- ET1= 1;//開定時器中斷
- EA = 1;//開總中斷
- }
- //================================ms級延時函數(shù)=======================================
- void delay1m(uint x)
- {
- uint i,j;
- for(i=0;i<x;i++) //連數(shù)x次,約 x ms
- for(j=0;j<120;j++); //數(shù)120 次,約1 ms
- }
- //================================主函數(shù)=============================================
- void main()
- {
- T0_T1_init();
- Init_DS18B20();
- //buf[1] = 10;//不顯示
- LED3 = 1; speaker =1;
- while(1)
- {
- if(s1 == 0)
- {
- delay1m(3);
- if(s1 == 0)
- {
- flag1 = 0;//正轉
- haha = 0x00;//停止
-
- }
- while(!s1);
- }
- if(s2 == 0)
- {
-
- delay1m(3);
- if(s2 == 0)
- {
- flag1 = 1;//反轉
- haha = 0x00;//停止
- }
- while(!s2);
- }
- if(s3 == 0) {
- delay1m(3);
- if(s3 == 0) {
- EA = 0;
- LED2 = 1;
- LED1 = 1;
- LED3 = 1; speaker =1;
- }
- }
- else {
- EA = 1;
- }
- key();
- _18b20();
- }
-
- }
- //==================================定時器1中斷函數(shù),用于脈沖頻率控制=====================================
- void time1_interrupt()interrupt 3
- {
- static num1 = 0;
- static num2 = 0;
- uchar m = 0;
- TH1 = time_counter[k-1][0];
- TL1 = time_counter[k-1][1];//定時器1,定時1 用于步進電機轉速控制
- m = bushu;
- for(;m > 0; m--) {
- if(flag1 == 0)//正轉
- {
- LED3 = 1;speaker =1;
- LED1 = 0;
- LED2 = 1;
- switch(num1)
- {
- case 0:a = 1;b = 0;c = 0;d = 0;break;
- case 1:a = 1;b = 1;c = 0;d = 0;break;
- case 2:a = 0;b = 1;c = 0;d = 0;break;
- case 3:a = 0;b = 1;c = 1;d = 0;break;
- case 4:a = 0;b = 0;c = 1;d = 0;break;
- case 5:a = 0;b = 0;c = 1;d = 1;break;
- case 6:a = 0;b = 0;c = 0;d = 1;break;
- case 7:a = 1;b = 0;c = 0;d = 1;break;
- }
- num1++;
- if(num1 == 8)num1 = 0;
- }
- else //反轉
- {
- LED3 = 1;speaker =1;
- LED1 = 1;
- LED2 = 0;
- switch(num2)
- {
- case 0:a = 1;b = 0;c = 0;d = 1;break;
- case 1:a = 0;b = 0;c = 0;d = 1;break;
- case 2:a = 0;b = 0;c = 1;d = 1;break;
- case 3:a = 0;b = 0;c = 1;d = 0;break;
- case 4:a = 0;b = 1;c = 1;d = 0;break;
- case 5:a = 0;b = 1;c = 0;d = 0;break;
- case 6:a = 1;b = 1;c = 0;d = 0;break;
- case 7:a = 1;b = 0;c = 0;d = 0;break;
- }
- num2++;
- if(num2 == 8)num2 = 0;
- }
- }
- }
-
- void key()
- {
- if(s3 == 1) //這里開關閉合,表示鍵盤鎖打開。如果開關不閉合,表示上鎖,電機不轉
- {
- delay1m(100);
- if(s3 == 1) {
- if(_key27==0) bushu=27; //步數(shù)高的優(yōu)先,即多個步數(shù)開關同時打上,運行高步數(shù)
- else if(_key24==0) bushu=24;
- else if(_key21==0) bushu=21;
- else if(_key18==0) bushu=18;
- else if(_key15==0) bushu=15;
- else if(_key12==0) bushu=12;
- else if(_key9==0) bushu=9;
- else if(_key6==0) bushu=6;
- else if(_key3==0) bushu=3;
- }
- }
- }
- //以下為18B20程序
- /*------------------------------------------------
- 18b20初始化
- ------------------------------------------------*/
- bit Init_DS18B20(void)
- {
- bit dat=0;
- DQ = 1; //DQ復位
- DelayUs2x(5); //稍做延時
- DQ = 0; //單片機將DQ拉低
- DelayUs2x(200); //精確延時 大于 480us 小于960us
- DelayUs2x(200);
- DQ = 1; //拉高總線
- DelayUs2x(50); //15~60us 后 接收60-240us的存在脈沖
- dat=DQ; //如果x=0則初始化成功, x=1則初始化失敗
- DelayUs2x(25); //稍作延時返回
- return dat;
- }
-
- /*------------------------------------------------
- 讀取一個字節(jié)
- ------------------------------------------------*/
- unsigned char ReadOneChar(void)
- {
- unsigned char i=0;
- unsigned char dat = 0;
- for (i=8;i>0;i--)
- {
- DQ = 0; // 給脈沖信號
- dat>>=1;
- DQ = 1; // 給脈沖信號
- if(DQ)
- dat|=0x80;
- DelayUs2x(25);
- }
- return(dat);
- }
- /*------------------------------------------------
- 寫入一個字節(jié)
- ------------------------------------------------*/
- void WriteOneChar(unsigned char dat)
- {
- unsigned char i=0;
- for (i=8; i>0; i--)
- {
- DQ = 0;
- DQ = dat&0x01;
- DelayUs2x(25);
- DQ = 1;
- dat>>=1;
- }
- DelayUs2x(25);
- }
-
- /*------------------------------------------------
- 讀取溫度
- ------------------------------------------------*/
- unsigned int ReadTemperature(void)
- {
- unsigned char a=0;
- unsigned int b=0;
- unsigned int t=0;
- Init_DS18B20();
- WriteOneChar(0xCC); // 跳過讀序號列號的操作
- WriteOneChar(0x44); // 啟動溫度轉換
- DelayMs(10);
- Init_DS18B20();
- WriteOneChar(0xCC); //跳過讀序號列號的操作
- WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
- a=ReadOneChar(); //低位
- b=ReadOneChar(); //高位
-
- b<<=8;
- t=a+b;
-
- return(t);
- }
-
- /*------------------------------------------------
- uS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
- unsigned char 是定義無符號字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
- 長度如下 T=tx2+5 uS
- ------------------------------------------------*/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
-
- /*------------------------------------------------
- mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
- unsigned char 是定義無符號字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時請使用匯編
- ------------------------------------------------*/
- void DelayMs(unsigned char t)
- {
-
- while(t--)
- {
- //大致延時1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
-
- /*------------------------------------------------
- 定時器中斷子程序
- ------------------------------------------------*/
- void Timer0_isr(void) interrupt 1
- {
- static unsigned int num;
- TH0=(65536-2000)/256; //重新賦值 2ms
- TL0=(65536-2000)%256;
- num++;
- if(num==300) //
- {
- num=0;
- ReadTempFlag=1; //讀標志位置1
- }
- }
-
- void _18b20(void) {
- unsigned int TempH,TempL,temp; //TempH,TempL
- if(ReadTempFlag==1)
- {
- ReadTempFlag=0;
- temp=ReadTemperature();
- if(temp&0x8000)
- {
- TempData[0]=0x40;//負號標志
- temp=~temp; // 取反加1
- temp +=1;
- }
- else
- TempData[0]=0;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (29.58 KB, 下載次數(shù): 58)
下載附件
2019-1-25 15:15 上傳
完整的Word格式文檔51黑下載地址:
單片機三相單三拍步進電機.doc
(1.6 MB, 下載次數(shù): 49)
2019-1-25 14:25 上傳
點擊文件名下載附件
三相單三拍步進電機 下載積分: 黑幣 -5
|