隨著電子科學技術的發展,步進電機的應用越來越廣泛。微型步進電機在選擇減速電機時要看下驅動IC的角度看步進電機,微型步進電機是由微型電機和步進電機的統稱。步進電機運用在多種場合,在現代控制領域使用廣泛,有著重要作用。步進電機是一種將電脈沖信號轉換成相應角位移或線位移的電動機。每輸入一個脈沖信號,轉子就轉動一個角度或前進一步,其輸出的角位移或線位移與輸入的脈沖數成正比,轉速與脈沖頻率成正比。
本次設計中,要求設計三相步進電機計算機控制系統硬件電路。其中硬件電路由單片機、接口電路、驅動電路、顯示電路、開關電路等組成。設計單三拍、雙三拍、三相六拍步進電機控制流程設計;設計三相六拍步進電機起停控制、正反轉控制、及加速及減速控制程序實現及調試。通過編寫正確的程序,并使用仿真軟件PROTEUS進行該控制系統的仿真。
計算機控制系統包括硬件、軟件和控制算法3個方面,一個完整的設計還需要考慮系統的抗干擾性能,使系統能長期有效地運行[1],計算機控制技術是一門以電子技術、自動控制技術、計算機應用技術為基礎,以計算機控制技術為核心,綜合可編程控制技術、單片機技術、計算機網絡技術。
1.1 設計背景
步進電機是一種用電脈沖信號進行控制,并將電脈沖信號轉換成相應的角位移或。線位移的控制驅動裝置。由于步進電機是受脈沖信號控制的,因此適合于作為數字控制系統的伺服元件。步進電機的線圈中每輸入一個脈沖,轉子就旋轉一個步距角,它的速度和控制脈沖嚴格同步,通過改變脈沖頻率的高低就可以在很大范圍內調節電機的轉速。由于步進電機具有精度高、控制靈活、定位準確、工作可靠,能直接接受交換數字信號等特點,因此廣泛地應用在計量測試儀器中。
設計一個基于單片機AT89S52的計算機步進電機控制系統,使用數字控制器進行步進電機的起停、正、反轉控制以及步進電機的加速、減速控制,主要有以下四個方面的要求:
組建一個使用單片機AT89S52作為控制器的三相步進電機控制系統。
用K0-K2作為通電方式選擇鍵,K0為單三拍,K1為雙三拍,K2為三相六拍;K3、K4分別為啟動和方向控制;正轉時紅色指示燈亮,反轉時黃色指示燈亮,不轉時綠色指示燈亮;用K5-K12作為步數的給定值;用3位LED顯示剩余工作步數。
根據設計要求進行硬件線路圖設計,選擇合適的器件,進行硬件電路圖設計。
編寫程序,實現相應功能。
進行程序調試,模擬仿真
晶振電路一般的晶振振蕩電路都是在一個反相放大器(注意是放大器不是反相器)的兩端接入晶振,再有兩個電容分別接到晶振的兩端,每個電容的另一端再接到地,這兩個電容串聯的容量值就應該等于負載電容。晶體振蕩器,簡稱晶振。在電氣上它可以等效成一個電容和一個電阻并聯再串聯一個電容的二端網絡,電工學上這個網絡有兩個諧振點,以頻率的高低分其中較低的頻率是串聯諧振,較高的頻率是并聯諧振。由于晶體自身的特性致使這兩個頻率的距離相當的接近,在這個極窄的頻率范圍內,晶振等效為一個電感,所以只要晶振的兩端并聯上合適的電容它就會組成并聯諧振電路。這個并聯諧振電路加到一個負反饋電路中就可以構成正弦波振蕩電路,由于晶振等效為電感的頻率范圍很窄,所以即使其他元件的參數變化很大,這個振蕩器的頻率也不會有很大的變化。晶振有一個重要的參數,那就是負載電容值,選擇與負載電容值相等的并聯電容,就可以得到晶振標稱的諧振頻率。如圖 2?3所示: 
圖 2?3晶振電路 2.3 復位電路復位是單片機的初始化工作,復位后中央處理器CPU和單片機內的其它功能部件都處在一定的初始狀態,并從這個狀態開始工作。為了防止程序執行過程中失步或運行紊亂,此處我們采用了上電復位,電路圖如下圖 2?4所示: 
圖 2?4復位電路 單片機最小系統是單片機運行的最基本條件:電源,單片機芯片,晶振電路,復位電路。電源為整個系統供能,單片機芯片運行程序,處理數據;晶振電路為單片機工作提供節拍,常被理解為單片機心臟;復位電路,在單片機上電時需要復位使程序從頭開始運行。 2.4 工作方式選擇模塊用K0-K2作為通電方式選擇鍵,K0為單三拍,K1為雙三拍,K2為三相六拍;K3、K4分別為啟動和方向控制;如下圖 2?5所示: 
圖 2?5工作方式選擇模塊圖 2.5 電動機及驅動步進電機模塊如下圖 2?6所示 
圖 2?6電動機模塊 2.5.1 步進電機本次設計采用的是步進電機,如下圖 2?7所示。 
圖 2?7步進電機實物圖 步進電機的不同驅動方式,都是在工作時,脈沖信號按一定順序輪流加到三相繞組上,從而實現不同的工作狀態。由于通電順序不同,其運行方式有三相單三相拍、三相雙三拍和三相單、雙六拍三種(注意:上面“三相單三拍”中的“三相”指定子有三相繞組;“拍”是指定子繞組改變一次通電方式;“三拍”表示通電三次完成一個循環。“三相雙三拍”中的“雙”是指同時有兩相繞組通電)。 2.5.2 驅動電路ULN2003A電路是美國Texas+Instruments公司和Sprague公司開發的高壓大電流達林頓晶體管陣列電路。ULN2003是高耐壓、大電流、內部由七個硅NPN和達林頓管組成的驅動芯片,如圖 2?8所示。經常在以下電路中使用,作為:顯示驅動、繼電器驅動、照明燈驅動、電磁閥驅動、伺服電機、步進電機驅動等電路中。該電路的特點如下:ULN2003的每一對達林頓都串聯一個2.7K的基極電阻,在5V的工作電壓下它能與TTL和CMOS電路直接相連,可以直接處理原先需要標準邏輯緩沖器來處理的數據。ULN2003 是高壓大電流達林頓晶體管陣列系列產品,具有電流增益高、工作電壓高、溫度范圍寬、帶負載能力強等特點,適應于各類要求高速大功率驅動的系統。ULN2003 工作電壓高,工作電流大,灌電流可達500mA,并能在關態時承受50V 的電壓,輸出還可以在高負載電流并行運行。 
圖 2?8ULN2003邏輯圖 2.6 狀態顯示模塊LED發光二極管顯示步進電機的工作狀態,它們分別接到單片機的P3.4~P3.6。如下圖 2?9所示,讓單片機連接到LED陰極,LED陽極接VCC。這樣通過設置端口電平就能使LED亮滅,達到顯示效果。本設計中,綠燈代表停止,紅燈代表正轉,黃燈代表反轉。 
圖 2?9LED狀態顯示 2.7 數碼管顯示LED數碼管實際上是由七個發光管組成8字形構成的,加上小數點就是8個。這些段分別由字母a,b,c,d,e,f,g,dp來表示。當數碼管特定的段加上電壓后,這些特定的段就會發亮,以形成我們眼睛看到的字樣了。通過分時輪流控制各個LED數碼管的COM端,就使各個數碼管輪流受控顯示,這就是動態驅動。 本課題采用六位共陰極數碼管來對電機步數,速度擋位進行顯示。電路如下,接在單片機P0口,P0必須添加上拉電阻,以為P0扣不加上拉電阻時處于開漏狀態,只允許輸出低電平,加上拉電阻后可輸出高電平。電路如下圖 2?10示。 
圖 2?10數碼管電路 2.8 本章小結本章主要是對硬件設計的描述。先是呈現出總硬件系統框圖及AT89S52單片機的接口及各種特性,再進行各部分電路的設計的原理,即:晶振電路,復位電路,工作方式選擇模塊,驅動電路,電機工作狀態顯示部分,數碼管顯示部分。 第3章 軟件設計3.1 功能框圖步進電機控制系統功能框圖如下圖 3?1所示,說明了每個模塊與單片機之間的聯系,控制邏輯;通過單片機控制掃描,數碼管顯示,LED顯示,步進電機控制等。 
圖 3?1功能框圖 3.2 主流程圖
圖 3?2主流程圖 首先進行工作方式選擇,如圖圖 3?2所示,按下啟動按鈕,單片機判斷是否啟動,如果沒啟動綠燈亮,啟動后單片機查詢電機的工作模式,K0為單三拍,K1為雙三拍,K2為三相六拍。再查詢電機的指定步數,接著判斷電機正轉還是反轉,正轉紅燈亮,反轉時紅燈亮。由此可以讓步進電機按照指定的方式運轉,并且剩余步數顯示到數碼管上;單片機判斷步數是否走完。
3.3 步進電機模塊3.3.1 步進電機工作方式說明(1)三相單三拍工作方式
如表 3?1,在這種工作方式下,A、B、C三相輪流通電,電流切換三次,磁場旋轉一周,轉子向前轉過一個齒距角。因此這種通電方式叫做三相單三拍工作方式。A-B-C為正轉,C-B-A為反轉,這時步距角θb (度)為 (公式1) 式中:m──步進電機工作拍數; z ──轉子齒數
51hei.png (4.2 KB, 下載次數: 71)
下載附件
2020-11-16 16:18 上傳
(2)雙三拍工作方式
如表 3?2,在這種工作方式下,每次都是有兩相導通,兩相繞組處在相同電壓之下,以AB─BC─CA─AB (或反之)方式通電,故稱為雙三拍工作方式。以這種方式通電,轉子齒所處的位置相當于六拍控制方式中去掉單三拍后的三個位置。它的步距角計算公式與單三拍時的公式相同。
極分度角/齒距角= R + k·1/m
進一步化簡得齒數z:
(公式2)
式中:m──相數; q──每相的極數; k──≤ (m - 1)的正整數;
R──正整數,為0、1、2、3……。 表 3?2 三相雙三拍的相位控制
51hei.png (12.46 KB, 下載次數: 67)
下載附件
2020-11-16 16:20 上傳
(3)三相六拍工作方式
如表 3?3,在這種工作方式下,繞組以A—AB—B—BC—C—CA—A時序(或反時序)轉換6次,磁場旋轉一周,轉子前進一個齒距,每次切換均使轉子轉動1. 5°,故這種通電方式稱為三相六柏工作方式。其步距角θb 為:
(公式3)式中:m──步進電機工作拍數; z ──轉子齒數
51hei.png (15.65 KB, 下載次數: 77)
下載附件
2020-11-16 16:19 上傳
關鍵模塊設計3.4.1 三相步進電機模塊設計設計說明:在此設計中,采用的是三相步進電機,對于步進電機模塊的程序設計采用循環程序設計方法。先把正反轉向的控制模型存放在內存單元中,然后再逐一從單元中取出控制模塊并輸出。首先啟動,選擇步進電機的拍數,輸入步數,然后讀入正反轉的控制模型驅動步進電機轉動 三相步進電機的流程框圖,如圖 3?3所示: 
圖 3?3 三相步進電機的流程框圖 3.4.2 顯示模塊設計設計說明:顯示模塊是用4位七段數碼管來顯示工作步數。先將顯示碼存入數組中,指向最左邊一位,然后取出要顯示的數據,指向換碼表首地址,取出顯示碼,從P0口輸出顯示碼,P2口輸入位選碼,顯示出4位工作步數,最后修改數組地址,求下一位位選碼繼續顯示。如圖 3?4所示。 
圖 3?4 數碼管顯示原理 3.5 本章小結本章主要描述了步進電機實現過程軟件的設計思路,包括功能框圖,主流程圖,步進電機模塊,關于工作方式的說明,數碼管顯示設計。 第4章 測試和驗證4.1 任務分工本次設計我們小組共4人,a主要負責了對于系統控制的電路設計。b負責了系統程序的編寫和調試,查閱了相關資料,實現系統功能,c主要負責了小組統籌規劃,收集資料,電路分析,靳筌鈞主要負責了測試驗證,文檔整理的工作,每個人分工合作,完成了設計任務。 4.2 搭建環境使用KEIL uVision 4編寫單片機程序,在Proteus中搭建仿真環境,將可執行程序加載到仿真單片機中,進行仿真,驗證設計的正確性,可行性。 4.2.1 建立編輯編譯環境- 創建AT89C51工程,進行編輯。如下圖 4?1所示:

圖 4?1 創建工程 - 編輯代碼,選擇生成.Hex文件。如下圖 4?2所示:

圖 4?2 生成目標文件 4.2.2 建立仿真和測試環境根據電路原理圖在Proteus中搭建仿真模型。分別由數碼管顯示模塊,復位電路,矩陣鍵盤,晶振電路,單片機主控芯片,步進電機模塊,工作狀態顯示模塊。如下圖 4?3所示: 
圖 4?3仿真模型 4.3 方案驗證通過仿真來驗證步進電機的控制是否合理。驗證如下: 4.3.1 三種工作方式圖 4?4為步進電機工作在三相單三拍,此時K0,K3接高電平,K1,K2接低電平啟動;;圖 4?6為步進電機工作在三相六拍,此時K0,K1接低電平,K2,K3接高電平;若K4接高電平則反轉,低電平則正轉。這三種工作方式工作不同,三相單三拍時,通電順序為A-B-C-A;三相雙三拍時,通電順序為AB-BC-CA-AB;三相六拍時,通電順序為A-AB-B-BC-C-CA-A;以上通電方式是三種工作方式正轉的情況,若要反轉,則通電方式放過來即可 
圖 4?4單三拍正轉 圖 4?5圖 4?6為步進電機工作在三相雙三拍,此時K1,K3接高電平,K0,K2接低電平 
圖 4?5 三相雙三拍

圖 4?6三相雙三拍 圖 4?7圖 4?8為步進電機工作在三相六拍,此時K0,K1接低電平,K2,K3接高電平。 
圖 4?7 三相六拍 
圖 4?8 三相六拍 4.3.2 正轉和反轉 圖 4?7為三相步進電機工作在正轉狀態,此時K4接高電平。 
圖 4?9電機正轉 圖 4?8為三相步進電機工作在反轉狀態,此時K4低電平 
圖 4?10 電機反轉 4.3.3 指定步數和數碼管顯示當按下K5~K12按鍵時,分別指定步數值為20、40、60、80、100、120、140、160。當步進電機運轉時,每運轉一步程序將總步數自減1,在運用數碼管和單片機的端口連接顯示剩余步數,如圖 4?9所示。 
圖 4?11 指定步數和數碼管顯示
4.4 問題與分析在本次課題中,我遇到一些問題如下: - 由于對單片機知識不是很熟悉,在設計過程中常常需要翻閱許多相關知識才能有思路,需要不斷鞏固和運用
- 在對數碼管進行設計的時候,忘記加入上拉電阻,以至于多次仿真運行時數碼管都不顯示
- 在進行控制時,有很多時候開關都無法起到相應的作用,說明程序控制有誤,且數碼管顯示不全,對數碼管的顯示設計出現了許多程序上的錯誤。
- 在設計電路的過程中,調試程序以及控制都無法達到預期的狀態,通過請教老師和同學,對程序不斷修改,一步一步的驗證和測試,老師也給我們的設計提出了相關問題,才完善
創新與擴展在對步進電機進行設計的時候,在系統的基礎上,還可以充分利用步進電機的功能,加上蜂鳴器,對步進電機故障時進行報警,可以將顯示步數的開關利用集成開關進行控制,減少接線,顯示剩余步數不僅可以使用數碼管,還可以使用液晶顯示器,使用戶觀感更佳。同時步進電機可以運用到生活中很多場合,我們可以經過AD轉換,改變狀態
附錄一 電路圖
單片機源程序如下: - #include <reg51.h>
- #include <stdio.h>
- void delay1(void);
- void delay2(void);
- void display(int);
- sbit green=P1^4;
- sbit red=P1^6;
- sbit yellow=P1^5;
- sbit K5=P2^4;
- sbit K6=P2^5;
- sbit K7=P2^6;
- sbit K8=P2^7;
- sbit K9=P3^5;
- sbit K10=P3^6;
- sbit K11=P3^7;
- sbit K12=P1^7;
- int bushu=0;
- void main()
- {
- char a,b,c,d,j,*q,
- done1[8]={0x01,0x02,0x04,0x00,0x01,0x04,0x02,0x00},
- done2[8]={0x03,0x06,0x05,0x00,0x03,0x05,0x06,0x00},
- done3[14]={0x01,0x03,0x02,0x06,0x04,0x05,0x00,0x01,0x05,0x04,0x06,0x02,0x03,0x00}; //電機通電方式表
- L:
- a=P3;
- while(!(a&0x08)) //判斷是否啟動,若沒啟動則重新判斷
- {
- green=1;
- red=0;
- yellow=0;
- delay1();
- a=P3;
- }
- if(a&0x01) //判斷電機工作方式
- q=done1; //單三拍
- else if(a&0x02)
- q=done2; //雙三拍
- else if(a&0x04)
- q=done3; //三相六拍
- if(K5==1)
- {
- bushu=20; //設置bushu的值,以控制步數
- }
- else if(K6==1)
- {
- bushu=40; //設置bushu的值,以控制步數
- }
- else if(K7==1)
- {
- bushu=60; //設置bushu的值,以控制步數
- }
- else if(K8==1)
- {
- bushu=80; //設置bushu的值,以控制步數
- }
- else if(K9==1)
- {
- bushu=100; //設置bushu的值,以控制步數
- }
- else if(K10==1)
- {
- bushu=120; //設置bushu的值,以控制步數
- }
- else if(K11==1)
- {
- bushu=140; //設置bushu的值,以控制步數
- }
- else if(K12==1)
- {
- bushu=160; //設置bushu的值,以控制步數
- }
- if(a&0x10) //判斷電機是否正轉
- {
- green=0;
- red=1;
- yellow=0; //電機正轉,紅燈亮
- b=0;
- }
- else
- {
- green=0;
- red=0;
- yellow=1; //電機反轉,黃燈亮
- if(a&0x04) b=7; //反轉將b置位,通電順序反向
- else b=4;
- }
- d=b;
- while(1)
- {
- c=*(q+b);
- if(c==0) b=d; //步數走完,b重新置位
- else
- {
- P1=c; //從P3口輸出電機控制信號
- b++;
- bushu--; //剩余步數
- display(bushu); //顯示步數
- j=a;
- a=P3;
- if(a!=j&&bushu==0) //判斷P3口狀態信號是否改變
- if(!(a&0x08))
- bushu=0; //若為停止信號,總步數清零
- goto L; //狀態信號改變,返回到L,重新開始判斷控制
- }
- }
- }
- void display(int n) //步數顯示程序
- {
- unsigned char tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- unsigned char i,k,t,num[3];
- num[0]=n%10;
- num[1]=(n/10)%10;
- num[2]=(n/100)%10;
- for(t=0;t<50;t++) //掃描50次
- {
- k=0x04; //位選碼為最高位
- for(i=0;i<3;i++)
- {
- P2=k; //P2口輸出位選碼
- P0=tab[num[i]]; //P0口輸出顯示剩余步數
- k=k>>1; //下一位位選碼
- delay2();
- }
- }
- }
- void delay1()
- {
- int i,j;
- for(i=0;i<200;i++)
- for(j=0;j<300;j++);
- }
- void delay2()
- {
- int i,j;
- for(i=0;i<10;i++)
- for(j=0;j<60;j++);
- }
復制代碼
所有資料51hei提供下載:
|