您的位置:網站首頁 > 電器維修資料網 > 正文 >
AVR單片機入門----C語言高效設計實踐(七)
來源: 日期:2013-11-1 14:21:40 人氣:標簽:
由于模擬開關的輸入端同porta口相連復用,當一個應用系統不需要或者只需要少數的模/數轉換器時,這個端口的其他引腳可以當作普通的1/0口使用。但是要注意,盡量不要在用到/vd轉換器時,再將porta口作為普通i/o口使用,因為這會影響到a/d的轉換精度。
模/數轉換器可將輸入的模擬電壓信號轉換成一個10位的數字量信號。它以某一個參考電壓為基準(如內部標準參考電壓2.56v或者外部輸入電壓源),將指定引腳上的輸入電壓量轉換為數字信號量,寫入到avr處理器的adc寄存器中。輸入模擬電壓的范圍介于agnd和avcc之間,atmeag16l的模,數轉換器的精度 高為10位,當參考電壓為5v時, 小的分辨電壓是5v/2'o一0.o05v。另外,atmeag16l內部帶有前置放大器,放大倍數為10倍和200倍,我們可將微弱的輸入信號進行適當放大后再進行模/數轉換。
模/數轉換器相關寄存器
atmeag16l與模/數轉換相關的寄存器主要有admux、adcsra、adch和adclo1.admux admux負責控制模/數轉換輸入通道的選擇以及參考電壓源的選取。
mux4—muxo;控制選擇a/d輸入通道、放大倍數選取及差模輸入方式選取。
adlar:adch和adcl輸出格式控制位,當該位置1時,輸出結果左對齊;當該位置0時,輸出結果右對齊。
refs1、refso:為控制參考電壓的選擇。下表為refs1、refso的設置及對應的參考電壓。
2.adcsra adcsra為adc控制和狀態寄存器。
adps2—adpso:adc預分頻選擇,這3位決定adc分頻器的值,如下表所示。
adie;adc中斷使能。adie為“1”,則adc轉換結束中斷即被使能;否則,中斷禁止。
adif:.adc中斷標志。adc轉換完成,并且數據更新后,adc中斷標志(adif)置“1”。此時若adc的中斷使能位(adie)和全局中斷使能位(sreg)都為“1”,則單片機產生一個adc完成中斷。當單片機執行相應的中斷后,adif被清“o”。adif也可通過寫入“0”來清除。
adate:adc自動觸發使能。adate置位將啟動adc自動觸發功能。觸發信號的上跳沿啟動adc轉換。
觸發信號源通過sfior寄存器的adc觸發信號源選擇位adts設置。
adsc:模數轉換啟動。當adc工作于單次轉換模式時,該位必須寫入“1”才能啟動每次轉換過程;adc工作于自由轉換模式時,adsc也必須在第一次轉換時寫入“1”。注意:adc在上電后,必須首先進行一次初始化轉換,這個轉換值無效。
aden:模數轉換使能。aden為“1”時,單片機的模數轉換使能;否則禁止。
3.adch和adcladch和adcl兩個寄存器用于存儲adc的轉換結果。
為了確保數據讀取的正確性,adcl寄存器的內容應當首先被讀取,一旦用戶開始對adcl讀取,adc對數據寄存器的寫操作就被禁止,這就意味著,如果用戶讀取了adcl,那么即便另一次adc轉換過程在讀adch之前結束了,兩個數據寄存器中的內容也不會被更新。當用戶對adch的讀操作完成后,adc才可以更新adch和adcl。
模/數轉換器的使用atmeag16l單片機的adc模塊由adcsra寄存器中的aden位使能。當aden為“1”時,adc功能有效,并且輸入通道同模擬電壓的輸入引腳相連。此時,若adsc置“1”,則adc啟動一次模數轉換過程,這個模數轉換過程用于初始化adc(轉換結果無效)。
當adc模塊被啟動以后,用戶可以通過adate位選擇adc的兩種轉換模式,即單次轉換模式和自由轉換模式。若adate為“0”時,則adc工作在單次轉換模式,此時,每個轉換過程都需要置位adsc,若adate為“1”時,則adc工作在自由轉換模式,此時,adc連續采樣模擬輸入端并將轉換得到的數據輸出至adc的數據寄存器adch和adcl中。當一次轉換過程結束后,adif位被置“1”,此時,若adie和全局中斷使能位(sreg)都為“1”,則單片機產生一個adc中斷。
atmeag16l的模/數轉換器編程實踐1.簡易數字式o~5v直流電壓表實驗用電位器rv1作模擬量的輸入,右邊4位數碼管顯示輸入電壓值。我們使用pa端口的第7位進行模擬量輸入,而pa端口的第o—6位作數碼管的段驅動,這樣,顯示的數字中小數點不能被點亮。因此,“千”位數碼管相當于顯示整數,而“個”、“十”、“百”位數碼管相當于顯示小數,例如:
顯示3265相當于3.265v電壓。
在我的文檔中新建一個ac12的文件夾。建立一個ac12.prj的工程項目, 后建立源程序文件ac12.c。輸入程序1:
編譯通過后,將ac12.hex文件下載到avr單片機綜合試驗板上。注意,標示“ledmod_com”、“ad”的雙排針應插上短路塊,另外標示“ledmod_disp”
的雙排針的上面7位也應插上短路塊( 下面1位不要2.“窗口”電壓識別與控制實驗在自動化控制中,有些設備需要在一定的條件下工作。超出此條件后,可以控制設備停機,也可以發出報警信號。現在我們使用atmega16l單片機的adc模塊實現輸入模擬量的監控,輸入電壓小于2.ooov時燈d1點亮報警,輸入電壓大干插短路塊)。我們用一枝小螺絲刀(或電筆)調節電位器rv1,改變輸入的模擬電壓,我們可看到數碼管的顯示從0000~5000(相當于o.000—5.ooov)會變化。
3.ooov時燈d2點亮報警,輸入電壓在2,000—3.ooov之間時報警燈不亮。
在我的文檔中新建~個ac13的文件夾。建立一個ac13.prj的工程項目, 后建立源程序文件ac13.c。輸入程序2:
編譯通過后,將ac13.hex文件下載到avr單片機綜合試驗板上。注意,標示“ledmod_com”、“ad”的雙排針應插上短路塊,另外標示“ledmod_disp”
的雙排針的上面7位也應插上短路塊( 下面1位不要插短路塊)。我們用一枝小螺絲刀(或電筆)調節電位器rv1,改變輸入的模擬電壓,我們看到數碼管顯示小于2000時,燈dl點亮;數碼管顯示大干3000時,燈d2點亮:數碼管顯示在2000—3000之間時,燈不亮。達到實驗的目的。
【看看這篇文章在百度的收錄情況】