北航機電控制工程基礎-單片機實驗報告_第1頁
北航機電控制工程基礎-單片機實驗報告_第2頁
北航機電控制工程基礎-單片機實驗報告_第3頁
北航機電控制工程基礎-單片機實驗報告_第4頁
北航機電控制工程基礎-單片機實驗報告_第5頁
已閱讀5頁,還剩14頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、 機電控制工程技術作業三: 單片機實驗報告姓 名: 班 級: 130717目錄一、實驗目的1二、實驗任務1三、實驗設備1四、實驗思路及過程14.1實驗箱中基本的器件及其控制方式:14.2程序流程圖34.3代碼編寫3五、程序調試4六、感想4七、附錄5一、 實驗目的1. 學習使用單片機編程軟件ICCV7 for AVR以及燒寫軟件progisp2. 了解并使用ATmega8單片機及其外圍電路二、 實驗任務通過電位計控制電機轉速,按鍵控制轉向與工作方式,并在數碼管上穩定的顯示當前工作頻率,用LED燈顯示電機工作方式,當電機頻率過低時電機自動關閉。三、 實驗設備1. 機電控制工程實驗教學平臺實驗箱2.

2、 PC一臺四、 實驗思路及過程4.1 實驗箱中基本的器件及其控制方式:實驗箱中單片機開發板如下圖:圖表 1 單片機開發板硬件圖解4.1.1 硬件介紹該實驗中用到了,ATmega8的最小系統(晶振(11.059MHZ),濾波電路,復位電路,ISP下載,電源),以及外圍器件(4位數碼管及其驅動芯片ZLG7289,4個LED燈,2個中斷按鈕,1個旋轉電位計,以及24BYJ48A 型步進電機和L298芯片)4.1.2 外圍器件的工作原理簡介 4位數碼管由ZLG7289芯片驅動,采用的驅動方式為動態顯示,ATmega8通過PD57管腳與ZLG7289之間進行數據傳送。 4個LED燈與PC03管腳相連,當

3、管腳輸出低電平時,LED點亮。 2個中斷開關與PD2、PD3相連,其中斷方式可以為電平觸發和沿觸發 旋轉電位計輸出電壓為05V,與ADC7相連,通過ATmega8中ADC模塊可以得到10位精度的電壓數字量值。 24BYJ48A 型步進電機為4相直流步進電機,其工作電壓為12V,由L298芯片控制,L298芯片與ATmega8通過PA14相連。該步進電機的通電方式為由自己控制。4.2 程序流程圖圖表 Error! Main Document Only. 程序流程圖4.3 代碼編寫利用ICCV7 for AVR軟件編寫單片機程序新建一個project,在project中新建一個c程序。利用Appl

4、ication Builder按鈕輔助建立C程序。 CPU設置:選擇M8,晶振選11.059MHZ,選擇INT0和INT1,選擇下降沿中斷; 端口設置:port B 14,port C03,portD57改為輸出(O),值默認為零 時間計數器:選擇Time0,計數溢出中斷 ADC模塊設置:啟用ADC模塊,ADC模塊使能,選用開始轉換和連續轉換以及ADC 轉換結束中斷使能,10位精度,右對齊 最后在設置中添加主函數即Include”main”() 將其他控制代碼添入程序,完整程序見附錄程序控制的基本思路為,由AD7采集電位計電量并進行模數轉換后得到一個temp值,該temp值由對應的函數公式轉換

5、為定時計數器初值TCNT0,即改變定時長短,然后在定時計數溢出中斷程序中,執行電機換相指令,即可以完成由電位器控制電機轉速任務;電機正反轉控制由外部中斷INT1改變標志變量,進而電機換相方向即可;電機工作方式由外部中斷INT0控制,由LED顯示工作方式,相應函數跟在電機轉動函數之后。電機的運動與否,由temp值來確定。數碼管顯示由頭文件中對應程序完成。五、 程序調試本實驗調試過程中出現很多問題,主要問題第一是if 函數中判斷條件經常用成=,而非= =,之后就是電機轉速跟不上頻率變化,兩者關系應為線性關系,而根據分配原理,兩者為雙曲線關系,為了進行簡化,對首末兩端取值后進行了映射關系轉化。調試工

6、作很多小錯誤,但也相應一一克服。六、 感想本次是第一次動手使用單片機,發現并沒有那么難,其中相應功能能夠基本實現,也相應的進行調試,但由于時間與精力所限,并沒有進行高質量的設計,只是實現基本功能稍微進行改進,這次也正好是理論知識的實際應用,強化了課上的學習內容,提高了我們的學習興趣。七、 附錄/ICC-AVR application builder : 2016/5/28 10:04:25/ Target : M8/ Crystal: 11.059Mhz/ICC-AVR application builder : 2016/5/5 19:32:56/ Target : M8/ Crystal:

7、 11.059Mhz#include <iom8v.h>#include <macros.h>#include "g7289.h"#include <math.h>#define A() PORTB = 0B00000010;#define B() PORTB = 0B00001000;#define C() PORTB = 0B00000100;#define D() PORTB = 0B00010000;#define AB() PORTB = 0B00001010;#define BC() PORTB = 0B00001100;#d

8、efine CD() PORTB = 0B00010100; #define DA() PORTB = 0B00010010;int step = 0;int dir_flag = 0;int temp = 1023;int pre_temp = 1023;int change_adc_flag = 0;int on_off = 0;int judge = 1;int f=50;void port_init(void) PORTB = 0x00; DDRB = 0x1E; PORTC = 0x00; /m103 output only DDRC = 0x0F; PORTD = 0x00; DD

9、RD = 0xE0;/TIMER0 initialize - prescale:1024/ desired value: 233Hz/ actual value: 234.778Hz (0.8%)void timer0_init(void) TCCR0 = 0x00; /stop TCNT0 = 0xD2; /t count TCCR0 = 0x05; /start timer#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVFvoid timer0_ovf_isr(void) TCNT0 = (int)(double)(40+0.1896*

10、temp); if(temp<10) on_off=0; if(temp>10) on_off=1; if(on_off = 1)if(judge=1) if(dir_flag = 1) if(step = 0) A() else if(step = 1) AB() else if(step = 2) B() else if(step = 3) BC() else if(step = 4) C() else if(step = 5) CD() else if(step = 6) D() else if(step = 7) DA() else if(dir_flag = 0) if(

11、step = 0) DA() else if(step = 1) D() else if(step = 2) CD() else if(step = 3) C() else if(step = 4) BC() else if(step = 5) B() else if(step = 6) AB() else if(step = 7) A() step+; PORTC = 0x0E; if( step = 8) step = 0;else if(judge=2) if(dir_flag = 1) if(step = 0) A() else if(step = 1) B() else if(ste

12、p = 2) C() else if(step = 3) D()else if(step = 4) A() else if(step = 5) B() else if(step = 6) C() else if(step = 7) D() else if(dir_flag = 0) if(step = 0) D() else if(step = 1) C() else if(step = 2) B() else if(step = 3) A()else if(step = 4) D() else if(step = 5) C() else if(step = 6) B() else if(st

13、ep = 7) A() step+; PORTC = 0x0D; if( step = 8) step = 0;else if(judge=3) if(dir_flag = 1) if(step = 0) AB() else if(step = 1) BC() else if(step = 2) CD() else if(step = 3) DA()else if(step = 4) AB() else if(step = 5) BC() else if(step = 6) CD() else if(step = 7) DA() else if(dir_flag = 0) if(step =

14、0) DA() else if(step = 1) CD() else if(step = 2) BC() else if(step = 3) AB()else if(step = 4) DA() else if(step = 5) CD() else if(step = 6) BC() else if(step = 7) AB() step+; PORTC = 0x0B; if( step = 8) step = 0; /reload counter value/ADC initialize/ Conversion time: 150uSvoid adc_init(void) ADCSR =

15、 0x00; /disable adc ADMUX = 0x07; /lect adc input 0 ACSR = 0x80; ADCSR = 0xEF;#pragma interrupt_handler adc_isr:iv_ADCvoid adc_isr(void) /conversion complete, read value (int) using. temp=ADCL; /Read 8 low bits first (important) temp|=(int)ADCH << 8; if(on_off = 0) G7289_SendByte(0xa4); Show_n

16、um(8888); if(on_off = 1) if(abs(temp - pre_temp) > 4) change_adc_flag = 1; pre_temp = temp; else temp = pre_temp; if(change_adc_flag = 1) G7289_SendByte(0xa4); Show_num(int)(double)temp*450/1023+50); change_adc_flag = 0; /read 2 high bits and shift into top byte#pragma interrupt_handler int0_isr:iv_INT0void int0_isr(void) /external interupt on INT0 judge+; if (judge = 4)judge=1; #pragma interrupt_handler int1_isr:iv_INT1void int1_isr(void) /external interupt on INT1 dir_flag=!dir_flag;/call this routine to initialize all peripheralsvoid init_devices(void) /stop er

溫馨提示

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

評論

0/150

提交評論