版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
利用步進電機模擬小車的運行1、需求分析及實驗?zāi)康模捍舜螌嶒灥男枨蠓治鋈缦拢河嬎忝看渭与姶a輸入步進電機以后小車(步進電機)行進的距離(弧度,并按照一定的比例換算成長度)利用8個開關(guān)設(shè)計8個檔位,其中一個倒檔,6個進檔,1個靜止檔,不同檔位設(shè)置不同的行進速度,其中出靜止檔外倒檔最低;在屏幕上顯示2個窗口,分別顯示小車當(dāng)前的速度與行駛里程,其中行駛里程與程序運行的次數(shù)無關(guān);利用8個led顯示當(dāng)前的檔位狀況,其中:倒檔時,某一個等閃爍靜止檔是,全部等閃爍另外設(shè)計一種小車的自動行駛模式,在這種模式下,小車不通過開關(guān)控制檔位,而通過一個窗口的輸入小車行進模式(請自行設(shè)計行進代碼),實現(xiàn)小車在不同檔位下運行的時間、次序。實驗要求同學(xué)能夠理解8255A的0工作方式下通過時序?qū)Σ竭M電機的工作流程的控制,同時將流水燈當(dāng)作檔位的控制開關(guān),能夠更好的體現(xiàn)對接口芯片的控制過程,而自動方式控制步進電機的運轉(zhuǎn),題目非常的開放,能夠充分的發(fā)揮同學(xué)們的想象空間,同學(xué)們可以通過不同的編碼形式來完成這個題目。2、設(shè)計2.08255A芯片簡介由于此次的設(shè)計涉及到8255A接口芯片的編程,因此在這里先對8255A的接口芯片做簡要的介紹:8255A是一個具有兩個8位和兩個4位并行I/O端口的接口芯片,它為Intle系列的CPU與外部設(shè)備之間提供TTL電平兼容的接口,以及需要同時兩位以上信息傳送的一切形式的并行接口。在學(xué)校的實驗平臺上它的命令口的地址為0x0c803,PA,PB,PC口的端口地址分別為0x0c800,0x0c801,0x0c802o其引腳圖和內(nèi)部框圖分別如下:*三一*白一*口一—-切一昭一*三一*白一*口一—-切一昭一WwitRESET中隊U,宀站*如32.1流水燈的控制平臺的介紹:在學(xué)校的實驗平臺上LED燈的端口地址是0x0c860,通過控制LED輸入電平的高低來控制LED燈的明與暗,而電平的高低是通過想端口寫的數(shù)據(jù)來體現(xiàn)的,例如向端口寫1就代表輸入的是高電平而0則代表的是低電平。因而要實現(xiàn)需求分析中的流水燈的各種功能,只需要控制各端口的電平的高低,也就是對端口寫數(shù)據(jù)的不同。燈的閃爍的實現(xiàn)就是在LED燈全明與全暗之間設(shè)置一個延遲,這樣觀察的效果就是閃爍,而從左至右和從右至左的變化是通過將初始值(10h和Olh)進行向左移位或者向右移位即可。圖3:實驗平臺簡介2.2設(shè)計思想:在以前的上機實驗中我們分別做過流水燈和步進電機的實驗,而且都成功的完成了這兩次實驗,因此此次課程設(shè)計算的上是對以前做的實驗的一次綜合,而創(chuàng)新點就在于在自動控制方式下編碼與解碼的問題,因此在設(shè)計思想中,手動控制這一塊我將只做簡要介紹,詳細介紹的是在自動控制中所采用的方法。手動控制:因為時間和速度都是按照一定的比例來完成的,所以不同檔位的實現(xiàn)也就是LED燈的控制開關(guān)在不同狀態(tài)下時延遲時間不同的控制,同時在不同的延遲時間下給每個檔位指定一個速度,延遲長的速度小,延遲短的速度大,這樣便能實現(xiàn)對不同檔位的控制,而燈的閃爍也只是在燈的明與暗之間加上一個延遲的時間便能完成,總體來說手動控制的大體思想較為簡單,而難點主要是在檔位切換的問題,開關(guān)的拔動和檔位的變換以及電機做出的反應(yīng)這期間的時間差應(yīng)該越小越好,因而在程序的書寫過程中我使用的Switch…Case…語句,電機每走一步就進行一次判斷,而不是用For循環(huán)來控制,這樣能將時間差縮短到很小的范圍內(nèi)。表1:相序表的設(shè)計繞組與數(shù)據(jù)線的連接及八拍數(shù)據(jù)的表示DCBAPA7PA6PA5PA4PA3PA2PA1PA000000101自動控制:檔位的切換和LED燈的明暗控制和手動控制肯定是沒有什么區(qū)別的,而自動控制的主要難點在于對控制序列的定義及解析,也就是將不同的檔位及在該檔位下行進的步數(shù)進行的定義。我的解決思路是用abcdefgh八個不同的字母來分別表示不同的檔位,同時用數(shù)字表示在該檔位下運行的步驟,在得知檔位和數(shù)字后,就只需要用循環(huán)來控制在當(dāng)前檔位下的行進步數(shù)便能完成在自動控制下的工作??刂菩蛄械妮斎朐谖业某绦蛑胁⒉皇怯贸S玫奈谋据斎耄▽嶒灪蟀l(fā)現(xiàn)文本輸入更為簡單而不需要進行數(shù)字的轉(zhuǎn)換,這里走了彎路,但是還是按照最初自己的設(shè)計思路來說明的),我是從編輯框的控件進行輸入的,由于編輯框的數(shù)據(jù)相當(dāng)與字符串的類型,因而并不能對數(shù)字進行識別(即在編輯框中輸入123,程序中只能分別識別數(shù)字123而不是整數(shù)123而文本輸入便能解決這個問題,這就是我說的彎路所在),同時在序列輸入完畢后我會對該序列進行遍歷,如果遇到不是a?h或者不是0~9中的字符便提示該序列是非法序列,否則用兩個數(shù)組對字母或者數(shù)字分別進行存儲,同時用計數(shù)器進行計數(shù)來判別字母或者數(shù)字是否相對應(yīng),一個字母應(yīng)該相對應(yīng)的對應(yīng)一個數(shù)字,這樣才算完整的序列。序列判別完畢后,接下來的工作就是用序列來控制電機的自動運轉(zhuǎn),即控制在整數(shù)步驟內(nèi)完成相應(yīng)的電機運轉(zhuǎn)操作,具體的運轉(zhuǎn)操作還是和手動控制一樣。值得注意的是無論是自動測試還是手動測試,都要求用文件來保存小車行駛的里程,以便下次程序運行時開始重新調(diào)用,因此在程序中涉及到了讀、寫文件的操作,我的設(shè)計過程中,都是在電機沒運轉(zhuǎn)一步時便開始重新將里程寫入文件,而讀文件是在每次程序開始重新運行時。2.3基于MFC的程序具體的設(shè)計步驟:(1)主程序框圖如下:
(2)詳細的設(shè)計步驟步驟1:創(chuàng)建基于對話框的MFC程序,同時將主對話框及作為程序的主登錄界面,給程序添加自動測試和手動測試的選擇按鈕,及進入測試的按鈕,如圖示:圖4:主程序界面步驟2:創(chuàng)建2個新的對話框分別作為手動測試和自動測試的主界面,同時都給對話框分別添加速度和里程顯示的編輯框以及進入測試的按鈕,同時MFC的頭文件中還必須添加#include"conio.h"的頭文件,以便對實驗中的端口地址進行調(diào)用。界面設(shè)置如圖示:圖5:各測試程序界面步驟3:完成相應(yīng)代碼部分的書寫
調(diào)試分析 調(diào)試過程中在手動控制這塊基本沒有什么問題,問題主要是集中在自動測試的過程中,這也和每個人的程序書寫有關(guān),由于我的程序不是用的文本來進行控制序列的輸入,因此在進行字符的轉(zhuǎn)換這一塊經(jīng)常一些沒想到的情況出現(xiàn),但是通過不斷的調(diào)試和老師的驗收,最后還是圓滿的完成了此次課程設(shè)計。下面主要給出自動測試過程中一些非法的序列輸入:圖六:一些非法的輸入圖六:一些非法的輸入其中正確的輸入即為程序中定義的a~h八個檔位加數(shù)字(及在檔位行進的步數(shù))如下圖:目動測試程序圖七:正確的輸入序列實驗結(jié)果及收獲本次實驗一共是四個人一組,因此在糾錯方面能夠較為迅速的發(fā)現(xiàn)問題同時解決問題,在第二次實驗的時候我們組就已經(jīng)驗收了,這里也頗為自豪。實驗的過程印象較為深刻的是老師在檢查自動運轉(zhuǎn)這一塊,有幾次都是因為程序不夠嚴謹而犯了錯誤,因此在以后的程序書寫過程中應(yīng)該更加認真的審視自己的程序。同時此次實驗也是對MFC綜合應(yīng)用的一次鍛煉,在以后的學(xué)習(xí)中應(yīng)該自己多給自己創(chuàng)造一些這樣的機會,鍛煉自己學(xué)習(xí)的綜合運用能力。部分程序清單如下:〃不同狀態(tài)的定義分別表示不同的檔位typedefenum{s0,sl,s2,s3,s4,s5,s6,s7,s8,s9}State;//手動測試部分voidSpeed::OnButtonStart(){//TODO:Addyourcontrolnotificationhandlercodeherefp=fopen(〃data.txt〃,〃r〃);//打開保存里程的文檔if(!feof(fp)){fscanf(fp,"%d”,&m_length);}_outp(0x0c803,0x80);while(l){ReadDotaO;if(flag==1){flag=0;fp=fopen("data.txt","w");fprintf(fp,"%d",m_length);MessageBox("本次測試結(jié)束,請重新開始!");break;}switch(state){cases0://測試開始開關(guān)flag=1;break;casesi://靜止_outp(0x0c860,255);Sleep(300);_outp(0x0c860,0);Sleep(300);break;cases2://進檔1m_speed=60;m_length+=40;Right();_outp(0x0c860,2);Sleep(300);_outp(0x0c860,0);Sleep(300);break;cases3://進檔2m_speed=70;m_length+=40;Right();_outp(0x0c860,4);Sleep(300);_outp(0x0c860,0);Sleep(300);break;cases4://進檔3m_speed=80;m_length+=40;Right();_outp(0x0c860,8);Sleep(300);_outp(0x0c860,0);Sleep(300);break;cases5://進檔4m_speed=90;m_length+=40;Right。;_outp(0x0c860,16);Sleep(300);_outp(0x0c860,0);Sleep(300);break;cases6://進檔5m_speed=100;m_length+=40;Right();_outp(0x0c860,32);Sleep(300);_outp(0x0c860,0);Sleep(300);break;cases7://進檔6m_speed=120;m_length+=40;Right();_outp(0x0c860,64);Sleep(300);_outp(0x0c860,0);Sleep(300);break;cases8://倒檔m_speed=40;m_length+=40;Left();_outp(0x0c860,128);Sleep(300);_outp(0x0c860,0);Sleep(300);break;cases9://換檔MessageBox("確定要換檔?");break;default:break;//初始化及檔位的判斷intSpeed::ReadDota(){intk;k=_inp(0x0c860);〃讀入LED的開關(guān)信息//根據(jù)開關(guān)的信息做出判斷當(dāng)前檔位if(k==0)//elseif(k==1)state=s1;elseif(k==2){state=s2;dalay=1000;}elseif(k==4){state=s3;dalay=800;}elseif(k==8){state=s4;dalay=600;}elseif(k==16){state=s5;dalay=400;}elseif(k==32){state=s6;dalay=200;}elseif(k==64)state=s7;dalay=100;}elseif(k==128){state=s8;dalay=1500;}elsestate=s9;UpdateData(O);UpdateWindow();return0;}//電機開始右轉(zhuǎn)intSpeed::Right(){_outp(0x0c801,a[ii]);ii++;//到下一相序if(ii==8)ii=0;return0;}//電機開始左轉(zhuǎn)intSpeed::Left(){_outp(0x0c801,a[jj]);jj—;//到下一相序if(jj==-1)jj=7;return0;}//自動測試部分///////////////////////////////////////////////////////////////////////////////Lengthmessagehandlers〃對輸入的初始行進序列的判斷判斷是否合法如果合法則開始存儲運行voidLength::OnButton1(){//TODO:Addyourcontrolnotificationhandlercodeherem_ceshi="";fp1=fopen("data.txt","r");//文件操作if(!feof(fp1)){fscanf(fp1,"%d",&m_length);}chars[1000];intn;inti,j;charalp[200];intnum[200],tmp=0;intcount1=0,count2=0,countN=0;intflag=0;//表示是數(shù)字1表示是字母charz[10];UpdateData(1);n=m_ceshi.GetLength();itoa(n,z,10);MessageBox(z);s[0]=m_ceshi.GetAt(0);if(!(s[0]〉=97&&s[0]<=104)){MessageBox("非法序列monkey!");m_ceshi=;nimei();return;}〃用于序列的判斷及存儲for(i=0;i<n;i++){s[i]=m_ceshi.GetAt(i);if(s[i]>=97&&s[i]<=104){if(flag==1){MessageBox("非法序列biaoge!");m_ceshi=;nimei();break;}if(countN!=0){for(j=0;j<countN;j++){intjj;jj=countN-j-1;tmp+=PanDuan(jj)*((int)s[i-countN+j]-48);}num[count2++]=tmp;tmp=0;countN=0;}alp[count1++]=s[i];flag=1;countN=0;}elseif(s[i]>=48&&s[i]<=57){countN++;flag=0;}else{MessageBox("非法序列mengge2!");m_ceshi="";nimei();return;}if((i==(nT))&&(flag==0)&&(s[i]〉=48)&&(s[i]<=57)){for(j=0;j<countN;j++){intjj;jj=countN-j-1;tmp+=PanDuan(jj)*((int)s[i-countN+j+1]-48);}//MessageBox("wofuleni");num[count2++]=tmp;tmp=0;//countN=0;}/*if(s[i]==97){flag=0;} */}//序列之間不匹配if(flag==1){MessageBox("非法序列mengge!");m_ceshi=;nimei();return;}〃itoa(count2,z,10);//MessageBox(z);/*for(i=0;i<count2;i++){m_speed=num[i];Sleep(300);nimei();}for(i=0;i<count1;i++){m_length=alp[i];Sleep(300);nimei();}*/for(i=0;i<count1;i++){ReadDota(alp[i]);SoGa(num[i]);}UpdateData(1);fp1=fopen("data.txt","w");fprintf(fp1,"%d",m_length);}〃刷新窗口intLength::nimei(){UpdateData(0);UpdateWindow();return0;}//主要用于在進行序列判斷時序列當(dāng)前位數(shù)的識別intLength::PanDuan(int&n){switch(n){case0:return1;case1:return10;case2:return100;case3:return1000;case4:return10000;case5:return1000000;}return0;}〃自動運行的主函數(shù)intLength::SoGa(intn){inti;UpdateData(1);fp1=fopen("data.txt”,"r”);if(!feof(fp1)){fscanf(fp1,"%d”,&m_length);}_outp(0x0c803,0x80);for(i=0;i<n;i++){switch(state){caseS1://靜止擋_outp(0x0c860,255);Sleep(300);_outp(0x0c860,0);Sleep(300);break;caseS2://進檔1m_speed=60;m_length+=40;Right();_outp(0x0c860,2);Sleep(300);_outp(0x0c860,0);Sleep(300);break;caseS3://進檔2m_speed=70;m_length+=40;Right。;_outp(0x0c860,4);Sleep(300);_outp(0x0c860,0);Sleep(300);break;caseS4://進檔3m_speed=80;m_length+=40;Right();_outp(0x0c860,8);Sleep(300);_outp(0x0c860,0);Sleep(300);break;caseS5://進檔4m_speed=90;m_length+=40;Right();_outp(0x0c860,16);Sleep(300);_outp(0x0c860,0);Sleep(300);break;caseS6://進檔5m_speed=100;m_length+=40;Right();_outp(0x0c860,32);Sleep(300);_outp(0x0c860,0);Sleep(300);break;caseS7://進檔6m_speed=120;m_length+=40;Right();_outp(0x0c860,64);Sleep(300);_outp(0x0c860,0);Sleep(300);break;caseS8://慢擋m_speed=40;m_length+=40;Left();_outp(0x0c860,128);Sleep(300);_outp(0x0c860,0);Sleep(300);break;//cases9://MessageBox("確定要換檔?”);//break;default:break;}fp1=fopen("data.txt","w");fprintf(fp1,"%d",m_length);UpdateData(O);UpdateWindow();}//fp=fopen("data.txt","w");//fprintf(fp,"%d",m_length); //Mess
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 關(guān)于節(jié)約糧食的讀后感
- 2024年限定產(chǎn)品售后服務(wù)細則協(xié)議
- 南京信息工程大學(xué)《中外文化比較》2022-2023學(xué)年第一學(xué)期期末試卷
- 克雷洛夫寓言讀后感二十字
- 兒時回憶300字模板
- 化學(xué)礦的提取工藝與設(shè)備考核試卷
- 煤炭氣化與氣能利用技術(shù)考核試卷
- 危險品倉儲風(fēng)險防控方案及應(yīng)急預(yù)案編制考核試卷
- 信息系統(tǒng)的電子媒體與虛擬廣告考核試卷
- 制糖產(chǎn)品包裝設(shè)計改進考核試卷
- 2024年公路建設(shè):泥漿外運及環(huán)保處理合同
- 江蘇省蘇州市吳中區(qū)2024-2025學(xué)年八年級上學(xué)期期中考試歷史卷(含答案)
- 2024-2025學(xué)年上學(xué)期期中教育學(xué)業(yè)質(zhì)量監(jiān)測九年級歷史試卷
- 【2024-2025】學(xué)年一上語文期中素養(yǎng)測評基礎(chǔ)卷一
- 小兒血液透析的護理
- 人教版(2024新版)七年級上冊數(shù)學(xué)期中模擬檢測試卷(含答案)
- 民間借貸利息計算表
- 滬科版(2024)八年級全一冊物理第一學(xué)期期中學(xué)業(yè)質(zhì)量測試卷 2套(含答案)
- 精神病醫(yī)院住院患者護理評估單
- 生活中的音樂教案
- 辯論賽評分表(完整版)-
評論
0/150
提交評論