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管脚名称复用信号
6GPIO_04ADC1
17GPIO_05ADC2
19GPIO_07ADC3
27GPIO_09ADC4
29GPIO_11ADC5
30GPIO_12ADC0
31GPIO_13ADC6

二、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 日

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

以上是关于HI3861学习笔记(14)——ADC接口使用的主要内容,如果未能解决你的问题,请参考以下文章

HI3861学习笔记(12)——GPIO输入接口使用

HI3861学习笔记(19)——WiFi接口使用(STA和AP模式)

HI3861学习笔记(13)——PWM接口使用

HI3861学习笔记(15)——I2C接口使用

HI3861学习笔记——CMSIS-RTOS2接口

HI3861学习笔记(18)——UART串口使用