HI3861学习笔记(14)——ADC接口使用
Posted Leung_ManWah
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HI3861学习笔记(14)——ADC接口使用相关的知识,希望对你有一定的参考价值。
一、简介
1.1 ADC
ADC(Analog-to-Digital Converter),即模拟-数字转换器,可以将连续变化的模拟信号转换为离散的数字信号,进而使用数字电路进行处理,称之为数字信号处理。
1.2 GPIO复用功能
HI3861V100 芯片有 15 个 GPIO,引脚分布如下:
其中 ADC 通道有 7 个,其中 GPIO 可复用成 ADC 的通道如下:
Pin | 管脚名称 | 复用信号 |
---|---|---|
6 | GPIO_04 | ADC1 |
17 | GPIO_05 | ADC2 |
19 | GPIO_07 | ADC3 |
27 | GPIO_09 | ADC4 |
29 | GPIO_11 | ADC5 |
30 | GPIO_12 | ADC0 |
31 | GPIO_13 | ADC6 |
二、API说明
以下 ADC 接口位于 base\\iot_hardware\\interfaces\\kits\\wifiiot_lite\\wifiiot_adc.h。
业务BUILD.gn中包含路径
include_dirs = [
"//utils/native/lite/include",
"//kernel/liteos_m/components/cmsis/2.0",
"//base/iot_hardware/interfaces/kits/wifiiot_lite",
]
2.1 AdcRead
功能 | 根据输入参数从指定的ADC通道读取一段采样数据 |
---|---|
函数定义 | unsigned int AdcRead(WifiIotAdcChannelIndex channel, unsigned short *data, WifiIotAdcEquModelSel equModel, WifiIotAdcCurBais curBais, unsigned short rstCnt) |
参数 | channel:表示ADC通道 data:表示指向存储读取数据的地址的指针 equModel:表示平均算法的次数 curBais:表示模拟功率控制模式 rstCnt:指示从重置到转换开始的时间计数。一次计数等于334纳秒。值的范围必须从0到0xFF |
返回 | 错误码 |
三、通过按下按键改变GPIO口的电压,并使用ADC读取GPIO
编译时在业务BUILD.gn中包含路径
include_dirs = [
"//utils/native/lite/include",
"//kernel/liteos_m/components/cmsis/2.0",
"//base/iot_hardware/interfaces/kits/wifiiot_lite",
]
使用板载用户按键F1来模拟GPIO口电压的变化。通过查看芯片手册可知GPIO_11对应的是 ADC Channel 5 ,所以需要编写软件去读取ADC Channel 5的电压,程序设计时先将GPIO_11上拉,使GPIO_11的电压一直处于高电平,当按键按下时GPIO_11接地,此时GPIO_11的电压变为 0 V。
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <math.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_gpio_ex.h"
#include "wifiiot_errno.h"
#include "wifiiot_adc.h"
#define ADC_TASK_STACK_SIZE 1024 * 8
#define ADC_TASK_PRIO 24
/***** 获取电压值函数 *****/
static float GetVoltage(void)
{
unsigned int ret;
unsigned short data;
// 该函数通过使用AdcRead()函数来读取 ADC_CHANNEL_5 的数值存储在data中,
// WIFI_IOT_ADC_EQU_MODEL_8 表示8次平均算法模式,
// WIFI_IOT_ADC_CUR_BAIS_DEFAULT 表示默认的自动识别模式,
// 最后通过 data * 1.8 * 4 / 4096.0 计算出实际的电压值。
ret = AdcRead(WIFI_IOT_ADC_CHANNEL_5, &data, WIFI_IOT_ADC_EQU_MODEL_8, WIFI_IOT_ADC_CUR_BAIS_DEFAULT, 0xff);
if (ret != WIFI_IOT_SUCCESS)
{
printf("ADC Read Fail\\n");
}
return (float)data * 1.8 * 4 / 4096.0;
}
static void ADCTask(void)
{
float voltage;
//上拉,让按键未按下时GPIO_11保持高电平状态
iosetPull(WIFI_IOT_IO_NAME_GPIO_11, WIFI_IOT_IO_PULL_UP);
while (1)
{
printf("=======================================\\r\\n");
printf("***************ADC_example*************\\r\\n");
printf("=======================================\\r\\n");
//获取电压值
voltage = GetVoltage();
printf("vlt:%.3fV\\n", voltage);
//延时1s
usleep(1000000);
}
}
static void ADCExampleEntry(void)
{
osThreadAttr_t attr;
attr.name = "ADCTask";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = ADC_TASK_STACK_SIZE;
attr.priority = ADC_TASK_PRIO;
if (osThreadNew((osThreadFunc_t)ADCTask, NULL, &attr) == NULL)
{
printf("[ADCExample] Falied to create ADCTask!\\n");
}
}
APP_FEATURE_INIT(ADCExampleEntry);
打印按键按下和松开时,ADC读取电压
• 由 Leung 写于 2021 年 10 月 9 日
以上是关于HI3861学习笔记(14)——ADC接口使用的主要内容,如果未能解决你的问题,请参考以下文章