1、概述
ADC即模拟数字转换器(英语:Analog-to-digital converter)是用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。与之相对的设备成为数字模拟转换器(DAC)。
典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。然而,有一些模拟数字转换器并非纯的电子设备,例如旋转编码器,也可以被视为模拟数字转换器。
本文将向开发者介绍如何使用ADC。HaaS EDU K1 的ADC有3路,分别是GPADC0,GPADC1,GPADC2。
引脚 |
引脚编号 |
说明 |
GPADC0 |
M4 |
ADC输入引脚0
扫描二维码关注公众号,回复:
12808147 查看本文章
|
GPADC1 |
F5 |
ADC输入引脚1 |
GPADC2 |
G6 |
ADC输入引脚2 |
其中两路已经分配,一路(ADC0)用于测量模拟麦克风音量,一路(ADC1)用于检测电池电压,一路(ADC2)外接备用。
HaaS EDU K1自带的三路ADC 均为7通道 10bit。精度为1/1024。
2、HAL层接口介绍
AliOS Things对于不同底层驱动的ADC操作实现,统一封装成本文所述hal adc接口。 hal相关头文件位于目录:include/aos/hal。
hal相关实现位于具体的mcu目录下,如:platform/mcu/haas1000/hal/。
2.1、API列表
hal_adc_init |
初始化指定ADC |
hal_adc_value_get |
获取ADC采样值 |
hal_adc_finalize |
关闭指定ADC |
2.2、API详情
2.2.1、相关结数据结构
adc_dev_t
typedef struct {
uint8_t port; /* adc port */
adc_config_t config; /* adc config */
void *priv; /* priv data */
} adc_dev_t;
adc_config_t
typedef struct {
uint32_t sampling_cycle; /* sampling period in number of ADC clock cycles */
} adc_config_t;
2.2.2、hal_adc_init
初始化指定ADC
函数原型
int hal_adc_init(adc_dev_t *adc);
参数
adc_dev_t *adc |
入参 |
ADC设备描述 |
用户自定义一个adc_dev_t结构体 |
返回值
返回成功或失败, 返回0表示ADC初始化成功,非0表示失败
调用示例
#define ADC1_PORT_NUM 1
/* define dev */
adc_dev_t adc1;
/* adc port set */
adc1.port = ADC1_PORT_NUM;
/* set sampling_cycle */
adc1.config.sampling_cycle = 100;
/* init adc1 with the given settings */
ret = hal_adc_init(&adc1);
2.2.3、hal_adc_value_get
获取ADC采样值
函数原型
int hal_adc_value_get(adc_dev_t *adc, void *output, unsigned int timeout);
参数
adc_dev_t *adc |
入参 |
ADC设备描述 |
使用hal_adc_init时传入adc_dev_t结构体 |
void *output |
出参 |
数据缓冲区 |
int value; 传入&value |
unsigned int timeout |
入参 |
超时时间,单位tick |
HAL_WAIT_FOREVER |
返回值
返回成功或失败, 返回0表示ADC时间获取成功,非0表示失败
调用示例
int value = 0;
adc_dev_t adc1;
ret = hal_adc_value_get(&adc1, &value, HAL_WAIT_FOREVER);
2.2.4、hal_adc_finalize
关闭指定ADC
函数原型
int32_t hal_adc_finalize(adc_dev_t *adc);
参数
adc_dev_t *adc |
入参 |
ADC设备描述 |
使用hal_adc_init时传入adc_dev_t结构体 |
返回值
返回成功或失败, 返回0表示ADC去初始化成功,非0表示失败
调用示例
ret = hal_adc_finalize(&adc1);
3、示例介绍
选取ADC读取电压这来学习ADC的使用。
3.1、硬件实现
本章用到的硬件电路在开发板上默认是已经连接好的,如下:
adc部分原理图
默认的看门狗超时周期为1.6s, WDI管脚有电平转换就会重置定时器(喂狗成功,否则就会重启主MCU。
3.2、软件设计
代码位于application/example/edu_demo/mfg_test/adc_test.c
驱动初始化
初始化GADC1。
adc_dev_t adc = {1, 1000, 0x12345678};
ret = hal_adc_init(&adc);
if (ret)
{
printf("\r\n=====adc test : adc init failed===\r\n");
return -1;
}
电量读取
for (int32_t i = 0; i < 34; i++)
{
hal_adc_value_get(&adc, &output, 1000);
test_sum += output;
/* the min sampling voltage */
if (test_min >= output)
{
test_min = output;
}
/* the max sampling voltage */
if (test_max <= output)
{
test_max = output;
}
osDelay(20);
}
hal_adc_finalize(&adc);
test_avrg = (test_sum - test_min - test_max) >> 5;
printf("\r\n=====adc test : the samping volage is:%dmv===\r\n", test_avrg);
if (((test_avrg - 200) > TEST_VOLT_MV) || ((test_avrg + 200) < TEST_VOLT_MV))
{
printf("\r\n=====adc test : the samping volage is out of scope===\r\n");
printf("\r\n=====adc test : FAIL===\r\n");
return -1;
}
printf("=====adc test : Done=====\r\n");
3.3、编译与下载
3.3.1、代码准备
打开edu_demo的产测开关
application/example/edu_demo/Config.in
在该文件中修改编译选项,打开EDK_DEMO_FACTORY_TEST_ENABLIE开关。
config EDK_DEMO_FACTORY_TEST_ENABLIE
bool "enable factory test function"
default y
加入Demo到启动代码
application/example/edu_demo/app_entry.c
函数application_start中注释掉menu_init();,添加adc_test();
//menu_init();
adc_test();
3.3.2、编译
命令行方式进行编译
aos make distclean
aos make edu_demo@haaseduk1 -c config
aos make
3.3.3、烧录
- 命令行方式
aos upload
- 图形界面方式
详见HaaS EDU K1 快速开始 第4.3.3章节-使用GUI工具烧录部分。
开发者技术支持
如需更多技术支持,可加入钉钉开发者群,或者关注微信公众号
更多技术与解决方案介绍,请访问阿里云AIoT首页https://iot.aliyun.com/