HI3861学习笔记(14)——ADC接口使用

一、简介

1.1 ADC

ADC(Analog-to-Digital Converter),即模拟-数字转换器,可以将连续变化的模拟信号转换为离散的数字信号,进而使用数字电路进行处理,称之为数字信号处理。

1.2 GPIO复用功能

HI3861V100 芯片有 15 个 GPIO,引脚分布如下:
HI3861学习笔记(14)——ADC接口使用_第1张图片
HI3861学习笔记(14)——ADC接口使用_第2张图片
其中 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。
HI3861学习笔记(14)——ADC接口使用_第3张图片

#include 
#include 
#include 
#include 

#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读取电压
HI3861学习笔记(14)——ADC接口使用_第4张图片


• 由 Leung 写于 2021 年 10 月 9 日

• 参考:【鸿蒙2.0设备开发教程】小熊派HarmonyOS 鸿蒙·季 开发教程

你可能感兴趣的:(HI3861,HI3861,ADC,HarmonyOS)