




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
實驗四綜合實驗設計一、 實驗目的通過熟悉MagicARM2410實驗箱各模塊的功能,再結合自己所學的專業知識以及各模塊的程序設計方法,設計一個綜合實驗。二、 實驗要求設計一個綜合實驗,要求通過鍵盤改變控制直流電機的轉速,同時通過RTC和UART模塊,在PC機超級終端處顯示步進機轉速的級別以及時間。在此實驗中包括了UART、定時器中斷、RTC、鍵盤LED數碼管顯示、直流步進電機等模塊。三、 實驗設計思路本實驗通過設計一個控制LED數碼管顯示并接收鍵盤輸入的主程序,在主程序中通過鍵盤輸入調用直流電機中控制轉速的子程序,不同的鍵值輸入對應不同的直流電機轉速。并且在改變轉速的同時,通過調用RTC和UART模塊,分別向PC機發送時間和轉速的級別。因此關鍵是設計好主程序,解決好各調用子程序之間的矛盾和沖突,使他們可以很好的共存。實驗框圖如下:'鍵盤輸入] 〉改變轉速 I 二發送時間至II]、 1—r- 1-| J PC上顯示LED數碼管 發送轉速到顯示電機模式 PC上顯示直流電機的轉速改變是通過改變電壓來完成的,電壓越大,直流電機的轉速越快,而不同電壓所需要的占空比是不一樣的,本實驗就是通過改變占空比來實現不同電壓的轉變,從而控制直流電機的轉速。四、實驗程序由于實驗程序比較長,現只將實驗的主程序的main函數表示出來,其他調用程序見附件一。voidmain(void){inti,j;inttemp;uint16key;disp_buf0[0]=0;disp_buf1[0]=1;disp_buf2[0]=2;disp_buf3[0]=3;//直流電機初始化設置//TOUT0口設置rGPBCON=(rGPBCON&(?(0x03<<0)))I(0x02<<0);//rGPBCON[1:0]=10b,設置TOUT0功能rGPBUP=rGPBUPI0x0001;//禁止TOUT0口的上拉電阻//設置GPH9為GPIO輸出模式rGPHCON=(rGPHCON&(?(0x03<<18)))I(0x01<<18); //GPH9口rGPHDAT=rGPHDAT&(?(1<<9));//輸出0電平rGPHUP=rGPHUPI(1<<9);//GPIO設置rGPACON=rGPACON&(?(1<<21)); //A口,RUN燈控制口(GPA21)rGPHCON=(rGPHCON&(?(0x03<<20)))I(0x01<<20); //rGPHCON[21:20]=01b,設置GPH10為I/O輸出模式//設置中斷服務程序VICVectAddr[10]=(uint32)IRQ_Time0; //定時中斷向量地址設置VIC旋ctAddr[4]=(uint32)IRQ_Eint4; //外部中斷向量地址設置//設置中斷控制器PRIORITY=0x00000000; //使用默認的固定的優先級rINTMOD=0x00000000; //所有中斷均為IRQ中//GPIO設置rGPACON=rGPACON&(?(1<<21)); //A口,RUN燈控制口(GPA21)rGPHCON=(rGPHCON&(?(0x03<<20)))I(0x01<<20);//rGPHCON[21:20]=01b,設置GPH10為I/O輸出模式//初始化I2C接口InitI2C();rINTMSK=0xFFFFFBEF;//使能EINT4中斷rEINTMASK=?0x0000010;//控制LED數碼管顯示while(i==0){for(j=0;j<1;j++)disp_buf[j]=i;ZLG7290_SendBuf((uint8*)disp_buf,8);DelayNS(10);}//讀取按鍵,設置鍵值對應的顯示位閃爍while(1){DelayNS(1);key=ZLG7290_GetKey();if((key&0xFF00)==0){key=key&0x00FF;}switch(key){case1:ZLG7290_SendBuf((uint8*)disp_buf0,1);PWM_Init(255,255/4);//以1/4占空比改變直流電機的轉速UART_SendStr(直流電機以spee1運行\n");DelayNS(20);//延時RTC_Init(0); //初始化RTC(非強行方式)RTC_Read(1);//讀日期temp=0;{while(temp==rBCDSEC);break;case2:ZLG7290_SendBuf((uint8*)disp_buf1,1);PWM_Init(255,2*255/4);//以2/4占空比改變直流電機的轉速UART_SendStr(直流電機以speed2運行\n");DelayNS(20);//延時RTC_Init(0);//初始化RTC(非強行方式)RTC_Read(1);//讀日期temp=0;{while(temp==rBCDSEC);temp=rBCDSEC;RTC_Read(0);//讀時間DispRTC();//輸出時間顯示}break;case3:ZLG7290_SendBuf((uint8*)disp_buf2,1);PWM_Init(255,3*255/4);//以3/4占空比改變直流電機的轉速UART_SendStr(直流電機以speed3運行\n");DelayNS(20);//延時RTC_Init(0);//初始化RTC(非強行方式)RTC_Read(1);//讀日期temp=0;{while(temp==rBCDSEC);break;case4:ZLG7290_SendBuf((uint8*)disp_buf3,1);PWM_Init(255,4*255/4);〃使直流電機全占空比停止轉動UART_SendStr(直流電機停止運行\n");DelayNS(20);//延時RTC_Init(0);//初始化RTC(非強行方式)RTC_Read(1);//讀日期temp=0;{while(temp==rBCDSEC);temp=rBCDSEC;RTC_Read(0); //讀時間DispRTC(); //輸出時間顯示}break;default:break;}//endofswitch(key)...}}五、實驗步驟:啟動ADS1.2IDE集成開發環境,選擇【File]->【New…】,使用ARMExecutableImage工程模板建立一個工程,名稱為qiub,目錄為D:\arm\myproject\qiub0選擇【File]->【New…】建立一個新的文件main.c,設置直接添加到項目中,在Targets一欄中選擇Debug.輸入主程序的程序代碼,并保存,此時在工程窗口中可以看到main.c文件。打開所建的工程,選擇ADDFlies,向該工程添加實驗所需要的各個模塊,如圖所示:
瞪qiub.mcp |1=1||回1□[蛾司始守修*A0LinkOrderT:±t-gets|啰 File CodeData暮蕓-1^3head 0 0 ? 旦Dconfig.h 0 0 * 工]Gth 0 0 * Eg]S3C2410.h 0 0 . 二]啰startup 0 0 * * ^1葉 防StartUF.e 0 0 ? *曜- Qtarget 0 Cl ? ? =1曜 目。c 0 0 * ? 可啰-'-urLEule 0 0 ? ,可P-9u:di-+.h | o| o* p轎 心 c 0 0* ?可啰-£3IM也「已 0 0?,fGIcdiirive.h 0 0* 二]啰 心Icdilrive.c 0 0? ,可? - 0 0 * ?工]曜 、置bliss.c 0 0* ?可啰-taI£C o o ? ?旦g]I2C.h 0 0 , 工]轎 £1 I2C-c 0 0 * ?二]g]zlg7290.h 0 0 ? 司常 Q -lgT290.c 0 0 * ?司葉-句* 0 0 ? ?/ 心 main,c 0 0 * ?F15files 0 0工程文件添加完畢后保存,然后選擇【Project!->【Make】,將編譯鏈接整個工程。如果有錯誤按照錯誤提示欄提示的錯誤進行修改,直到鏈接正確。打開JTAG仿真器軟件,并且在電腦開始菜單找到附件一>數據通訊一>超級終端;打開超級終端,設計超級終端的參數,用于觀察數據的接收。選擇【Project!->[Debug],IDE環境就會啟動AXD調試軟件,如果首次運行要記得加載初始化文件ARM2410.txt,初試完畢后,可以執行單步或全速運行調試。全速運行后,改變鍵盤上的鍵值從0鍵到3鍵,觀察直流電機的轉速改變情況以及超級終端的數據接受情況。六、實驗結果及分析通過改變鍵盤的輸入值,直流電機的轉速發生改變,當鍵盤按下0鍵時,LED數碼上顯示1,代表直流電機以1/4占空比模式運行,同時可以從超級終端處觀察到發送來的數據“直流電機以speel運行”,后面緊接著顯示時間如圖1所示。同樣按下鍵1和鍵2時可以分別看到LED數碼上顯示2和3,他們分別代表直流電機以2/4占空比模式運行和3/4占空比模式運行。在接收端可以從
超級終端分別觀察到“直流電機以speed2運行”和“直流電機以speed3運行”后面緊跟著的是他們開始旋轉的時間。當按下鍵3時,LED數碼上顯示4,表示直流電機切換到全占空比模式,即直流電機停止轉動,此時可以從超級終端收到“直流電機停止運行”以及開始停止的時間。通過觀察得知直流電機的轉速與占空比有關,當占空比小于1時,且逐漸增大時,直流電機的轉速越來越快,也就是speed1<speed2<speed3;實驗截圖如下:文件⑤編輯(£)查看世)呼叫(£)傳送如)幫助電)□務福珍如S曾直流電機以speel運行20:57:46 Tuesday, 1/10/2006直流電機以speed3運行20:57:49 Tuesday, 1/10/2006直流電機以speed2運行20:57:51 Tuesday, 1/10/2006直流電機停止運行20:57:53 Tuesday, 1/10/2006直流電機以speel運行120:57:58 Tuesday,1/10/2006直流電機以speed2運行 |20:57:59 Tuesday, 1/10/2006直流電機停止運行20:58:01 Tuesday, 1/10/2006直流電機以speel運行20:58:03 Tuesday, 1/10/2006直流電機以speel運行20:58:04 Tuesday, 1/10/2006直流電機以speel運行20:58:06 Tuesday, 1/10/2006直流電機以speed2運行20:58:07 Tuesday, 1/10/2006直流電機以speed3運行20:58:09 Tuesday, 1/10/2006直流電機以speed2運行20:58:11 Tuesday, 1/10/2006直流電機以speed2運行9HSR-12 TiiP<?rlAu 1 I從截圖可以看出各個模式之間可以通過按下不同的鍵值相互跳轉,如果沒有其他鍵按下要求跳轉,則直流步進電機一直以該模式運行。七、實驗心得:(一)本次實驗雖然只是一個小型的綜合性實驗,但是對于我這么一個初次接觸嵌入式的人來說,還是遇到了很多困難。首先在硬件方面上感到很吃力,很多以前學過的東西都忘了,比如中斷的優先級,以及各寄存器的組織結構等,加上ARM本身復雜的體系結構,使得我不得不一邊操作一邊學習,遇到哪里不懂的,就去翻書找相應的知識,或到網上去找相關資料。其次是軟件方面的知識還很欠缺,雖然以前學習過C語言,以及匯編語言,但好久沒有用過,很多指令都忘了,加上ARM本身的指令集,要想自己真正編寫一個完整的程序顯得是那么困難。幸好實驗室有很多已經編好的實驗程序模板,我可以參照上面的實驗程序,通過一些修改,達到實現所要的功能。如果沒有那些源程序,我想我可能會遇到更多的問題。我知道自己還停留在初級水平,甚至連初級水平都沒有達到,因為嵌入式所需要的知識很廣,很全,而你必須在各個方面都很熟悉,才能得心應手。還有經驗很重要,對于我們初學者來說,最缺乏的就是經驗,獲取經驗的最好的方法就是學習那些已經編好的實驗模板,因為那些模板是經驗的總結,那正是我們所要需要的。通過不斷的學習他人的實驗成果,才能不斷的積累,當積累經驗到一定的程度的時候,你就可以得心應手的實現自己想要實現的各個功能,那時你就可以有自己的東西,可以有自己的創新。(二) 在設計這個實驗的過程中,主要經歷三個過程:構思,設計,調試。首先是想怎么把各個實驗綜合到一起,實現各個模塊的功能,同時又要有一定的實際意義。經過反復斟酌決定采用鍵盤控制直流電機的轉速,同時輸出轉速級別以及轉速改變的時間,這樣就把實驗要求的各個模塊基本都整合到一起了。初步思路出來了以后,就是開始設計主程序了,這一階段花了很多時間。因為自己是第一次設計程序,很多東西不是很了解,所以必須先學習一些例子,了解程序設計的一些基本原則。我把實驗室電腦中MagicARM2410光盤的基礎實驗的各個程序仔細研究了一下,同時也熟悉了各個功能模塊功能實現的原理,這也為我后面程序設計提供了一種參考。有了這些準備工作,就是開始設計自己的實驗程序,通過不斷的添加和修改,再經過編譯,確定沒有問題了保存好工程文件。最后就是調試了,這是最關鍵的一步,也是最繁瑣的一步,同時也是學東西最多的一個階段。我們不可能設計程序出來了就一點問題都沒有,很多時候都是通過一步步調試,不斷的修改,一個個問題的解決,才能最終成功。我的也不例外,一開始時什么功能都不能實現,那時真的很失落,很受打擊。但我告訴自己,必須耐心的調試,才有可能成功。我通過單步運行,觀察程序的運行,分析模塊的功能不能實現的原因,一個一個模塊單獨調試。在調試的過程中運到了很多問題,比如模塊之間共用相同寄存器而帶來的沖突以及寄存器的某些功能沒有開啟或是關閉了等。這些問題很多都是通過回過頭去研究實驗模板的設計,再結合英文的s3c2410.pdf文件的介紹,了解各寄存器的初始化以及寄存器每位所代表的功能來解決的。當這些問題都解決了,實驗朝著理想的方向前進,很多功能都能實現了。此時先前的挫敗感,一下就消失了,那種調試成功的喜悅是無法用言語來表達的。調試過程是一個很磨礪人的一個過程,在反復失敗的時候還要繼續嘗試,這是很痛苦的。很多人就是因為不能承受折磨而最終放棄了,而成功就是建立在無數次失敗之上的,快樂也是建立在痛苦之上的,只有經歷了那個過程的點點滴滴,才能體會成功的那份喜悅。(三) 在此次實驗中,我還遇到了一些不知道怎么解釋的問題,比如說我改變了輸出的字符時,整個實驗程序就不能正常運行,pc機上也不能接受發送的數據,而當我改回來時,程序又能正常運行。還有就是當我打開定時中斷時,按下某一鍵時,程序不能跳轉了,一直停留在此,好像死機了一樣。而當臥關閉定時中斷時,程序又可以正常運行。我猜這可能與直流電機中的定時器0有沖突或是共用了定時器0才導致了這樣。(四) 這次實驗讓我學到了很多東西,懂得了實驗要付出很多艱辛的努力,而所有的這些努力都是值得的。它不僅提升了你的動手能力、學習能力,分析問題和解決問題的能力,同時也教會了我如何學習,如何查找資料。這些東西在課本上是學不到的,你必須自己親自通過實驗這個過程來體驗感知。實驗過程的點點滴滴都將是我們日后學習、工作的一筆寶貴的財富。附件一實驗主程序#include"config.h//定義顯示緩沖區chardisp_buf[50];chardisp_buf0[10];chardisp_buf1[10];chardisp_buf2[10];chardisp_buf3[10];//ZLG7290控制LED數碼管閃爍命令#defineGlitter_COM0x70//定義當前時間變量uint8g_year=0;uint8g_month=0;uint8g_date=0;uint8g_day=0;uint8g_hour=0;uint8g_min=0;uint8g_sec=0;//定義星期字符串char*str_day[8]={"","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};//定義初始化時鐘值#defineINIT_YEAR0x11/*2011年*/#defineINIT_MONTH0x05/*5月*/#defineINIT_DATE0x21/*21日*/#defineINIT_DAY0x06/*星期六*/#defineINITHOUR0x09/*20時*/#defineINITMIN0x30/*30分*/#defineINITSEC0x00/*0秒*///延時voidDelayNS(uint32dly){uint32i;for(;dly>0;dly--)for(i=0;i<50000;i++);}//RTC初始化voidRTC_Init(intforce){interr;uint32bak;//判斷當前RTC是否正確運行err=0;if(force==0) //若force為0,則判斷當前時鐘是否正確{rRTCCON=0x00; //禁止RTC接口(只允許RTC計數和讀數)bak=rBCDYEAR&0xFF;if(bak>0x99)err++; //年判斷bak=rBCDMON&0x1F;if(bak>0x12)err++; //月判斷bak=rBCDDATE&0x3F;if(bak>0x31)err++; //日判斷bak=rBCDHOUR&0x3F;if(bak>0x24)err++; //時判斷bak=rBCDMIN&0x7F;if(bak>0x59)err++; //分判斷bak=rBCDSEC&0x7F;if(bak>0x59)err++; //秒判斷if(err==0)return;//若時鐘正確,則直接返回}rRTCCON=0x01; //標準模式,RTC接口使能(允許寫)rBCDYEAR=INIT_YEAR&0xFF;rBCDMON=INIT_MONTH&0x1F;rBCDDATE=INIT_DATE&0x3F;rBCDDAY=INIT_DAY&0x07;//星期,MON:1TUE:2WED:3THU:4FRI:5SAT:6SUN:7rBCDHOUR=INIT_HOUR&0x3F;rBCDMIN=INIT_MIN&0x7F;rBCDSEC=INIT_SEC&0x7F;rRTCCON=0x00; //禁止RTC接口(只允許RTC計數和讀數)}//讀時間voidRTC_Read(uint32date){if(date){g_year=rBCDYEAR;g_month=rBCDMON;g_date=rBCDDATE;g_day=rBCDDAY;}g_hour=rBCDHOUR;g_min=rBCDMIN;g_sec=rBCDSEC;}〃顯示時間voidDispRTC(void){sprintf(disp_buf,"%02x:%02x:%02x%10s,%2x/%2x/20%02x\n",g_hour,g_min,g_sec,str_day[g_day],g_month,g_date,g_year);UART_SendStr(disp_buf);}//初始化PWM定時器voidPWM_Init(uint16cycle,uint16duty)if(duty>cycle)duty=cycle; //參數過濾//設置定時器0,即PWM周期和占空比//Fclk=200MHz,時鐘分頻配置為1:2:4,艮口Pclk=50MHz。rTCFG0=97; //預分頻器0設置為98,取得510204HzrTCFG1=0; //TIMER0再取1/2分頻,取得255102HzrTCMPB0=duty;//設置PWM占空比rTCNTB0=cycle;//定時值(PWM周期)if(rTCON&0x04)rTCON=(1<<1); //更新定時器數據(取反輸出inverter位)elserTCON=(1<<2)|(1<<1);rTCON=(1<<0)|(1<<3); //啟動定時器}//外部中斷初始化voidEINT_init(void){rGPFCON=(rGPFCON&0xFFFFFCFF)|(0x02<<8); //設置GPF4引腳為外部中斷EINT4功能rEXTINT0=(0x2<<16); //外部中斷EINT4設置為下降沿觸發rINTMSK=rINTMSK&(?(1<<1)); //使能EINT4中斷rEINTMASK=?0x0000010;}〃中斷服務程序voidIRQ_Eint4(void){inti;inttemp;//按鍵去抖動rGPFCON=rGPFCON&(?(0x03<<8));//設置為GPIO輸入方式for(i=0;i<10000;i++); //延時去抖動if(rGPFDAT)//若是假按鍵,則直接退出rGPFCON=rGPFCONI(0x02<<8);//設置回EINT4中斷口//清除中斷標志rEINTPEND=(1<<4);rSRCPND=(1<<4);rINTPND=rINTPND;return;}rGPFCON=rGPFCON|(0x02<<8); //設置回EINT4中斷口//執行串口發送數據UART_Select(0); //選擇UART0UART_Init(); //初始化UART0UART_SendStr("stoptime\n");RTC_Init(0);//初始化RTC(非強行方式)RTC_Read(1); //讀日期temp=0;while(temp==rBCDSEC);temp=rBCDSEC;RTC_Read(0);//讀時間DispRTC(); //輸出時間顯示//清除中斷標志rEINTPEND=(1<<4);rSRCPND=(1<<4);rINTPND=rINTPND;}//定時器1初始化voidIRQ_TimInit(void)
//Fclk=200MHz,時鐘分頻配置為1:2:4,艮口Pclk=50MHz。//rTCFG0=255; ////rTCFGl=3;rTCMPBl=0x0000; //rTCFG0=255; ////rTCFGl=3;rTCMPBl=0x0000; //rTCNTB1=255102; //rTCON=(1<<8);rTCON=(1<<7)|(1<<10);IRQEnable(); ////TIMER0再取1/4分頻,取得50KHz設置定時器為0定時1秒//更新定時器數據//啟動定時器使能IRQ中斷(CPSR)//定時中斷服務程序voidIRQ_Time0(void)//voidIRQ_Time0(void){inti;UART_Select(0); //選擇UART0UART_Init(); //初始化UART0DelayNS(50);for(i=0;i<10;i++){UART_SendStr("continuetime!\n");}//清除中斷標志rSRCPND=1<<10;rINTPND=rINTPND;}//主函數voidmain(void)inti,j;inttemp;uint16key;disp_buf0[0]=0;disp_buf1[0]=1;disp_buf2[0]=2;disp_buf3[0]=3;//直流電機設置//TOUT0口設置rGPBCON=(rGPBCON&(?(0x03<<0)))|(0x02<<0); //rGPBCON[1:0]=10b,設置TOUT0功能rGPBUP=rGPBUPI0x0001; //禁止TOUT0口的上拉電阻//設置GPH9為GPIO輸出模式rGPHCON=(rGPHCON&(?(0x03<<18)))I(0x01<<18);//GPH9口rGPHDAT=rGPHDAT&(?(1<<9)); //輸出0電平rGPHUP=rGPHUPI(1<<9);設置GPH10為I/O輸出模式//設置中斷服務程序VICVectAddr[10]=(uint32)IRQ_Time0; //定時中斷向量地址設置VICVectAddr[4]=(uint32)IRQ_Eint4;//外部中斷向量地址設置//設置中斷控制器rPRIORITY=0x00000000; //使用默認的固定的優先級rINTMOD=0x00000000; //所有中斷均為IRQ中斷//GPIO設置rGPACON=rGPACON&(?(1<<21)); //A口,RUN燈控制口(GPA21)rGPHCON=(rGPHCON&(?(0x03<<20)))I(0x01<<20); //rGPHCON[21:20]=01b,設置GPH10為I/O輸出模式//初始化I2C接口InitI2C()//使能EINT4中斷//使能EINT4中斷rEINTMASK=~0x0000010;//顯示while(i==0){for(j=0;j<1;j++)disp_b
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024優衣庫店鋪實習生火熱招募中筆試參考題庫附帶答案詳解
- 2025新一代人工智能技術發展及其應用報告-西藏大學
- 2024中鋁智能科技發展有限公司面向社會公開招聘59人(第五批)筆試參考題庫附帶答案詳解
- 工業氣體銷售培訓
- 肺栓塞溶栓治療的護理
- 高中化學奧賽培訓全攻略
- 多感官訓練室培訓
- 吊機安全培訓
- 常用公文寫作格式培訓
- 人教版 (2019)必修2《遺傳與進化》第1節 基因突變和基因重組教案
- 學前教育實習報告范文2000字2篇
- 2024年河北省專升本考試生理學康復治療學專業測試題含解析
- 電商用戶畫像構建與精準營銷報告
- 2023-2024學年七年級生物冀少版下冊期末測試卷(一)
- TL-PMM180超低煙塵使用及維護培訓
- 能源托管項目解決方案
- 夏季換季護膚知識培訓課件
- 大學美育(第二版) 課件 第九單元:雕塑藝術 課件
- 混合動力汽車動力傳動系統方案設計
- 冰雪運動場所的危險源識別與風險評估
- 消化道腫瘤防治知識講座
評論
0/150
提交評論