第一篇:調研報告-步進電動機單片機調速控制電路設計
大連交通大學信息工程學院2011屆本科生畢業設計(論文)實習(調研)報告
調研報告課題來源及意義
在電氣時代的今天,電動機作為最主要的動力源,一直在現代化的生產和生活中起著十分重要的作用。無論是在工農業生產、交通運輸、國防、航空航天、醫療衛生、商務與辦公設備,還是在日常生活中的家用電器,都大量地使用著各種各樣的電動機。據有關部門統計的資料顯示,現在有90%以上的動力源來自于電動機,我國生產的電能60%用于電動機。電動機與人們的生活息息相關,密不可分。步進電機是一種將電脈沖信號轉換成相應的角位移或線位移的機電執行元件,具有快速啟停、精確以及直接接受數字量的特點,因而得到了廣泛的應用。如在繪圖機、打印機及光學儀器中,都采用步進電機來定位繪圖筆印字頭或光學鏡頭,特別是工業過程式控制的位置控制系統中,由于它的精確以及不用位移傳感器即可達到精確定位,隨著計算機控制技術的不斷發展,應用會越來越廣泛。
對電動機控制可分為簡單控制和復雜控制兩種。簡單控制是指對電動機進行啟動、制動、正反轉和順序控制。復雜控制是指對電動機的轉速、轉角、轉矩、電壓、電流等物理量進行控制。電動機的控制技術的發展得力于微電子技術、電力電子技術、傳感器技術、自動控制技術、微機應用技術等的最新發展成就。正是這些技術的進步使電動機控制技術在近二十年內發生了天翻地覆的變化。其中電動機的控制部分已由模擬控制逐漸讓位于以單片機為主的微處理器控制,形成數字與模擬的混合控制系統和純數字控制系統的應用,并正向全數字控制方向快速發展。電動機的驅動部分所用的功率器件經歷了幾次更新換代,目前開關速度更快、控制更容易的全控型功率器件MOSFET和IGBT成為主流。
單片機介于工業控制計算機和可編程控制器之間,它有較強的控制功能、低廉的成本。人們在選擇電動機的控制器時,常常是在先滿足功能的需要的同時,優先選擇成本低的控制器。因此,單片機往往成為優先選擇的目標。從最近的統計數字可以看出,世界上每年要有25億片各種單片機投入使用。單片機是目前世界上使用量最大的微處理器。
單片機取代模擬電路作為電動機的控制器有如下特點:電路簡單;可以實現復雜控制;靈活性和適應性好;無零點漂移,控制精度高;可提供人機界面,多機聯網工作。2 步進電動機的發展歷程
步進電機最早在1920年由英國人開發,1950年代后期晶體管的發明也逐漸應用在步進電機上。步進電動機的發展與計算機工業和數字控制技術密切相關,產品按結構劃分有磁阻式、永磁式和混合型等多種形式。近年來,伴隨著微電子技術大功率電力電子器件及驅動技術的進步,發達國家已普遍使用性能優越的混合式步進電機,最典型的產品是二相8極50齒的電動機,步距角1.8°/0.9°(全步/半步);還有五相10極50齒和一些轉子100齒的二相和五相步進電動機,五相電動機主要用于運行性能較高的場合。驅動技術采用恒相電流與細分驅動相結合,使步進電機在中、小功率控制系統內的精度提高,并逐步向高速大功率應用領域滲透。步進電動機最大的生產國是日本,如日本伺服公司、東方公司、SANYO DENKI和MINEBEA及NPM公司等,特別是日本東方公司,無論是電動機性能和外觀質量還是生產手段,都是世界上最好的。
我國對步進電動機的研究從1958年開始,1970年代以前受蘇聯的影響,以三相磁阻式步進電動機為主,如1960年代末為快走絲數控線切割機床研制的BF1840-75,一直延續生產到現在。1970年代受到國內研制生產數控機床和其他數控設備的推動,并受到當時日本數控機床系統的影響開始發展磁阻式步進電動機的系列產品,以定子6個極、轉子40齒的三相磁阻式電動機為主,還有定子10個極、轉子100齒的五相磁阻式電動機和四相電動機等。
1980年代開始發展混合式步進電動機,以定子8極、轉子50齒的二相(四相)混合式步進電動機為主。1987年開始自行設計定子10極、轉子50齒的五相混合式步進電動機,同時還發展了一些不同于國外的非典型產品,如定子8極、轉子60齒的二相(四相)混合式步進電動機。這是為了與磁阻式步進電動機的步距角相一致,轉子200齒的五相混合式步進電動機,轉子100齒的九相(三相)混合式步進電動機,主要特點是具有高分辨率和可變步矩角。
經過多年的發展,我國步進電機形成一種品種規格繁多的局面,其中最主要的產品系列,一是1970年代形成的磁阻式步進電動機系列產品在低端應用仍有較多的市場,繼續生產;二是混合式步進電機的系列產品,包括引進技術和生產設備,按照國外的設計生產的二相和五相混合式步進電機,以及國內自行開發生產的混合式步進電動機,仍然擁有各自不同的應用領域,短期內很難統一到幾個限定的規格品種上。
步進電機幾十年的發展經驗總結是:磁阻式適用于平穩運行以及轉速大于1 000 r/min的用途;永磁式成本低,主要用在價格低廉的消費性產品中;永磁感應子式更適合于低速大轉矩用途。步進電動機的前景展望
步進電動機經過幾十年的發展,已成為除直流電動機和交流電動機以外的應用最廣泛的第三類電動機.在開環高分辨率的定位系統中,至今還沒有發現更合適取代它的產品,特別是在一些功率相當小的系統中,步進電機更具有無可替代的主流地位。
預計未來步進電機的研究還會持續深入下去,研究方向之一是電機與驅動的一體化,使步進電機體積更小巧、性能更優越,性價比更高,在大量的民用設備中批量化使用,如家庭機器人、民用智能化設備等;研究方向之二是在功率或機座號相對較大的步進電動機中,與屬于BIDCM(稀土永磁無刷直流電機)的交流伺服電動機系統會合,具體來說可能會借鑒交流伺服系統的控制技術,但保留了部分步進電動機的特點,形成一種新的“步進伺服電動機”或“伺服步進電動機”,在克服低頻振蕩、高頻過載能力小、快速性不足和效率低等方面取得突破性進展,從而在現代軍事、精密機械加工、航空航天等領域的應用越來越深入。研究內容和目標
采用系列單片機實現對步進電動機調速系統的自動控制,利用計算機軟件與單片機的串行口通信,達到上位機控制下位機實現步進電動機的啟動、停止、正轉、反轉、加速、減速和狀態顯示的目的,使步進電動機控制更加靈活。
通過查閱資料,研究出以單片機為核心的實用控制電路,并進行調試。可以用顯示電路進行對步進電動機工作狀態的顯示,而且要有完善的保護、互鎖功能。設計方案的可行性分析
本次課題在以前《單片機的C語言》等書中有所涉及,而且網絡和圖書館資源豐富,可以方便查到相關方面的文獻、期刊、書籍和論文等,同時學院為我們提供的電腦機房,給予了我們很好的實驗環境。因此,從主客觀方面我認為這一方案是可行的。進度計劃
為了更好的完成課題,通過查閱資料,特做如下安排:
第1周:根據題目,查找課題相關資料文獻,初步從整體上了解課題,并撰寫進度計劃與考核表。
第2周:學習相關資料,初步撰寫一篇與課題相關的調研報告。
第3周:繼續學習相關資料,開始翻譯相關的外文文獻。
第4周:繼續學習相關資料,了解課題內容及思路。
第5周:閱讀國內外有步進電動機調速單片機控制的資料,掌握步進電動機控制系統的組成、原理等,并在此基礎上掌握工程設計方法。
第6周:對自己要展開的設計方案進行初步設計和論證。
第7周:對步進電動機調速單片機控制進行電路設計,包括系統電路圖,還有器件資料。
第8周:進行系統的軟件設計,程序流程圖,程序設計。
第9周:進行調試,看操作控制,并且總結設計中遇到的問題及解決方法。
第10周:繼續上述總結工作,并逐步完善。
第11周:繼續進行軟件的分析,撰寫畢業論文提綱,規劃論文內容,并開始著手寫畢業論文初稿。
第12周:整理材料,文件圖標等,完成畢業論文的撰寫并交給指導教師審查。第13周:論文修改,打印,裝訂成冊,并提交。復習各種資料,準備答辯。
第14周:答辯,畢業論文成績評定。參考文獻
[1] 王宗培.任雷.混合式步進電動機的研究[J].電工技術雜志.1998.11(3):12-22
[2] 陳敏祥.五相混合式步進電動機驅動新技術[J].電機與控制學報.1998.22(6):1-9
[3] 華蕊.步進電機細分驅動技術綜述[J].佛山科學技術學院學報(自然科學
版).1999.14(2):13-25
[4] 周明安.朱光忠.宋曉華.肖俊建.步進電機驅動技術發展及現狀[J].機電工程技
術.2005.24(2):135-244
[5] 易長松.新型三相混合式步進電機驅動器[J].機電一體化.2001.22(9):21-66
[6] 趙永瑞.李剛.三相混合式步進電機系統[J].機電一體化.2000.21(6):33-87
[7] 林蔚天.焦斌.應用集成芯片UC3845構成高頻開關電源[J].上海工程技術大學學
報.2001.12(2):1-14
[8] 葉斌.電力電子應用技術及裝置[M].機械工業出版社.1999.[9] 孫育才.MCS-51系列單片機型計算機及其應用[M].東南大學出版社.1998
[10] 劉鳳君.正弦波逆變器[M].科學出版社.2002
[11] 胡漢才.單片機原理及其接口技術[M].清華大學出版社.1996
[12] 林成武.步進電機微步驅動分析[J].沈陽工業大學學報.1996.23(6)33-36
[13] 宋受俊.劉衛國.李珉宇.通用混合式步進電動機驅動控制系統硬件設計[J].電氣
傳動.2007.22(9):45-77
[14] Robert Bosch GmbH.Autoelektrik Systeme and Komponenten Braunschweig[J]
Vieweg & Sohn Verlag.2002.21(3):22-39
第二篇:單片機課程設計任務書(步進電機控制)
湖北工程學院新技術學院課程設計任務書
課程單片機原理及仿真課程設計
題目單片機控制步進電機
專業姓名學號
主要內容、基本要求、主要參考資料等
1、主要內容:
根據單片機課程所學內容,結合其他相關課程知識,設計步進電機控制,以加深對單片機知識的理解,鍛煉實踐動手能力,為以后的畢業設計和工作打下堅實基礎。
2、基本要求:
本設計以MCS-51系列單片機為核心,采用常用電子器件設計。根據要求設計一個單片機仿真控制,要求:設計一個數碼管;一個外中斷通過門電路連接五個按鍵,這五個按鍵分別控制步進電機的正轉反轉暫停、加速與減速;正轉時,數碼管上顯示‘Z’,反轉時顯示“F”,暫停時顯示“S”,按加速鍵時,電機加速,按減速鍵時,電機減速。
(1)用PROTOUS設計出步進電機控制工作原理實驗電路圖
(2)通過對AT89S51單片機編程,編寫定步進電機控制程序,實現用步進電機控制。
(3)上交相應仿真的電路圖與編程文檔。
(4)寫出詳細的設計原理說明小論文。
3、主要參考資料:
[1] 李泉溪,倪水平.單片機原理與應用實例仿真.北京:北京航空航天大學出版社,2012.[2] 張友德,趙志英,徐時亮.單片微機原理應用與實驗.上海:復旦大學出版社,2010.[3] 單片機仿真實驗系統說明書.完成期限
指導教師
2012年12月2 日
第三篇:基于51單片機的交通燈控制電路設計
交通燈
一、功能要求
要求甲車道和乙車道兩條交叉道路上的車輛交替運行,每次通行時間都設為25秒,黃燈先亮5秒鐘,才能變換運行車道;黃燈亮時,要求每秒鐘閃亮一次。
二、電路圖
說明:1)每一位數碼管位選要分開,對應IO口參照程序中紅色部分 2)圖示數碼管為共陽,沒加驅動數碼管顯示較暗,建議加驅動
三、程序
//TrafficLight.c #include“reg52.h”
//IO口定義 sbit red_1 =P2^0;//南北方向 sbit red_2 =P2^3;//東西方向 sbit yellow_1 =P2^1;sbit yellow_2 =P2^4;sbit green_1 =P2^2;sbit green_2 =P2^5;sbit com1_1 =P3^6;//十位 南北方向 數碼管位選 sbit com1_2 =P3^7;//個位 南北方向 sbit com2_1 =P3^4;//十位 東西方向 sbit com2_2 =P3^5;//個位 東西方向
//全局變量 char time=30;//倒計時
unsigned char num1=0,num2=0;//輔助計時 unsigned char flag1=0,flag2=0;//黃燈閃標志位 unsigned char shi1,shi2,ge1,ge2;//數碼管十位個位
const unsigned char ledNum[] =
{// 0 1
A
b
c
d
E
F
不顯示-o(18)H(19)h(20)C(21)0(22)n(23)0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8e,0xFF,0xbf,0xa3,0x89,0x8b,0xc6,0xc0,0xab };//共陽數碼管
//中斷優先級別T0>T1,數碼管顯示中斷間隔2ms,計時時間間隔50ms //計時要求比較精確,間隔長,不應該被打斷,故中斷優先級要高,使用T0 //數碼管中斷可以被打斷,打斷時間較短,不會影響顯示,使用T1 //在交通燈中,計時和數碼管顯示一直進行,故定時器開啟后不用停止 void InitInter(void){ TMOD=0x11;//設置定時器工作方式為16位計時器
TH0=(65535-45872)/256;//11.0592M晶振,50ms TL0=(65535-45872)%256;TH1=(65535-1835)/256;//11.0592M晶振,2ms TL1=(65535-1835)%256;EA=1;ET0=1;ET1=1;TR0=1;TR1=1;}
void Display(void){ static unsigned char i=1;
switch(i){ case 1:
com2_2=0;
P0=ledNum[shi1];
com1_1=1;
break;case 2:
com1_1=0;
P0=ledNum[ge1];
com1_2=1;
break;case 3:
com1_2=0;
P0=ledNum[shi2];
com2_1=1;
break;case 4:
com2_1=0;
P0=ledNum[ge2];
com2_2=1;
break;
default:;}
i++;if(i>4)i=1;}
//紅燈可以直接變成綠燈,但綠燈必須先變成黃燈再變紅燈 void main(void){ bit i=0;InitInter();
while(1){
red_1=0;//0為亮
red_2=1;
green_2=0;
time=30;
while(time>5)
{
shi1=time/10;
ge1=time%10;
shi2=(time-5)/10;
ge2=(time-5)%10;
}
green_2=1;
yellow_2=0;
flag2=1;
num2=0;
while(time>0)
{
shi1=time/10;
ge1=time%10;
shi2=time/10;
ge2=time%10;
}
flag2=0;
yellow_2=1;
red_2=0;
red_1=1;
green_1=0;
time=30;
while(time>5)
{
shi2=time/10;
ge2=time%10;
shi1=(time-5)/10;
ge1=(time-5)%10;
}
green_1=1;
yellow_1=0;
flag1=1;
num2=0;
while(time>0)
{
shi2=time/10;
ge2=time%10;
shi1=time/10;
ge1=time%10;
}
flag1=0;
yellow_1=1;
//red_1=0;
//green_2=0;} } void Timer_0(void)interrupt 1//計時 { TH0=(65535-45872)/256;TL0=(65535-45872)%256;num1++;if(num1>=20){
num1=0;
time--;
//if(time<0)time=30;
//處理time,顯示方式
} if(flag1||flag2){
num2++;
if(num2>=10)
{
num2=0;
if(flag1)yellow_1=~yellow_1;
if(flag2)yellow_2=~yellow_2;
} } }
void Timer_1(void)interrupt 3 { TH1=(65535-1835)/256;//11.0592M晶振,2ms TL1=(65535-1835)%256;
Display();}
第四篇:基于單片機的視力保護器電路設計(開題報告)
安 徽 科 技 學 院
畢業論文(設計)開題報告
教學院(部):理學院
專業名稱:電子科學與技術
姓名:畢成治
學號:1886080201
屆別:2012屆指導教師:呂越鳳
2012年 3月
第五篇:ARM的步進電機細分控制報告
基于ARM的步進電機細分驅動控制設計
一、ARM簡介
ARM 公司是一家IP供應商,其核心業務是IP核以及相關工具的開發和設計。半導體廠商通過購買ARM公司的IP授權來生產自己的微處理器芯片。由此以來,處理器內核來自ARM公司、各芯片廠商結合自身已有的技術優勢以及芯片的市場定位等因數使芯片設計最優化,從而產生了一大批高度集成、各據特色的SOC芯片。
ARM微處理器具有以下特點:采用RISC指令集、使用大量寄存器、ARM/THUMB指令支持、三/五級流水線具有低功耗、低成本、高性能等。
到目前為止,ARM公司的IP核已經由ARM7,ARM9發展到今天的ARM11版本,ARM微處理器及技術的應用已經廣泛深入到國民經濟的各個領域, 如工業控制領域、網絡應用、消費類電子產品及成像和安全產品等領域。
鑒于ARM7所具備的強大功能完全可以滿足本次設計要求,本次設計仍使用ARM7系列芯片。
二.步進電機細分控制方案
1、步進電機細分技術簡介
細分驅動技術在七十年代中期由美國學者首次提出,基本原理是將繞組中的電流細分。由常規的矩形波供電改為階梯波供電,此時繞組中的電流將按一定的階梯順序上升和下降,從而將每一自然步進行細分。步進電機細分控制的本質是通過對勵磁繞組中的電流控制,使步進電機合成磁場為均勻離散化的圓形旋轉磁場。采用細分驅動技術可以改善步進電機的運行品質,減少轉矩波動、抑制振蕩、降低噪音、提高步距分辨率。
2、硬件框圖設計
系統總體硬件框圖設計如圖2-1所示:
0
圖2-1總體設計框圖
3、軟件總體設計流程圖
圖2-2 軟件設計流程圖
4、步進電機
圖2-3 28BYJ-48-5VDC步進電機
中間部分是轉子,由一個永磁體組成,邊上的是定子繞組。當定子的一個繞組通電時,將產生一個方向的電磁場,如果這個磁場的方向和轉子磁場方向不在同一條直線上,那么定子和轉子的磁場將產生一個扭力將定子扭轉。依次改變繞組的磁場,就可以使步進電機正轉或反轉(比如通電次序為A->B->C->D正轉,反之則反轉)。而且按照通電順序的不同,可分為單四拍(A-B-C-D)、雙四拍(AB-BC-CD-DA)、單雙八拍(A-AB-B-BC-C-CD-D-DA)三種工作方式。單四拍與雙四拍的步距角相等,但單四拍的轉動力矩小。八拍工作方式的步距角是單四拍與雙四拍的一半,因此,八拍工作方式既可以保持較高的轉動力矩又可以提高控制精度。
由于步進電機的驅動電流較大,單片機不能直接驅動,一般都是使用ULN2003達林頓陣列驅動,當然,使用下拉電阻或三極管也是可以驅動的,只不過效果不是那么好,產生的扭力比較小。
5、電機驅動ULN2003簡介
ULN2003 是高耐壓、大電流復合晶體管陣列,由七個硅NPN 復合晶體管組成。ULN2003是大電流驅動陣列,多用于單片機、智能儀表、PLC、數字量輸出卡等控制電路中。可直接驅動繼電器等負載。輸入5VTTL電平,輸出可達500mA/50V。ULN2003是高耐壓、大電流達林頓陳列,由七個硅NPN達林頓管組成。
圖2-4 ULN2003芯片引腳圖
該電路的特點如下: ULN2003的每一對達林頓都串聯一個2.7K的基極電阻,在5V的工作電壓下它能與TTL和CMOS電路 直接相連,可以直接處理原先需要標準邏輯緩沖器來處理的數據。ULN2003 是高壓大電流達林頓晶體管陣列系列產品,具有電流增益高、工作電壓高、溫度范圍寬、帶負載能力強等特點,適應于各類要求高速大功率驅動的系統。ULN2003 工作電壓高,工作電流大,灌電流可達500mA,并且能夠在關態時承受50V 的電壓,輸出還可以在高負載電流并行運行。其接線圖如下所示:
圖2-5 步進電機驅動電路 6、12864液晶顯示簡介
12864是128*64點陣液晶模塊的點陣數簡稱。液晶屏類型:STN FSTN;模塊顯示效果:黃綠底黑字、藍底白字、白底黑字;驅動方式:1/64 DUTY 1/9 BIAS;背光:LED白色、LED黃綠色;控制器:KS0108或兼容 ST7920 T6963C;數據總線:8 位并口/6800 方式 串口;工作溫度:-20℃~+70℃;儲藏溫度:-30℃~+80℃;點陣格式:128 x 64;現實角度:6:00直視;基本用途:該點陣的屏顯成本相對較低,適用于各類儀器,小型設備的顯示領域。其接線圖如下所示:
圖2-6 12864液晶顯示與LPC2131接口接線圖
三、硬件電路圖
圖2-7 系統硬件電路圖
四、總結
此次基于ARM的步進電機細分驅動控制設計,由于掌握知識及時間有限,我們目前只實現了對步進電機正反轉控制以及三種運行方式(單四拍、雙四拍、單雙八拍)的選擇控制,并且實現了在12864液晶顯示屏上顯示相關的信息。連接好硬件電路,上電復位,程序開始運行。此時步進電機不轉動,按下啟停鍵,步進電機開始轉動,初始值設為正傳,按反轉鍵開始反轉,再按正傳鍵則開始正傳。當按下加速鍵時電機開始加速,當按下減速鍵時電機開始減速。
當然,此次課程設計還存在很多問題,實現的功能較簡單,這都需要以后不斷加強相關知識的學習從而不斷提高自己。
最后,感謝李紅巖老師和黃夢濤老師的辛勤教誨。
五、心得體會
這次課程設計的硬件部分由我來完成,雖然不用焊接電路,但是在畫硬件圖的過程中仍遇到很多問題。例如對Protel軟件的不熟悉,許多操作需要多次嘗試,才能正確完成;還有就是在電路的連接過程中,由于自己的馬虎,線路有錯連和少連的現象。但是經過自己的不斷努力,最終還是完成了任務。
通過這次課程設計,我從一開始對系統的不太熟悉,到能開發一個簡單的系
統,在這整個過程中我學到了很多東西,掌握了一些常用的開發技能,也發現了大量的問題,有些在設計過程中已經解決,有些還有待今后慢慢學習。只要學習就會有更多的問題,有更多的難點,但也會有更多的收獲。
在本次ARM課程設計訓練中,不僅鍛煉了自己的動手能力,也在向同學老師請教的過程中學到了不少東西,十分感謝老師和同學的幫助。通過本次課程設計,我最深的感觸便是,許多東西都需要自己親自去做去實踐去學習,才能真正的弄懂,才能真正的學到東西。
在整個的設計和實踐過程中,通過老師的指導和同學的幫助,我們組最終在最后時間完成了任務。通過這次課程設計,才知道自己需要學習的東西還有很多,下來之后一定得加緊學習。平常我們都只是在課堂上學習,通過這次課程設計,實現了從理論到實踐的飛躍。增強了認識問題,分析問,解決問題的能力。
最后感謝老師對我們此次課設的耐心指導和幫助!
經過這次ARM課程設計,使我對這學期ARM課程做了全面的復習,并學會將其應用于實踐,在這次基于ARM的步進電機細分控制中,我對于ARM、步進電機、液晶顯示及相關軟件都有了進一步的認識,也是我發現團隊合作的重要性,更激起了我對于電子設計方面的熱情。
不過,通過這次課程設計,我同樣感受到了自身知識的缺乏,如不太熟悉使用上位機進行監控、ARM的掌握不夠透徹、還不能脫離參考資料獨立進行軟硬件設計等,這些都需要我以后不斷加強學習鍛煉加以增強,這將對于我今后進一步的學習打下基礎,我以后會不斷根據自身缺點進行學習鍛煉,使自己不斷提高。最后,感謝老師的辛勤教誨!
六、參考文獻
1.ARM嵌入式系統基礎教程[第2版] 主編 周立功 北京航空航天大學出版社.2008 2.步進電動機及其驅動控制系統 主編 劉寶廷 哈爾濱工業大學出版社.1997
附錄
#include“config.h” #define
MOTOA
1<<10
// P0.10
#define
MOTOB
1<<11
// P0.11
#define
MOTOC
1<<12
// P0.12 #define
MOTOD
1<<13
// P0.13 #define
key1
1<<17
// 加速 #define
key2
1<<18
// 減速 #define
key3
1<<19
//正反轉 #define
key4
1<<20
//啟停
#define
KEYCON 0x001e0000 // LED控制字 #define
MOTOCON 0x00003c00 // MOTO控制字
#define
GPIOSET(PIN)IO0SET = PIN
// 方便修改置位端口 #define
GPIOCLR(PIN)IO0CLR = PIN
// 方便修改清位端口 #define
RS
1<<9
//P0.9 #define
SID
1<<6
//P0.6 #define
E
1<<4
//P0.4 #define
PSB
1<<2
//P0.2并行或串行,選擇低電平串行模式 #define
RST
1<<25
//P1.25,復位腳
unsigned char DAT1[64]=“低速—單四拍A-B-C-D運行方式”;unsigned char DAT2[64]=“中速—雙四拍AB-BC-CD-DA運行方式”;unsigned char DAT3[64]=“高速—單雙八拍A-AB-B-BC-C-CD-D-DA運行方式”;unsigned char DAT4[64]=“低速反轉—單四拍D-C-B-A運行方式”;unsigned char DAT5[64]=“中速反轉—雙四拍AD-DC-CB-BA運行方式”;unsigned char DAT6[64]=“高速反轉—單雙八拍D-CD-C-BC-B-AB-A-DA運行方式”;unsigned char DAT7[64]=“
停
止
”;unsigned char DAT8[64]=“步進電機細分控制測控1002班:劉怡楠&石娟利”;
void TransferCom(unsigned char data0);void TransferData(unsigned char data1);void delay(unsigned int m);void lcd_mesg(unsigned char *adder1);void SendByte(unsigned char Dbyte);void init(void);void LCD12864_init(void);void DelayNS(uint32 dly);void MOTO_Mode1(uint8 i);
// A-B-C-D void MOTO_Mode10(uint8 i);void MOTO_Mode2(uint8 i);
// AB-BC-CD-DA-AB void MOTO_Mode20(uint8 i);void MOTO_Mode3(uint8 i);
// A-AB-B-BC-C-CD-D-DA-A void MOTO_Mode30(uint8 i);
int main(void){
unsigned int t=0;//啟停標志
unsigned int f=0;//正反轉標志
unsigned int i=0;//電機運行模式標志
PINSEL0=0x00000000;
PINSEL1=0X00000000;
PINSEL2&=~(0x00000006);//設置所有I/O口為普通GPIO口
IO0DIR =MOTOCON;// 配置I/O輸入輸出方向
LCD12864_init();//液晶端口初始化
while((IO0PIN&key1)&&(IO0PIN&key2)&&(IO0PIN&key3)&&(IO0PIN&key4)!=0)
{ init();
lcd_mesg(DAT8);
//顯示界面
}
while(1)
{
if(t==0)//電機停止
{ init();
lcd_mesg(DAT7);
IO0CLR=MOTOCON;
if((IO0PIN&key4)==0)t=!t;//key4控制啟停轉換
} else if(t==1)//電機啟動
{ if((IO0PIN&key1)==0)//key1控制加速
{ if(i>=2)i=2;
else i++;
DelayNS(10);
}
if((IO0PIN&key2)==0)//key2控制減速
{ if(i<=0)i=0;
else i--;
DelayNS(10);
}
if((IO0PIN&key3)==0)f=!f;//key3控制正反轉
if((IO0PIN&key4)==0)t=!t;
if(f==0)
//正轉
{ if(i==0)MOTO_Mode1(10);//低速
else if(i==1)MOTO_Mode2(10);//中速
else if(i==2)MOTO_Mode3(10);//高速
}
else if(f==1)//反轉
{ if(i==0)MOTO_Mode10(10);//低速
else if(i==1)MOTO_Mode20(10);//中速
else if(i==2)MOTO_Mode30(10);//高速
} }
}
return(0);}
void DelayNS(uint32 dly){ uint32 i;
for(;dly>0;dly--)
for(i=0;i<5000;i++);} void MOTO_Mode1(uint8 i)
//單四拍A-B-C-D運行方式 {
while((IO0PIN&key1)&&(IO0PIN&key2)&&(IO0PIN&key3)&&(IO0PIN&key4)!=0)
{
init();
lcd_mesg(DAT1);//顯示字符串DAT1
/* A */
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOA);
/* B */
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOB);
/* C */
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOC);
/* D */
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOD);
} } void MOTO_Mode10(uint8 i)
//單四拍D-C-B-A運行方式 {
while((IO0PIN&key1)&&(IO0PIN&key2)&&(IO0PIN&key3)&&(IO0PIN&key4)!=0)
{
init();
lcd_mesg(DAT4);
//顯示字符串DAT4
/* D */
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOD);
/* C */
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOC);
/* B */
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOB);
/* A */
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOA);
} } void MOTO_Mode2(uint8 i)
//雙四拍AB-BC-CD-DA運行方式 {
while((IO0PIN&key1)&&(IO0PIN&key2)&&(IO0PIN&key3)&&(IO0PIN&key4)!=0)
{
init();
lcd_mesg(DAT2);
//顯示字符串DAT2
GPIOSET(MOTOA);
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOA);
GPIOCLR(MOTOB);
/* BC */
GPIOSET(MOTOB);
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOB);
GPIOCLR(MOTOC);
/* CD */
GPIOSET(MOTOC);
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOC);
GPIOCLR(MOTOD);
/* DA */
GPIOSET(MOTOD);
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOD);
GPIOCLR(MOTOA);
} } void MOTO_Mode20(uint8 i)
//雙四拍AD-DC-CB-BA運行方式 {
while((IO0PIN&key1)&&(IO0PIN&key2)&&(IO0PIN&key3)&&(IO0PIN&key4)!=0)
{
init();
lcd_mesg(DAT5);
//顯示字符串DAT5
GPIOSET(MOTOA);
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOA);
GPIOCLR(MOTOD);
/* DC */
GPIOSET(MOTOD);
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOD);
GPIOCLR(MOTOC);
/* CB */
GPIOSET(MOTOC);
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOC);
GPIOCLR(MOTOB);
/* BA */
GPIOSET(MOTOB);
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOB);
GPIOCLR(MOTOA);
} } void MOTO_Mode3(uint8 i)
//單雙八拍A-AB-B-BC-C-CD-D-DA運行方式 {
while((IO0PIN&key1)&&(IO0PIN&key2)&&(IO0PIN&key3)&&(IO0PIN&key4)!=0)
{
init();
lcd_mesg(DAT3);
//顯示字符串DAT3
/* A */
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOA);
/* AB */
GPIOSET(MOTOA);
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOA);
GPIOCLR(MOTOB);
/* B */
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOB);
/* BC */
GPIOSET(MOTOB);
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOB);
GPIOCLR(MOTOC);
/* C */
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOC);
/* CD */
GPIOSET(MOTOC);
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOC);
GPIOCLR(MOTOD);
/* D */
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOD);
/* DA */
GPIOSET(MOTOD);
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOD);
GPIOCLR(MOTOA);
} } void MOTO_Mode30(uint8 i)
//單雙八拍D-CD-C-BC-B-AB-A-DA運行方式 {
while((IO0PIN&key1)&&(IO0PIN&key2)&&(IO0PIN&key3)&&(IO0PIN&key4)!=0)
{
init();
lcd_mesg(DAT6);
//顯示字符串DAT6
/* D */
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOD);
/* CD */
GPIOSET(MOTOC);
GPIOSET(MOTOD);
DelayNS(i);
GPIOCLR(MOTOC);
GPIOCLR(MOTOD);
/* C */
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOC);
/* BC */
GPIOSET(MOTOB);
GPIOSET(MOTOC);
DelayNS(i);
GPIOCLR(MOTOB);
GPIOCLR(MOTOC);
/* B */
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOB);
/* AB */
GPIOSET(MOTOA);
GPIOSET(MOTOB);
DelayNS(i);
GPIOCLR(MOTOA);
GPIOCLR(MOTOB);
/* A */
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOA);
/* DA */
GPIOSET(MOTOD);
GPIOSET(MOTOA);
DelayNS(i);
GPIOCLR(MOTOD);
GPIOCLR(MOTOA);
} } void delay(unsigned int m){
unsigned int i,j;
for(i=0;i for(j=0;j<50;j++);} void init(void){ delay(40); //大于40ms的延時程序 IO0SET=PSB;//設置為串行工作方式 delay(1); IO1CLR=RST;//復位 delay(1); IO1SET=RST;//復位置高 delay(10); TransferCom(0x30);//RE=0,G=0,圖片顯示關 delay(100); TransferCom(0x0C);//D=1,顯示開 delay(100); TransferCom(0x01);//清屏 delay(10); TransferCom(0x06);//模式設置,光標從右向左加1位移動 delay(100);} void lcd_mesg(unsigned char *adder1){ unsigned char i; TransferCom(0x80); delay(100); for(i=0;i<32;i++) { TransferData(*adder1); adder1++; } TransferCom(0x90); delay(100); for(i=32;i<64;i++) { TransferData(*adder1); adder1++; } } void SendByte(unsigned char Dbyte){ unsigned char i; for(i=0;i<8;i++) { IO0CLR=E; if((Dbyte&0x80)==0x80)IO0SET=SID; else IO0CLR=SID; Dbyte=Dbyte<<1; IO0SET=E; IO0CLR=E; } } void TransferCom(unsigned char data0){ IO0SET=RS; SendByte(0xf8); // 11111,RW=0,RS=1,0 SendByte(0xf0&data0);//高4位 SendByte(0xf0&data0<<4);//低4位 IO0CLR=RS; } void TransferData(unsigned char data1){ IO0SET=RS; SendByte(0xfa); // 11111,RW=0,RS=1,0 SendByte(0xf0&data1);//高4位 SendByte(0xf0&data1<<4);//低4位 IO0CLR=RS;} void LCD12864_init(void){ IO0DIR|=(E|SID|RS);//設置為輸出 IO0CLR=(E|SID|RS); IO1DIR|=RST; IO1CLR=RST; //復位 delay(1); IO1SET=RST; //復位置高 }