基于小凌派RK2206开发板:OpenHarmony如何使用IoT接口控制ADC外设 原创

福州市凌睿智捷电子有限公司
发布于 2025-4-10 16:28
浏览
1收藏

1、案例简介

本案例主要讲解如何在小凌派-RK2206开发板上使用IoT库的ADC接口,进行ADC编程开发。

例程内容为创建一个任务,读取按键的ADC值,并打印到串口。

例程源代码:https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts/tree/master/vendor/lockzhiner/rk2206/samples/b17_iot_adc

2、基础知识

ADC在日常设备中非常常见,以下我们将演示IoT库的ADC接口如何进行读取按键的ADC值,并打印到串口。

2.1、头文件

base/iot_hardware/peripheral/interfaces/kits/iot_adc.h
  • 1.

2.2、初始化ADC设备:IoTAdcInit

unsigned int IoTAdcInit(unsigned int id);
  • 1.

描述:

初始化ADC设备。

参数:

参数 类型 描述
id unsigned int ADC通道

ADC通道有7个,对应以下7个引脚:

id GPIO
0 GPIO0_PC0
1 GPIO0_PC1
2 GPIO0_PC2
3 GPIO0_PC3
4 GPIO0_PC4
5 GPIO0_PC5
6 GPIO0_PC6
7 GPIO0_PC7

返回值:

返回值 描述
IOT_SUCCESS 成功
IOT_FAILURE 失败

实现:

hal_iot_adc.c文件在device/rockchip/rk2206/adapter/hals/iot_hardware/wifiiot_lite目录下。

unsigned int IoTAdcInit(unsigned int id) {

  unsigned int ret = 0;
  uint32_t *pGrfSocCon29 = (uint32_t *)(0x41050000U + 0x274U);
  uint32_t ulValue;

  if (id < 0 || id > 7) {
    PRINT_ERR("id(%d) > 7 or id(%d) < 0\n", id, id);
    return IOT_FAILURE;
  }

  m_adcKey.ctrl1.gpio = GPIO0_PC0 + id;

  ret = DevIoInit(m_adcKey);
  if (ret != LZ_HARDWARE_SUCCESS) {
    PRINT_ERR("%s, %s, %d: ADC Key IO Init fail\n", __FILE__, __func__,
              __LINE__);
    return IOT_FAILURE;
  }

  /* LzSaradcInit 接口只要初始化一次 */
  if(!init_adc_cnt) { 
    ret = LzSaradcInit();
    if (ret != LZ_HARDWARE_SUCCESS) {
      PRINT_ERR("%s, %s, %d: ADC Init fail\n", __FILE__, __func__, __LINE__);
      return IOT_FAILURE;
    }
  }

  /* 记录调用该接口次数 */
  init_adc_cnt++;

  /* 设置saradc的电压信号,选择AVDD */
  ulValue = *pGrfSocCon29;
  ulValue &= ~(0x1 << 4);
  ulValue |= ((0x1 << 4) << 16);
  *pGrfSocCon29 = ulValue;

  return IOT_SUCCESS;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.

2.3、取消初始化ADC设备:IoTAdcDeinit

unsigned int IoTAdcDeinit(unsigned int id);
  • 1.

描述:

取消初始化ADC设备。

参数 类型 描述
id unsigned int ADC通道

ADC通道有7个,对应以下7个引脚:

id GPIO
0 GPIO0_PC0
1 GPIO0_PC1
2 GPIO0_PC2
3 GPIO0_PC3
4 GPIO0_PC4
5 GPIO0_PC5
6 GPIO0_PC6
7 GPIO0_PC7

返回值:

返回值 描述
IOT_SUCCESS 成功
IOT_FAILURE 失败

实现:

hal_iot_adc.c文件在device/rockchip/rk2206/adapter/hals/iot_hardware/wifiiot_lite目录下。

unsigned int IoTAdcDeinit(unsigned int id) {

  unsigned int ret = 0;

  if (id < 0 || id > 7) {
    PRINT_ERR("id(%d) > 7 or id(%d) < 0\n", id, id);
    return IOT_FAILURE;
  }

  m_adcKey.ctrl1.gpio = GPIO0_PC0 + id;

  LzGpioDeinit(m_adcKey.ctrl1.gpio);
  init_adc_cnt--;

  /* 当 init_adc_cnt 为 0 调用 LzSaradcDeinit 注销  */
  if(!init_adc_cnt) {
    ret = LzSaradcDeinit();
    if (ret != LZ_HARDWARE_SUCCESS) {
      PRINT_ERR("%s, %s, %d: ADC Deinit Fail\n", __FILE__, __func__, __LINE__);
      return IOT_FAILURE;
    }
  }

  return IOT_SUCCESS;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.

2.4、获取ADC设备的值:IoTAdcGetVal

unsigned int IoTAdcGetVal(unsigned int id, unsigned int *val);
  • 1.

描述:

获取ADC设备的值。

参数:

参数 类型 描述
id unsigned int ADC通道
val unsigned int * 数据指针

ADC通道有7个,对应以下7个引脚:

id GPIO
0 GPIO0_PC0
1 GPIO0_PC1
2 GPIO0_PC2
3 GPIO0_PC3
4 GPIO0_PC4
5 GPIO0_PC5
6 GPIO0_PC6
7 GPIO0_PC7

返回值:

返回值 描述
IOT_SUCCESS 成功
IOT_FAILURE 失败

实现:

hal_iot_adc.c文件在device/rockchip/rk2206/adapter/hals/iot_hardware/wifiiot_lite目录下。

unsigned int IoTAdcGetVal(unsigned int id, unsigned int *val) {

  unsigned int ret = 0;

  if (id < 0 || id > 7) {
    PRINT_ERR("id(%d) > 7 or id(%d) < 0\n", id, id);
    return IOT_FAILURE;
  }

  ret = LzSaradcReadValue(id, val);

  if (ret != LZ_HARDWARE_SUCCESS) {
    PRINT_ERR("%s, %s, %d: ADC Read Fail\n", __FILE__, __func__, __LINE__);
    return IOT_FAILURE;
  }

  return IOT_SUCCESS;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

3、程序设计

主要代码分析

adc_example函数中,创建一个任务。

void adc_example()
{
    unsigned int thread_id;
    TSK_INIT_PARAM_S task = {0};
    unsigned int ret      = LOS_OK;

    task.pfnTaskEntry = (TSK_ENTRY_FUNC)adc_thread;
    task.uwStackSize  = 2048;
    task.pcName       = "adc_thread";
    task.usTaskPrio   = 24;
    ret               = LOS_TaskCreate(&thread_id, &task);
    if (ret != LOS_OK) {
        printf("Falied to create adc_thread ret:0x%x\n", ret);
        return;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

adc_thread任务中调用IOT库的ADC接口控制ADC。

void adc_thread()
{
    unsigned int data = 0;
    float voltage     = 0;
    unsigned int ret  = 0;

    /* 初始化adc设备 */
    ret = IoTAdcInit(ADC_CHANNEL);
    if (ret == IOT_FAILURE) {
        printf("%s, %s, %d: ADC Key IO Init fail\n", __FILE__, __func__, __LINE__);
    }

    while (1) {
        printf("***************Adc Example*************\r\n");
        /*获取电压值*/
        ret = IoTAdcGetVal(ADC_CHANNEL, &data);
        if (ret == IOT_FAILURE) {
            printf("%s, %s, %d: ADC Read Fail\n", __FILE__, __func__, __LINE__);
            return 0.0;
        }
        voltage = (float)(data * 3.3 / 1024.0);
        printf("vlt:%.3fV\n", voltage);

        /* 睡眠1秒 */
        LOS_Msleep(1000);
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

ADC模块采用10位的ADC采集寄存器,可测试电压范围为0~3.3V,所以ADC采集数值换算为实际电压计算公司为:

实际电压 = (ADC采集数值 / 1024) * 3.3V
  • 1.

注意:实际电压是 float类型,源代码计算要规范。具体源代码如下所示:

return (float)(data * 3.3 / 1024.0)
  • 1.

4、编译调试

修改 vendor/lockzhiner/rk2206/sample 路径下 BUILD.gn 文件,指定 iot_adc_example 参与编译。

"./b17_iot_adc:iot_adc_example",
  • 1.

修改 device/lockzhiner/rk2206/sdk_liteos 路径下 Makefile 文件,添加 -liot_adc_example 参与编译。

hardware_LIBS = -lhal_iothardware -lhardware -lshellcmd -liot_adc_example
  • 1.

5、运行结果

示例代码编译烧录代码后,按下开发板的RESET按键,通过串口助手查看日志,显示如下:

***************Adc Example*************
vlt:3.297V
***************Adc Example*************
vlt:3.297V
***************Adc Example*************
vlt:3.297V
***************Adc Example*************
vlt:3.297V
***************Adc Example*************
vlt:3.297V
***************Adc Example*************
vlt:3.297V
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
收藏 1
回复
举报
1


回复
    相关推荐