今天着手对 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