習慣購買元器件多買一個,方便替換驗證。
因為做過一次驗證之後,這個板子就沒有用瞭,所以購買 DIP-28 寬體底座,讓底座焊板子上,芯片插底座上,方便芯片的二次使用,節約成本。
STM32 要想驅動 ADC0809 這個芯片需要很多個引腳(不考慮復用的話,需要 16 個引腳),如果這些引腳都用杜邦線連接的話會很亂,如果哪個杜邦線再接觸不好,那麼對於程序的調試很不方便,所以我就采用核心板+底板的形式來實現,避免使用過多的杜邦線。
現在打樣很便宜,線很多,時間來得及的話,推薦使用線路板的方式來驗證。
我這次網友問答超時瞭,買件+PCB 打樣+調試程序,一共用瞭 9 天時間,如果不需要打樣的實例,一周之內應該可以完成的。
ADC0809 是采樣精度為 8 位的、以逐次逼近原理進行模—數轉換的器件。其內部有一個 8 通道多路開關,它可以根據地址碼鎖存譯碼後的信號,隻選通 8 路模擬輸入信號中的一個進行 A/D 轉換。
534ed5dd91754c0cca0798b6328b3c62
1)8 通道輸入,擁有一個 8 位的 A/D 轉換器,即分辨率 8 位;
2)具有轉換起停控制端;
3)轉換時間為 100μs(時鐘為 640KHz 時),130μs(時鐘為 500KHz 時);
4)單個+5V 電源供電;
5)模擬輸入電壓范圍 0~+5V,不需零點和滿刻度校準;
6)工作溫度范圍為 -40~+85 攝氏度;
7)低功耗,約 15mW。
c2ea0ddb7c1b5b2d0e4f616ab6ae2a74
管腳功能說明:
IN0-IN7:模擬量輸入通道,共計 8 個通道;
ADD A-C:通道選擇引腳,通過這三根地址線的不同組合選擇 IN0 - IN7 中的一個作為模擬量的輸入通道;
ALE:地址鎖存允許信號;
START:啟動 A/D 轉換信號;
D0-D7:數據輸出口,ADC 轉換後的結果通過這 8 個引腳並行輸出;
OE(OUTPUT ENABLE):輸出允許信號,此引腳為輸入端,高電平有效。當 A/D 轉換結束時,此端輸入一個高電平,才能打開輸出三態門,輸出數字量;
CLOCK:時鐘信號,輸入脈沖。ADC0809 內部沒有時鐘電路,需由外部提供時鐘脈沖信號。時鐘頻率范圍為 10KHz-1280KHz,典型值 640KHz;
EOC:轉換結束狀態信號。輸出信號,EOC=0,標識正在進行轉換。EOC=1,標識轉換結束,可以進行下一步輸出操作;即當 A/D 轉換結束時,此端輸出一個高電平(轉換期間一直為低電平);
Vref(+)、Vref(-):參考電壓(基準電壓)。參考電壓用來與輸入的模擬量進行比較,作為測量的基準。一般 Vref(+)=+5V ,Vref(-)=0V;
VCC:電源引腳,單電源 +5V;
GND:地 。
61e938281f9cc17ee71612d9192c537d
3年嵌入式物聯網學習資源整理分享:C語言、Linux開發、數據結構;軟件開發,STM32單片機、ARM硬件開發、物聯網通信開發、綜合項目開發教程資料;筆試面試真題。點擊下方插件免費領取↓↓↓
數據手冊中的典型應用圖:
ADC0809 引腳 | STM32 引腳 | GPIO 方向 |
---|---|---|
START | PA2 | 輸出 |
EOC | PA3 | 輸入 |
OE | PA4 | 輸出 |
CLOCK | PA7 | 輸出 |
ALE | PA6 | 輸出 |
ADD A | PA5 | 輸出 |
ADD B | PB10 | 輸出 |
ADD C | PB11 | 輸出 |
ADC0809_D0 | PA11 | 輸入 |
ADC0809_D1 | PA12 | 輸入 |
ADC0809_D2 | PC10 | 輸入 |
ADC0809_D3 | PC11 | 輸入 |
ADC0809_D4 | PC12 | 輸入 |
ADC0809_D5 | PD2 | 輸入 |
ADC0809_D6 | PB13 | 輸入 |
ADC0809_D7 | PB12 | 輸入 |
註意:ADC0809_D0 為輸出數據的最低位,ADC0809_D7 為輸出數據的最高位。
(1)控制與 ADDA~ADDC 相連的引腳,選擇一個模擬輸入端;
(2)CLOCK 端輸入一個時鐘信號,本文通過 STM32 的 PWM 實現此脈沖,脈沖頻率 100 KHz;
(3)將 ALE 由低電平置為高電平,從而將 ADDA-ADDC 送進的通道代碼鎖存,經譯碼後被選中的通道的模擬量送給內部轉換單元;
(4)給 START 一個正脈沖。當上升沿時,所有內部寄存器清零。下降沿時,開始進行 A/D 轉換;在轉換期間,START 保持低電平;
(5)讀取 EOC 引腳的狀態,A/D 轉換期間,EOC 輸入低電平;A/D 轉換結束,EOC 引腳輸入高電平;
(6)當 A/D 轉換結束後,將 OE 設置為 1,這時 D0-D7 的數據便可以讀取瞭。
float get_adc0809()
{
int i=0;
u8 sum=0;
float adc=0;
int AD_DATA[8] = {0};
ADC0809_ALE=0;
ADC0809_START=0;
delay_us(10);
ADC0809_ALE=1;
ADC0809_START=1;
delay_us(10);
ADC0809_ALE=0;
ADC0809_START=0; // 啟動 AD 轉換
while(0==ADC0809_EOC); // 等待轉換結束
ADC0809_OE=1;
AD_DATA[0]=ADC0809_D0*1 ;
AD_DATA[1]=ADC0809_D1*2 ;
AD_DATA[2]=ADC0809_D2*4 ;
AD_DATA[3]=ADC0809_D3*8 ;
AD_DATA[4]=ADC0809_D4*16 ;
AD_DATA[5]=ADC0809_D5*32 ;
AD_DATA[6]=ADC0809_D6*64 ;
AD_DATA[7]=ADC0809_D7*128 ;
ADC0809_OE=0;
for(i=0; i<8; i++)
{
sum += AD_DATA[i];
}
adc = (float)sum*5/256;
printf("sum=%d ad=%0.2f Vrn",sum,adc);
return adc;
}
上一篇
下一篇