實驗一直流、步進電機綜合控制系統設計_第1頁
實驗一直流、步進電機綜合控制系統設計_第2頁
實驗一直流、步進電機綜合控制系統設計_第3頁
已閱讀5頁,還剩15頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、實驗直流、步進電機綜合控制系統設計、實驗目的通過本次實驗熟悉 MagicARM2410 GPIO、UART、RTC,步進電機,直流 電機, IIC 的工作原理;并能熟悉的編程控制。二、實驗要求以MagicARM2410為實驗平臺,設計一個通過串口通信交互控制的綜合型 控制系統。具體來說,可在啟動時,自動列出一些選項,通過鍵盤選擇某個選項 而實現其功能; 考慮到實時性, 再按某個控制鍵能立刻停止當前功能而回到初始 的待選狀態。具體功能要求如下:1 、實現四個 LED 燈按照十六進制的規則依次亮滅;2、在超級終端上輸入兩個兩位數,實現兩位數的加減乘除并顯示運算結果;3、顯示當前的年月日、星期、時分

2、秒;4、實現步進電機的調速和正反轉;可用旋轉按鈕 W1 或按鍵控制調速,在超 級終端和數碼管上同步顯示其正反轉和轉速信息;5、實現直流電機德調速和正反轉;可用旋轉按鈕 W2 或按鍵控制調速,在超 級終端和數碼管上同步顯示其正反轉和轉速信息;6、利用 IIC 通信,實現 EEPROM 的讀寫;在超級終端上顯示地址和數據。三 、實驗原理(一) LED 燈四個小燈分別接于 GPE11、GPE12 GPH4、GPH6端口;控制端口“ 0 “和“ 1 ”分別實現亮滅 (端口設為輸出 )如下:void LED_init(void)/ 初始化 I/OrGPECON = (rGPECON & (0x0

3、F<<22) | (0x05<<22);/ rGPECON25:22 = 0101b 設置 GPE11 GPE12為 GPIO輸出模式rGPHCON = (rGPHCON & (0x33<<8)|) (0x11<<8);/rGPHCON13:8 = 01xx01b 設置 GPH4 GPH6為 GPIO輸出模式(二) UARTUART是一種通用串行數據總線,用于異步通信。該總線雙向通信,可以實現全雙工傳輸和接收。在嵌入式設計中,UART用來與PC進行通信,包括與監控調試器和其它器件,如EEPROM通信。UART首先將接收到的并行數據轉換成串

4、行數據來傳 輸。消息幀從一個低位起始位開始,后面是58個數據位,一個可用的奇偶位和一個或幾個高位停止位。接收器發現開始位時它就知道數據準備發 送,并嘗試與發送器時鐘頻率同步。如果選擇了奇偶,UART就在數據位后面加上奇偶位。奇偶位可用來幫助錯誤校驗。在接收過程中,UART從消息幀中去掉起始位和結束位,對進來的字節進行奇偶校驗,并將數據字節從 串行轉換成并行。UART也產生額外的信號來指示發送和接收的狀態。例如, 如果產生一個奇偶錯誤,UART就置位奇偶標志。UART# 用1 發送/接收邏輯2. 波特率的產生3. 數據收發4. 中斷控制出現以下情況時,可使UART產生中斷:FIFO溢出錯誤線中止

5、錯誤(line-break ,即Rx信號一直為0的狀態,包括校驗位和停止位在內)奇偶校驗錯誤幀錯誤(停止位不為1)接收超時(接收 FIFO已有數據但未滿,而后續數據長時間不來) 發送 接收由于所有中斷事件在發送到中斷控制器之前會一起進行“或運算”操作,所以任意時刻UART只能向中斷產生一個中斷請求。通過查詢中斷狀態函數UART In tStatus(),軟件可以在同一個中斷服務函數里處理多個中斷事件(多個并列的if語句)。5回環操作6串行紅外協議UART初始化函數如下Void UART_I nit(void)int i;if(g_uart_sel)/判斷是否為串口 1/ I/O 口設置(GPH

6、5,GPH4)rGPHUP = rGPHUP | (0x03<<4);rGPHCON = (rGPHCON & (0x00000F00) | (OxOOOOOAOO);/串口模式設置rUFCON1 =0x00;/禁止FIFO功能rUMCON1 :=0x00;/ AFC(流控制)禁能rULCON1 =:0x03; /禁止IRDA,無奇偶校驗,1位停止位,8位數據位rUCON1 :=0x245;/使用PCLK來生成波特率,發送中斷為電平觸發模式,接收中斷為邊沿觸發模式,/禁止接收超時中斷,使能接收錯誤中斷,正常工作模式, 中斷或查詢方式(非DMA)/串口波特率設置rUBRDIV

7、1=(i nt)(PCLK/16.0/UART_BPS + 0.5) -1;else/ I/O 口設置(GPH3,GPH2)rGPHUP = rGPHUP | (0x03<<2);rGPHCON = (rGPHCON & (0x000000F0) | (OxOOOOOOAO);/串口模式設置rUFCON0 =:0x00;/禁止FIFO功能rUMCON0 :=0x00;/ AFC(流控制)禁能rULCON0 =:0x03; /禁止IRDA,無奇偶校驗,1位停止位,8位數據位rUCON0 =0x245;/使用PCLK來生成波特率,發送中斷為電平觸發模式,接收中斷為邊沿觸發模式,

8、/禁止接收超時中斷,使能接收錯誤中斷,正常工作模式,中斷或查詢方式(非DMA)/串口波特率設置rUBRDIVO=(i nt)(PCLK/16.0/UART_BPS + 0.5) -1;for(i=0;i<100;i+);(三) RTCA概述實時時鐘(RTC單元在系統電源關閉的情況下可以在備用電池下工作。 RTC可 以使用STRB/LDRBARM操作傳輸二進制碼十進制數的 8位數據給CPU。數據 包括秒、分鐘、小時、日期、天、月、年的時間信息。RTC單元可以在32.768KHZ 的外部晶振下工作,可以可以執行報警功能。B特點-BCD數:秒、分鐘、小時、日期、日、月、年-閏年生成器-報警功能

9、:報警中斷或從掉電模式中喚醒-已經解決2000年問題-獨立電源引腳(RTCVDD-支持對于實時內核時間節拍的毫秒節拍時間中斷C實時時鐘操作C.1閏年發生器閏年發生器可以基于 BCDDATE BCDMON BCDYEAR的數據,從28、29、30、31中確定每個月的最后一天。該模塊在確定某月最后一天的時候會考慮閏 年的因素。一個8位的計數器僅能代表兩個 BCD數字,所以它不能確定是否 是00年(該年的最后兩個數字是00)。C.2讀寫寄存器為了寫RTC模塊中的BCD寄存器,RTCCOh寄存器的位0必須置1。為了顯 示秒分小時星期日月年,CPU應該分別讀取在 RTC模塊中的BCDSEC BCDMIN

10、, BCDHOUR BCDDAY BCDDATE BCDMON 和 BCDYEAR但是,因為多寄存器讀 取可能存在一秒的誤差。例如,當用戶讀BCDYEAR口 BCDMON,結構假定是2059年12月31日23點59分。當用戶讀BCDSE寄存器,值的范圍是從1到59 (秒)就沒有問題,但是如果值是0,年月日就變成了 2060年1月1日0時 0分因為有剛才提到的1秒誤差。在這種情況下如果 BCDSEC為0,用戶應該 重讀 BCDYEA到 BCDSECC.3備用電池操作RTC邏輯可以由備用電池驅動,其通過RCTVDD引腳給RTC模塊提供電源, 即使系統電源關閉。當系統關閉時,CPU和RTC模塊的接口

11、是封閉的,備用電 池僅驅動振蕩電路和BCD計數器以最小化電源消耗。C.4報警功能RTC在掉電模式或正常操作模式下的特定時間會發出報警信號。在正常操作 模式下報警中斷(INT_RTC被激活。在掉電模式下,電源管理喚醒信號(PMWKUP 也如INT_RTC一樣被激活。RTC報警寄存器(RTCALM決定了報警的使能狀態 和報警時間設定的條。C. 5節拍時間中斷RTC節拍時間是用于中斷請求。TICNT寄存器有一個中斷使能位和對于中斷 的計數器值當節拍時間中斷出現時,計數器的值為0。中斷周期如下:Period =(n+1 ) / 128 seco ndn:節拍計數器值 (1127)RTC節拍時間可以用于

12、實時操作 系統內核時間節拍。如果時間節拍由 RTC時間節拍生成,與實時操作系統功能 相關的時間就會和實時同步。D. R TC寄存器(1)實時時鐘控制寄存器(RTCCON(2)節拍時間計數寄存器(TICNT(3)RTC報警控制寄存器(RTCALM(4)報警秒數據寄存器(ALMSEC(5)報警分鐘數據寄存器(ALMMIN)(6)報警小時數據寄存器(ALMHOUR(7)報警日期數據寄存器(ALMDATE(8)報警月數據寄存器(ALMMON)(9)報警年數據寄存器(ALMYEAR(10)BCD 秒寄存器(BCDSEC(11)BCD 分寄存器(BCDMIN(12)BCD小時寄存器(BCDHOUR(13)

13、 BCD日期寄存器(BCDDATE(14) BCD 日寄存器(BCDDAY(15) BCD 月寄存器(BCDMON(16) BCD 年寄存器(BCDYEAR(四) 步進機與直流電機工作原理步進電機是一種將電脈沖轉化為角位移的執行機構。步進電機正傳,雙四拍 程序。 時序控制為AB-BC-CD-DA-AJB共控制運轉4圈(電機步距角為18度)。 每一步的延時控制。值越大,延時越久;步進電機反轉,雙四拍程序時序控制為 AD-DC-CB-BA-AD步距角為18度)。每一步的延時控制。值越大,延時越久。正轉模式:dly為延時void MOTO_Mode1(ui nt32 dly)/ AB相有效GPIOS

14、ET(MOTOA);GPIOSET(MOTOB);Delay(dly);GPIOCLR(MOTOA);GPIOCLR(MOTOB);/ BC相有效GPIOSET(MOTOB);GPIOSET(MOTOC);Delay(dly);GPIOCLR(MOTOB); GPIOCLR(MOTOC);/ CD相有效GPIOSET(MOTOC);GPIOSET(MOTOD);Delay(dly);GPIOCLR(MOTOC);GPIOCLR(MOTOD);/ DA相有效GPIOSET(MOTOD);GPIOSET(MOTOA);Delay(dly);GPIOCLR(MOTOD);GPIOCLR(MOTOA)

15、;直流電機由PWM脈沖調制控制;脈沖為1是電機轉動,0時停止轉動。通 過PWM占空比來實現加減速。參考程序:void StepMOTO_Test(void)/ uin t32 a = 0;/步進電機控制口設置rGPCCON = (rGPCCON & (0x0000FC03) | (0x0000540助; GPC0、 GPC5-7 口設置為輸出rGPCUP = rGPCUP | 0x00E1;/ 禁止GPC0 GPC5-7口的上拉電阻rGPCDAT= rGPCDAT& (0x00E1);/ 設置GPC0 GPC5-7口輸出低電平while(1)UART_SendStr("

16、;Pleaseinput 'z' OR f to control zhengzhuan and fan zhua nn ”);UART_SendStr("Press 'o' key exit testn");switch(getch = UART_GetKey()case 'z':spri ntf("Press 'j' to speed up ; 'ESC' break out.");for(;)Chan ge_Speed();MOTO_Mode1(speed1);/控制步進

17、電機正轉/在終端上顯示速度(330-speed1);spri ntf(disp_buf2, "Zhe ngzhua n: StepMoto_speed is %d n",UART_Se ndStr(disp_buf2);if(UART_GetFlag() = 'j') speedup(); 加速if(UART_GetFlag() = 0x1B)/ 按 Esc鍵退出測試break;break;case 'f:spri ntf("Press 'j' to speed up ; 'ESC' break out.&q

18、uot;);for(;)Chan ge_Speed();MOTO_Mode2(speed1); /控制步進電機反轉/在終端上顯示速度spri ntf(disp_buf2, "Fa nzhua n: StepMoto_speed is %d n".-(330-speed1);if(UART_GetFlag() = 'j')UART_Se ndStr("j"); speedup(); 加速if(UART_GetFlag() = Ox1B) / 按 Esc鍵退出測試 break;break;default: break;if(getch = &

19、#39;o')/按下字母'o'鍵退出整個步進電機測試break;直流電機測試程序:void DCMOTO_Test(void)ui nt32 i = 0, a = 0;uin t16 pwm_dac;char get_ch = 0;/ TOUT0 口設置rGPBCON = (rGPBCON & (0x03<<0) | (0x02<<0);/ rGPBCON1:0=10b,設置 TOUT0功能rGPBUP = rGPBUP | 0x0001;/ 禁止TOUT 0 口的上拉電阻/設置GPH9為GPIO輸出模式rGPHCON = (rGPHCO

20、N & (0x03<<18) | (0x01<<18); / GPH9 口 rGPHDAT = rGPHDAT & (1<<9);/ 輸出 0 電平rGPHUP = rGPHUP | (1<<9);/初始化PWM輸出。設PWM周期控制值為255pwm_dac = 250*255330;/ 初始化占空比PWM_Init(255, pwm_dac);while(1)/按'z'鍵控制正傳,f鍵控制反轉,s'鍵停止轉動'Esc退出測試 UART_SendStr("nPressthe key to

21、control state: 'z'-zhengzhuan'f-fa nzhua n's'-stopn");switch(get_ch =UART_GetKey()case 'z':rGPBDAT = rGPHDAT | (1<<9);rGPHDAT = rGPHDAT & (1<<9);while(1)Chan ge_Speed();rTCMPB0 = (speed2*25/330);spri ntf(disp_buf3, "DCMoto_speed is %d n", sp

22、eed2); 終端顯示正轉速度if(UART_GetFlag() = 's')rGPBDAT = rGPHDAT & (1<<9);rGPHDAT = rGPHDAT & (1<<9); break;break;case 'f:rGPBDAT = rGPHDAT & (1<<9);rGPHDAT = rGPHDAT | (1<<9);while(1)Chan ge_Speed();rTCMPBO = (speed2*25/330);spri ntf(disp_buf3, "DCMoto_s

23、peed is %d n", (-speed2); /終端顯示正轉速度UART_Se ndStr(disp_buf3);if(UART_GetFlag() = 's')rGPBDAT = rGPHDAT & (1<<9);rGPHDAT = rGPHDAT & (1<<9);break; break;default : break;if(UART_GetFlag() = Ox1B) break;(五) IIC通信實現EEPROM的讀寫(一) I2C , 一種總線結構。I2C串行總線一般有兩根信號線,一根是雙向 的數據線SDA,另

24、一根是時鐘線SCL。所有接到I2C總線設備上的串行數據SDA 都接到總線的SDA上,各設備的時鐘線SCL接到總線的SCL上。實驗過程中必須先初始化總線一啟動總線后才能用其進行通信。int I2C_Se ndByte(ui nt8 dat) /發送一字節數據,并接收應答位int l2C_RcvByteNA(uint8 *dat)接收I2C總線上一字節數據并發送非應答 位int l2C_RcvByteA(uint8 *dat) 接上I2C總線上一字節數據,并發送應答位 void Stopl2C(ui nt8 sen d)/ 結束總線int ISe ndStr(ui nt8 sla, uin t8

25、*suba, uin t8 *s, uint8 no)【* Descriptions:使用硬件I2C發送數據。* In put: sla從機地址*suba器件子地址(第一字節用來表示子地址字節個數)*s發送數據緩沖區*no發送數據個數* Output:操作成功返回TRUE仲載失敗/無從機應答返回FALSE* Note:使用前設置好參數。程序不會更改 s、suba緩沖區的數據】int IRcvStr(ui nt8 sla,ui nt8 *suba,ui nt8 *s,ui nt8 no)v使用硬件I2C讀取數據。參數和發送對應(二)測試 EEPROM程序 void TestEEPROM(void

26、)uint8 suba2;int rw_err;int i;rw_err = 0;/寫數據測試suba0 = 1;/ 1 位子地址suba1 = 0x00;/ 子地址for(i=0; i<10; i+)dat_bufi = i+'O'UART_Se ndStr("data of write:");for(i = 0; i < 5; i+)UART_Se ndByte(dat_bufi);UART_Se ndStr("n");i2c_opsta=ISe ndStr(CAT1025, suba, dat_buf, 5); for(

27、i=0; i<10000; i+);/ 等待寫周期/讀出校驗for(i=0; i<5; i+) dat_bufi = 0x00;i2c_opsta=IRcvStr(CAT1025, suba, dat_buf, 5);UART_Se ndStr("data of read:");for(i = 0; i < 5; i+)UART_Se ndByte(dat_bufi);UART_Se ndStr("n");for(i=0; i<5; i+)if(dat_bufi != (i+'0') rw_err = 1;/判斷操

28、作是否出錯,如果出錯則蜂鳴報警 if(rw_err) ErrorShow();【如果寫入的數據和讀出的相同,貝U測試通過】四、實驗程序【main函數:主要實現與終端交互的功能,通過鍵盤輸入字符的判斷來決定執 行的功能】int mai n(void)uint8 g_getch ;int i = 0;UART_Select(0); / 選擇 UART0UART_Init();/UART0 初始化LEDnit();/LED相關初始化EINT_init();/外部中斷初始化while(1)fun_test();switch(g_getch = UART_GetKey()case '1'

29、:UART_Se ndByte(g_getch);UART_Se ndStr("n");LED_DispAIIOn(); /LED 燈全亮DelayNS(IO);UART_Se ndStr("nTest LED_DispAll On is Over!n");break;case 2:UART_Se ndByte(g_getch);UART_Se ndStr("n");LED_DispAIIOff(); /LED 燈全滅DelayNS(10);UART_Se ndStr("nTest LED_DispAllOff is Over!n");break;case 3:UART_Se ndByte(g_getch);UART_Se ndStr("n");for(;)/死循環,當檢測到按下 Esc鍵時退LED_onebyone();/ 流水燈if(UART_GetFlag() = Ox1B) / 檢測是否按下Esc鍵 break;LED_DispAIIOff();UART_Se ndStr("nTest LED_O nebyO ne is

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論