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 条评论

发布
问题