AVR單片機(jī)步進(jìn)電機(jī)實(shí)驗(yàn)_第1頁
AVR單片機(jī)步進(jìn)電機(jī)實(shí)驗(yàn)_第2頁
AVR單片機(jī)步進(jìn)電機(jī)實(shí)驗(yàn)_第3頁
AVR單片機(jī)步進(jìn)電機(jī)實(shí)驗(yàn)_第4頁
AVR單片機(jī)步進(jìn)電機(jī)實(shí)驗(yàn)_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 機(jī)電控制工程技術(shù)作 業(yè)AVR單片機(jī)步進(jìn)電機(jī)實(shí)驗(yàn)姓名班級(jí)目錄 TOC o 1-3 h z u 一、實(shí)驗(yàn)?zāi)康?PAGEREF _Toc388138515 h 1二、實(shí)驗(yàn)任務(wù) PAGEREF _Toc388138516 h 1三、實(shí)驗(yàn)設(shè)備 PAGEREF _Toc388138517 h 1四、實(shí)驗(yàn)思路及過程 PAGEREF _Toc388138518 h 14.1實(shí)驗(yàn)箱中基本的器件及其控制方式: PAGEREF _Toc388138519 h 14.2程序流程圖 PAGEREF _Toc388138520 h 24.3代碼編寫 PAGEREF _Toc388138521 h 3五、程序調(diào)試 PAG

2、EREF _Toc388138522 h 5六、感想 PAGEREF _Toc388138523 h 7七、項(xiàng)目分工 PAGEREF _Toc388138524 h 7八、附錄 PAGEREF _Toc388138525 h 7實(shí)驗(yàn)?zāi)康膶W(xué)習(xí)使用單片機(jī)編程軟件ICCV7 for AVR以及燒寫軟件progisp了解并使用ATmega8單片機(jī)及其外圍電路實(shí)驗(yàn)任務(wù)通過電位計(jì)控制電機(jī)轉(zhuǎn)速,按鍵控制轉(zhuǎn)向,并在數(shù)碼管上穩(wěn)定的顯示當(dāng)前轉(zhuǎn)速 實(shí)驗(yàn)設(shè)備機(jī)電控制工程實(shí)驗(yàn)教學(xué)平臺(tái)實(shí)驗(yàn)箱PC一臺(tái)實(shí)驗(yàn)思路及過程實(shí)驗(yàn)箱中基本的器件及其控制方式:實(shí)驗(yàn)箱中單片機(jī)開發(fā)板如下圖:圖表 SEQ 圖表 * ARABIC 1 單片機(jī)開

3、發(fā)板硬件圖解硬件介紹該實(shí)驗(yàn)中用到了,ATmega8的最小系統(tǒng)(晶振(11.059MHZ),濾波電路,復(fù)位電路,ISP下載,電源),以及外圍器件(4位數(shù)碼管及其驅(qū)動(dòng)芯片ZLG7289,4個(gè)LED燈,2個(gè)中斷按鈕,1個(gè)旋轉(zhuǎn)電位計(jì),以及24BYJ48A 型步進(jìn)電機(jī)和L298芯片)外圍器件的工作原理簡介4位數(shù)碼管由ZLG7289芯片驅(qū)動(dòng),采用的驅(qū)動(dòng)方式為動(dòng)態(tài)顯示,ATmega8通過PD57管腳與ZLG7289之間進(jìn)行數(shù)據(jù)傳送。4個(gè)LED燈與PC03管腳相連,當(dāng)管腳輸出低電平時(shí),LED點(diǎn)亮。2個(gè)中斷開關(guān)與PD2、PD3相連,其中斷方式可以為電平觸發(fā)和沿觸發(fā)旋轉(zhuǎn)電位計(jì)輸出電壓為05V,與ADC7相連,通過

4、ATmega8中ADC模塊可以得到10位精度的電壓數(shù)字量值。24BYJ48A 型步進(jìn)電機(jī)為4相直流步進(jìn)電機(jī),其工作電壓為12V,由L298芯片控制,L298芯片與ATmega8通過PA14相連。該步進(jìn)電機(jī)的通電方式為四相單雙八拍。其步距角=5.625/64其轉(zhuǎn)速計(jì)算公式為n=605.625/64f360r/min程序流程圖圖表 SEQ 圖表 * ARABIC 2 程序流程圖否是初始化IO初始化定時(shí)器開中斷采集AD計(jì)算電機(jī)頻率f顯示f計(jì)算定時(shí)器初值T1溢出中斷T1重裝載初值是否正轉(zhuǎn)正轉(zhuǎn)脈沖反轉(zhuǎn)脈沖外部中斷0外部中斷1改變方向標(biāo)志改變方向標(biāo)志開始代碼編寫利用ICCV7 for AVR軟件編寫單片機(jī)

5、程序新建一個(gè)project,在project中新建一個(gè)c程序。利用Application Builder按鈕輔助建立C程序。CPU設(shè)置:選擇M8,晶振選11.059MHZ,選擇INT0和INT1,選擇下降沿中斷;端口設(shè)置:port B 14,port C03,portD57改為輸出(O),值默認(rèn)為零時(shí)間計(jì)數(shù)器:選擇Time1,計(jì)數(shù)溢出中斷,初始計(jì)時(shí)時(shí)間選擇50HZADC模塊設(shè)置:啟用ADC模塊,ADC模塊使能,選用開始轉(zhuǎn)換和連續(xù)轉(zhuǎn)換以及ADC 轉(zhuǎn)換結(jié)束中斷使能,10位精度,右對齊最后在設(shè)置中添加主函數(shù)即Include”main”()將其他控制代碼添入程序,完整程序見附錄程序控制的基本思路為,由

6、AD7采集電位計(jì)電量并進(jìn)行模數(shù)轉(zhuǎn)換后得到value,該value由對應(yīng)的函數(shù)公式轉(zhuǎn)換為定時(shí)計(jì)數(shù)器初值TCNT1H和TCNT1L,即改變定時(shí)長短,然后在定時(shí)計(jì)數(shù)溢出中斷程序中,執(zhí)行電機(jī)換相指令,即可以完成由電位器控制電機(jī)轉(zhuǎn)速任務(wù);電機(jī)正反轉(zhuǎn)控制由外部中斷INT0和INT1改變標(biāo)志變量,進(jìn)而電機(jī)換相方向即可;數(shù)碼管顯示由頭文件中對應(yīng)程序完成。程序調(diào)試在基礎(chǔ)實(shí)驗(yàn)第一次運(yùn)行時(shí),不管怎么調(diào)電位計(jì),電機(jī)的運(yùn)行頻率有變化,但是電機(jī)怎么都不轉(zhuǎn)。后來查程序發(fā)現(xiàn):當(dāng)變量count1求得高八位并賦值給TCNT1H后,電機(jī)不轉(zhuǎn),當(dāng)直接給TCNT1H賦值為0 xFF時(shí),電機(jī)轉(zhuǎn)動(dòng)。在調(diào)試擴(kuò)展實(shí)驗(yàn)的時(shí)候,發(fā)現(xiàn)不管怎么調(diào)節(jié)電

7、位計(jì),數(shù)碼管所顯示的始終為0000,仔細(xì)檢查發(fā)現(xiàn)了問題所在:計(jì)算角度的關(guān)系中,由于360/2048這兩個(gè)數(shù)均為整型,相除后得零,應(yīng)該改為0.087890625*2,。改后,單片機(jī)運(yùn)行出現(xiàn)問題。當(dāng)旋轉(zhuǎn)電位計(jì)到一定值后,按下按鍵電機(jī)方向反向,數(shù)碼管顯示的角度一直減小到負(fù)值,同時(shí)在正向轉(zhuǎn)動(dòng)時(shí),電位計(jì)旋轉(zhuǎn)到最大值的時(shí)候,數(shù)碼管也不顯示360。這種現(xiàn)象有時(shí)候出現(xiàn),有時(shí)候則正常,我們反復(fù)檢查程序也沒發(fā)現(xiàn)錯(cuò)誤。經(jīng)過思考,我們發(fā)現(xiàn),如果當(dāng)電機(jī)沒有轉(zhuǎn)到電位計(jì)AD值所對應(yīng)的角度時(shí),按下反向鍵就會(huì)產(chǎn)生這樣的問題。因此在操作過程中,我們要避免電機(jī)還沒停止的時(shí)候按下反向按鍵。之后程序一切正常。感想程序中容易出現(xiàn)一些不起

8、眼的小錯(cuò)誤,比如漏掉分號(hào),或者變量的類型不匹配導(dǎo)致賦值不成功;兩個(gè)int變量相除時(shí)應(yīng)該先轉(zhuǎn)換為float型或者直接賦值;還有電機(jī)運(yùn)行頻率有一定范圍,太小電機(jī)就不轉(zhuǎn)了。程序最終調(diào)試成功,還是有一定成就感的,雖然程序在我們的獨(dú)立思考和助教的幫助下,并沒有那么難,但是畢竟是第一次接觸單片機(jī),能夠調(diào)試成功還是付出了一番努力的。因?yàn)閱纹瑱C(jī)對工科生很重要,我想,我在以后的工作和學(xué)習(xí)中還會(huì)再接觸到它,我應(yīng)該再接再勵(lì),在以后有機(jī)會(huì)的時(shí)候更加深入研究它,也讓自己的能力有進(jìn)一步的提高項(xiàng)目分工賀英杰:配置,基礎(chǔ)實(shí)驗(yàn)電位計(jì)控制轉(zhuǎn)速,擴(kuò)展實(shí)驗(yàn)電位計(jì)控制轉(zhuǎn)角崔家浩:基礎(chǔ)實(shí)驗(yàn)數(shù)碼管顯示轉(zhuǎn)速,擴(kuò)展實(shí)驗(yàn)數(shù)碼管顯示角度孫汶慧:基

9、礎(chǔ)作業(yè)四相八拍,擴(kuò)展作業(yè)四相雙四拍陳柯宇:LED燈顯示速度快慢熊宇飛:基礎(chǔ)實(shí)驗(yàn)正反轉(zhuǎn),擴(kuò)展實(shí)驗(yàn)正反轉(zhuǎn)附錄基礎(chǔ)實(shí)驗(yàn)/ICC-AVR application builder : 2014/5/11 23:58:19/ Target : M8/ Crystal: 11.059Mhz#include #include #include g7289.h#include delay.h#define A() (PORTB = 0B00000010) #define B() (PORTB = 0B00001000) #define C() (PORTB = 0B00000100) #define D() (

10、PORTB = 0B00010000) #define AB() (PORTB = 0B00001010) #define BC() (PORTB = 0B00001100) #define CD() (PORTB = 0B00010100) #define DA() (PORTB = 0B00010010)int step=0;int dir_flag=1;int speed=0;int num=0;float sum=0;float f=0;int temp;int value;char count1=0,count2=0;char count=0;void port_init(void)

11、 PORTB = 0 x00; DDRB = 0 x1E; PORTC = 0 x00; /m103 output only DDRC = 0 x0F; PORTD = 0 x00; DDRD = 0 xE0;/TIMER1 initialize - prescale:1024/ WGM: 0) Normal, TOP=0 xFFFF/ desired value: 50Hz/ actual value: 50.232Hz (0.5%)void timer1_init(void) TCCR1B = 0 x00; /stop TCNT1H = 0 xFF; /setup TCNT1L = 0 x

12、29; OCR1AH = 0 x00; OCR1AL = 0 xD7; OCR1BH = 0 x00; OCR1BL = 0 xD7; ICR1H = 0 x00; ICR1L = 0 xD7; TCCR1A = 0 x00; TCCR1B = 0 x05; /start Timer#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVFvoid timer1_ovf_isr(void) /TIMER1 has overflowed TCNT1H = 0 xFF; /reload counter high value TCNT1L = count

13、2; /reload counter low value if(dir_flag = 1) /正轉(zhuǎn) 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) /反轉(zhuǎn) if(step = 0) A(); else if(step = 1) DA();

14、 else if(step = 2) D(); else if(step = 3) CD(); else if(step = 4) C(); else if(step = 5) BC(); else if(step = 6) B(); else if(step = 7) AB(); step+; if(step = 8) step = 0;/ADC initialize/ Conversion time: 150uSvoid adc_init(void) ADCSR = 0 x00; /disable adc ADMUX = 0 x07; /select adc input 0 ACSR =

15、0 x80; ADCSR = 0 xEF;#pragma interrupt_handler adc_isr:iv_ADCvoid adc_isr(void) value=ADCL; value|=(int)ADCH 800)/旋轉(zhuǎn)電位計(jì)輸出大小對應(yīng)LED燈亮滅個(gè)數(shù)PORTC=0 xf0;else if(value600)PORTC=0 x01;else if(value400)PORTC=0 x03;else if(value200)PORTC=0 x07;elsePORTC=0 xff;/conversion complete, read value (int) using. / valu

16、e=ADCL; /Read 8 low bits first (important) / value|=(int)ADCH 8; /read 2 high bits and shift into top byte#pragma interrupt_handler int0_isr:iv_INT0void int0_isr(void) dir_flag=0;/external interupt on INT0#pragma interrupt_handler int1_isr:iv_INT1void int1_isr(void) dir_flag=1;/external interupt on

17、INT1/call this routine to initialize all peripheralsvoid init_devices(void) /stop errant interrupts until set up CLI(); /disable all interrupts port_init(); timer1_init(); adc_init(); MCUCR = 0 x0A; GICR = 0 xC0; TIMSK = 0 x04; /timer interrupt sources SEI(); /re-enable interrupts /all peripherals a

18、re now initialized/void main(void) init_devices(); while(1) temp=value; if(num10) sum+=temp; num+; else num=0; sum=sum/10; f=50.0+(450.0/1023.0)*sum; /count=255-10799.8/f; /count1=(int)(65535-10799.8/f)/256; count2=(int)(65535-10799.8/f)%256; sum=0; speed=100*60*f/(2*4*8*64); /速度放大100倍 G7289_SendByt

19、e(0 xa4); Show_num(speed); delay(300); /insert your functional code here.擴(kuò)展實(shí)驗(yàn)(16組)/ICC-AVR application builder : 2014/5/13 9:39:19/ Target : M8/ Crystal: 11.059Mhz#include #include #include g7289.h#include delay.h#define A() (PORTB = 0B00000010) #define B() (PORTB = 0B00001000) #define C() (PORTB =

20、0B00000100) #define D() (PORTB = 0B00010000) #define AB() (PORTB = 0B00001010) #define BC() (PORTB = 0B00001100) #define CD() (PORTB = 0B00010100) #define DA() (PORTB = 0B00010010)int step=0;int n=0;int dir_flag=1;int angle=0;/int num=0;/float sum=0;/float f=0;/int temp;int value;int count1=0;int co

21、unt2=2046;void port_init(void) PORTB = 0 x00; DDRB = 0 x1E; PORTC = 0 x00; /m103 output only DDRC = 0 x0F; PORTD = 0 x00; DDRD = 0 xE0;/TIMER1 initialize - prescale:1024/ WGM: 0) Normal, TOP=0 xFFFF/ desired value: 50Hz/ actual value: 50.232Hz (0.5%)void timer1_init(void) TCCR1B = 0 x00; /stop TCNT1

22、H = 0 xFF; /setup TCNT1L = 0 x29; OCR1AH = 0 x00; OCR1AL = 0 xD7; OCR1BH = 0 x00; OCR1BL = 0 xD7; ICR1H = 0 x00; ICR1L = 0 xD7; TCCR1A = 0 x00; TCCR1B = 0 x05; /start Timer#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVFvoid timer1_ovf_isr(void) /TIMER1 has overflowed TCNT1H = 0 xFF; /reload cou

23、nter high value TCNT1L = 0 x35; /reload counter low value if(dir_flag = 1) /正轉(zhuǎn) if(step = 0) AB(); else if(step = 1) BC(); else if(step = 2) CD(); else if(step = 3) DA(); if (count12*value) PORTB = 0B00000000; else count1+; n+; else if(dir_flag = 0) /反轉(zhuǎn) if(step = 0) AB(); else if(step = 1) DA(); else

24、 if(step = 2) CD(); else if(step = 3) BC(); if (count22*value) PORTB = 0B00000000; else count2-; n-; step+; if(step = 4) step = 0;/ADC initialize/ Conversion time: 150uSvoid adc_init(void) ADCSR = 0 x00; /disable adc ADMUX = 0 x07; /select adc input 0 ACSR = 0 x80; ADCSR = 0 xEF;#pragma interrupt_ha

25、ndler adc_isr:iv_ADCvoid adc_isr(void) value=ADCL; value|=(int)ADCH 800)PORTC=0 xf0;else if(value600)PORTC=0 x01;else if(value400)PORTC=0 x03;else if(value200)PORTC=0 x07;elsePORTC=0 xff; /conversion complete, read value (int) using. / value=ADCL; /Read 8 low bits first (important) / value|=(int)ADCH 8; /read 2 high bits and shift into top byte#pragma interrupt_handler int0_isr:iv_INT0void int0_isr(void) dir_flag=0; co

溫馨提示

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

評(píng)論

0/150

提交評(píng)論