ADC 功能使用與測試

發布於 2022-04-18 19:11:40

今天著手對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的項目視圖裡加入該工程,工程代碼如下:

include <stdio.h>

include "wm_hal.h"

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

0 條評論

發布
問題