2012-10-01 45 views
2

我已經開始使用AVR微控制器。我正在使用ATmega32-A微控制器。我連接了一個外部ADC(AD7798)。我想用SPI通信讀取外部ADC值。我已經嘗試了很多,但我無法獲得ADC值。我的項目是我必須使用帶有可編程波形發生器的微控制器產生波形。我成功地做到了這一點,並將此信號傳遞給傳感器。我想讀取來自ADC的傳感器輸出。下面附上簡單的電路圖。我寫了這樣的代碼查看讀取外部adc值的代碼

// I have initialized PORTB like this 

PORTB=0x00; 
DDRB=0xBF; 

// SPI initialisation 
// SPI clock rate fck/16 
// SPI master 
// SPI MSB first 
// SPI CPOL = 1, CPHA = 1 

SPCR=0x5D; 
PORTB.3 = 1; 

void main (void){ 

printf("adc value :%x\n",ReadAd()); 

} 

我在另一個文件

我已閱讀數據表幾百次,但我仍能夠讀取ADC值寫的所有功能。我很困惑我正在犯的錯誤。我檢查了每個引腳,並且使用示波器檢查了ADC輸入引腳,我得到了0.6V輸入信號。請幫我解決這個問題。 Tommarow是這個項目的最後期限。請任何人幫我閱讀ADC值。

在此先感謝

+1

+1爲質量電路圖 –

+0

這是一張白板圖的照片?如果是這樣,你用什麼工具來清理它? –

+0

@Michael Burr,不,它是手繪在紙上,PDF圖像是掃描該紙張的副本。 – verendra

回答

2

我不能確定的問題,但這裏有一些事情,我注意到,可能會有幫助:

  • 看看成什麼樣的波形發生器芯片與SDATA線做。由於它們共享相同的總線(MOSI),因此在使用ADC時需要高阻抗。確保芯片不總是驅動總線,否則你的ADC通信將無法工作。

  • 芯片選擇線上沒有上拉電阻,這可能會導致ADC在uC上電時進入異常狀態等。您可能希望啓用端口b上的內部上拉電阻和如圖4所示,利用該信息從ATmega32的數據表(第50頁):

「如果PORTxn爲一個時所述銷被構造爲輸入引腳,上拉>電阻器被激活」

  • 確保您的SPI時鐘的極性和相位與ADC的通信協議匹配,並且ADC支持硬件SPI的一次8位通信SPI您的ChipSelectAD函數有一行可能是不必要的,雖然也許我只是不知道當該位設置爲輸出時讀取引腳的目的

    「while(PINB.3);」 //等待片選引腳」

  • 是你的ADC正確連接的針?圖顯示沒有爲電源電壓或基準電壓連接。

  • 可能放慢你的SPI SCLK頻率,直到你'確保它能正常工作,雖然它看起來像ADC可以處理相當高的輸入時鐘速度。

  • 請確保您的左移,而adc讀取發生在16位值...它看起來像8 SPI讀取的位字符結果實際上被移位了8次,除非編譯器自動執行,否則將其置零y上傳類型。