今天著手對W806開發板ADC功能做測試,都知道ADC在物聯網應用場景中常需要用到的一個重要技術。W806手冊說這款芯片支持片內ADC,介紹是這樣的:
片內集成 4 路 16 比特 ADC,最高采樣率 1KHz。ADC基於Sigma-Delta ADC 的采集模塊,完成最多 4 路模擬信號的采集,采樣率通過外部輸入時鐘控制,可采集輸入電壓,也可采集芯片溫度,支持輸入校準和溫度補償校準。
其管腳定義如下:
管腳 IO口名稱 功能 上下拉能力
19 PA_1 ADC_1 UP/DOWN
20 PA_2 ADC_4 UP/DOWN
21 PA_3 ADC_3 UP/DOWN
22 PA_4 ADC_2 UP/DOWN
電路設計參考如下:
芯片 19~21 腳可以作為普通 ADC 使用,輸入電壓範圍 0~2.4V。當高於 2.4V 時外部需做分壓處理後才 可進入 ADC 接口。為提高精度,R1 和 R2 需使用高精度電阻。根據 Sensor 輸出電壓值選擇合適的 R1,R2 電阻值分壓。如圖 3-3 所示。
圖 1 ADC 分壓電路設計參考
這在很多MCU裡還是少見的,不禁心生喜歡,馬上動手來測試一下,看看芯片集成的ADC功能性能如何。
從項目工程DEMO目錄下,找到adc目錄,在Sky-CDK的項目視圖裡加入該工程,工程代碼如下:
void Error_Handler(void);
static void ADC_Init(void);
ADC_HandleTypeDef hadc;
int main(void)
{
int value;
SystemClock_Config(CPU_CLK_160M);
printf("enter mainrn");
ADC_Init();
while (1) {
value = HAL_ADC_GET_INPUT_VOLTAGE(&hadc);
//hadc.offset=-1;
printf("value = %dmv\r\n", value);
HAL_Delay(500);
}
}
static void ADC_Init(void){
hadc.Instance = ADC;
hadc.Init.channel = ADC_CHANNEL_0;
hadc.Init.freq = 1000;
if (HAL_ADC_Init(&hadc) != HAL_OK) {
Error_Handler();
}
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){
}
void Error_Handler(void){
while (1)
{}
}
void assert_failed(uint8_t *file, uint32_t line)
{
printf("Wrong parameters value: file %s on line %drn", file, line);
}
代碼總體非常簡單明了。設置完芯片主屏後,直接初始化ADC,然後進入循環,讀取ADC的輸出數值,其中ADC的各函數句柄結構如下:
typedef struct __ADC_HandleTypeDef{
ADC_TypeDef *Instance;
ADC_InitTypeDef Init;
HAL_LockTypeDef Lock;
int offset;
}ADC_HandleTypeDef;
編譯後,燒寫fls文件到開發板裡。然後板上連接如下圖的連線,第一次將PA1直接接入地,此時ADC1輸入電壓應該為0.
圖 2 ADC 測試接線圖一
從串口收到實際的數據,如下:
圖 3 ADC 測試PA1直接接地時輸出的數值
可見數據基本上穩定在 -64mv,其中有個別數據出現偏差,不是因為ADC穩定性的問題,而是因為硬件接線,是把導線直接插而不是焊接在開發板的接口孔裡,接觸不穩定造成。
這裡吐槽一下,既然提供開發板為何不附帶送一下排針,排針不焊接可以理解,但是沒有排針導致無法插入杜邦線使用,手邊又沒有排針,還不得不另外網購排針去。而購買排針的郵費又可以購買一塊W806開發板了,暈!。
這個偏差測試幾次後,它的讀數基本是固定的值,那麼就可以把它看成是初始的偏差,在後面的測量種進行修正即可,即測量的值減去這哥偏差。期間在幾塊W806都測試一下初始偏差值,發現不同的板子並不一樣,初始偏差分別 -60mv ~ +50mv左右。
在測試完對地的初始偏差後,可以測量目標電壓,這裡拿一節新的5號電池做測試,電池正極接PA1,負極接板上的GND。此時可以從串口得到如下的數據:
圖 4 ADC 測試PA1接5號電池時輸出的數值
測試該電池直接讀數為: 1576mv,根據前面的修正方法,減去初始偏差 -64mv.得到被測電壓為:1576-(-64)=1640mv.
為做對比,使用三位半精度數字萬用表電壓檔測試該5號電池,讀數為1609mv。則可以算出,以此萬用表為基準的誤差率:
(1640-1609)/1609 x100% = 1.9%
圖 5 使用萬用表測量5號電池的數值
總結,本次簡單的測試,初步的測試W806的ADC的電壓測量效果,比較精確。因為沒有精密調壓電壓,沒有對個點的電壓測量。但其它網友對其線性度進行過測量,並繪制了擬合線,從測量誤差標準方差分析,其誤差小於<5%。同時本次測試也沒有對溫漂進行測試,以及高頻采樣下的ADC的精度情況。但從一般的消費領域的應用場景來看,已經可以滿足需求。
————————————————
版權聲明:本文為CSDN博主「lutherluov」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/lutherluov/article/details/121463746