|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
奇怪問題--Atmega8L的AD轉(zhuǎn)換誤差 |
| 作者:sanxingyu 欄目:單片機(jī) |
參考電壓源是采用外部VREF管腳的電壓,轉(zhuǎn)換周期26uS。當(dāng)所檢測的電壓為0時(shí),AD轉(zhuǎn)換結(jié)果居然在31和30即0x1f和0x1e之間跳動, 當(dāng)檢測的電壓為1V時(shí)這個(gè)偏差大概為25,2V左右時(shí),偏差大概為20。百思不得其解,AVR的AD轉(zhuǎn)換不應(yīng)該會存在如此之大的偏差呀,我用ATMEGA16L也試過了,也是存在同樣的問題。郁悶呀,這個(gè)問題花了我?guī)滋斓臅r(shí)間都還沒解決,請各位大俠不吝賜教呀~~~~~~~~~~~ 以下是我的程序 void adc_init(void) { ADCSR = 0x00; //disable adc ADMUX = 0x00; //SELECT adc input 0 ACSR = 0x80; ADCSR = 0xA3; } unsigned int ReadADC( unsigned CHAR channel) { unsigned int i = 0 ; channel &= 0x0f ; CLI(); ADMUX &= 0XF8 ; ADMUX |= channel; ADCSR |= 0x40; while (!(ADCSR & 0x10)); ADCSR |= 0x10; i = ADCL; i += (unsigned int)ADCH << 8; SEI(); return i; } |
| 2樓: | >>參與討論 |
| 作者: zhiwei 于 2007/1/4 17:19:00 發(fā)布:
26uS,速度太快了吧。 你的ADC時(shí)鐘是500K?超出最大時(shí)鐘限制了。推薦應(yīng)該是50-200K。 |
|
| 3樓: | >>參與討論 |
| 作者: coldra 于 2007/1/4 17:28:00 發(fā)布:
AVR單片機(jī)AD有誤差 但不會太大,只要參考源穩(wěn)定,模擬和數(shù)字電路布線處理好,相互不干擾問題不大,我通常用中斷模式,看一下樓主程序 void adc_init(void) { ADCSR = 0x00; //disable adc-這個(gè)寄存名應(yīng)該是ADCSRA,你能編譯通過?可能你我編譯器不一樣 ADMUX = 0x00; //SELECT adc input 0 ACSR = 0x80; ADCSR = 0xA3;//使能,連續(xù)轉(zhuǎn)換,8分頻,其實(shí)看下面你應(yīng)該用單次轉(zhuǎn)換模式 } unsigned int ReadADC( unsigned CHAR channel) { unsigned int i = 0 ; channel &= 0x0f ; CLI(); ADMUX &= 0XF8 ; //清通道位設(shè)置 ADMUX |= channel; //改為所需通道 其實(shí)可以先讀通道,如果不一致再改通道,通常改后的通道第一次轉(zhuǎn)換可能誤差較大。 ADCSR |= 0x40; //ADCSRA |= 0x40 ,開始轉(zhuǎn)換 while (!(ADCSR & 0x10)); //等待轉(zhuǎn)換結(jié)束 ADCSR |= 0x10; //硬件清零,可以刪掉該句 i = ADCL; // i += (unsigned int)ADCH << 8; //這兩句可以合寫成i=ADC; SEI(); return i; } |
|
| 4樓: | >>參與討論 |
| 作者: sanxingyu 于 2007/1/4 17:50:00 發(fā)布:
太感謝各位大蝦的熱心指導(dǎo)了! 太感謝各位大蝦的熱心指導(dǎo)了!我用的編譯器是ICCAVR。 語句ADCSR = 0xA3;是我自己寫的時(shí)候搞錯(cuò)了,實(shí)際上我是用ADCSR = 0x83; 但也存在同樣的問題。 有可能是coldra所說的 “ ADMUX |= channel; //改為所需通道 其實(shí)可以先讀通道,如果不一致再改通道,通常改后的通道第一次轉(zhuǎn)換可能誤差較大。 ” |
|
| 5樓: | >>參與討論 |
| 作者: dadodo 于 2007/1/5 13:20:00 發(fā)布:
改變通道后的第一次采樣值應(yīng)拋棄不用 只要給ADMUX賦值,哪怕ADMUX的值沒變,第一次采樣的結(jié)果也會有很大誤差 |
|
| 6樓: | >>參與討論 |
| 作者: qjy_dali 于 2007/1/5 21:52:00 發(fā)布:
不得不說:AVR的AD是不怎么樣 |
|
| 7樓: | >>參與討論 |
| 作者: gtw 于 2007/1/6 12:51:00 發(fā)布:
只能說是你的問題 如果像你所說,ATMEL連一個(gè)下三爛的IC廠都不如了 市場也不會接受啊。 還是自身找原因吧。 |
|
| 8樓: | >>參與討論 |
| 作者: lz13 于 2007/1/8 22:45:00 發(fā)布:
蠻好用 我現(xiàn)在用48,挺好用的,用內(nèi)部基準(zhǔn),10位過采,做到12位,采用值,一動不動,并且準(zhǔn),應(yīng)該AD的輸入口,最好顯式設(shè)置為輸入口.然后,在48里,還應(yīng)該將它將數(shù)字口完全脫開. |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |