#创作者激励# [FFH]标准系统HDF平台驱动(二)——ADC平台驱动使用
  noedAHRF1iby 2023年11月13日 20 0

【本文正在参加2023年第一期优质创作者激励计划】

标准系统HDF平台驱动(二)——ADC平台驱动使用

个人简介:深圳技术大学FSR实验室大三学生,正于九联科技实习,共同学习研究南向开发知识。 博客主页:https://ost.51cto.com/person/posts/15624680

前言

前面一篇文章已经实现了UnionPi_Tiger的ADC驱动的HDF框架接入(在最新的master版本上已经进行了适配,OpenHarmony-3.2-Beta5上目前还没实现),现在已经可以正常调用HDF提供的ADC统一驱动接口进行应用开发。现在就使用这些接口来读取LM35温度传感器数据。

环境

  • OpenHarmony-3.2-Beta5
  • 九联UnionPi-Tiger开发板
  • USB_Burning_Tool烧录工具
  • LM35线性模拟温度传感器

参考

平台驱动使用——ADC 标准系统HDF平台驱动(一)——ADC驱动适配

前置知识

ADC

  1. 简介 ADC(Analog to Digital Converter),即模拟-数字转换器,是一种将模拟信号转换成对应数字信号的设备。
  2. 基本概念
  • 分辨率:即每个采样数据精度,用多少位数字来表示采集到一个模拟量,分辨率越高就能采集越精确的数据。常用分辨率:8bit、10bit、12bit。
  • 精度:即模拟量转换成数字量的精确程度
  • 采样速率:即每秒对ADC采样的次数

ADC设备硬件连接

image.png 除电源线和地线之外,ADC只需要1根线与被测量的设备进行连接,例如对于UnionPi_Tiger与LM35线性模拟温度传感器如下:

  • 红线 -- 3.3V
  • 黑线 -- GND
  • 蓝线 -- ADC_1/ADC_2

image.png

LM35温度传感器原理及计算

购买:LM35线性模拟温度传感器 LM35数据手册

  • LM35测温范围是0℃到100℃,灵敏度为10mV/℃,输出电压与温度成正比。

  • 输入输出以及电压和温度的关系如下

image.png

image.png

  • 温度值计算方法: 开发板分辨率为12位,即$2^{12} = 4096$,查看原理图可知ADC的信号基准电压为1.8V

image.png

则信号电压值计算为:$V = 1.8*val_{采样}/4096$ 每10mv为1°C,则温度值为: $T = V/0.01=val_{采样}*0.044$

ADC平台接口介绍

ADC接口定义了完成AD转换的通用方法集合,包括:

  • ADC设备管理:打开或关闭ADC设备。
  • ADC读取转换结果:读取AD转换结果。 具体API详见//drivers/hdf_core/framework/include/platform/adc_if.h。
接口名 接口描述 参数 返回值
DevHandle AdcOpen(uint32_t number) 打开ADC设备 number:ADC设备号 DevHandle:ADC设备句柄
void AdcClose(DevHandle handle) 关闭ADC设备 handle:ADC设备句柄
int32_t AdcRead(DevHandle handle, uint32_t channel, uint32_t *val) 读取AD转换结果值 handle:ADC设备句柄<br> channel:通道号<br> *val:采样值 0:读取成功 <br>负数:读取失败

使用流程

使用ADC设备的一般流程如图。 image.png ADC模块仅支持轮询方式读取数据。

平台驱动使用

接下来测试一下ADC的HDF驱动框架是否成功,以读取LM35温度传感器为例,测试ADC接口层函数功能。工程位置为vendor/unionman/unionpi_tiger/sample/hdf

hdf
├── adc
│   ├── adc.c
│   └── BUILD.gn
├── BUILD.gn

1. 编写驱动代码

#include <stdio.h>
#include <stdlib.h>
#include "adc_if.h"
#include "hdf_log.h"
#include "osal_time.h"


/* 设备号0,通道号1 */ 
#define ADC_DEVICE_NUM  0
#define TEMP_CONST (1.8/(0.01*4096))

int32_t main(int argc, char *argv[])
{
    int32_t ret;
    uint32_t channelNum=0;
    DevHandle adcHandle = NULL;
    uint32_t read_val = 0;
    double temperature = 0;
    //默认打开通道0,可以输入参数使用其他通道
    if(argc == 2)
    {
        channelNum=atoi(argv[1]);
    }

    /* 打开ADC设备 */ 
    adcHandle = AdcOpen(ADC_DEVICE_NUM);
    if (adcHandle == NULL) {
        HDF_LOGE("%s: Open ADC%u fail!", __func__, ADC_DEVICE_NUM);
        return -1;
    }
    /* 读取ADC数据 */ 
    ret = AdcRead(adcHandle, channelNum, &read_val);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("%s: ADC read fail!:%d", __func__, ret);
        AdcClose(adcHandle);
        return -1;
    }
    /* 计算温度 */ 
    temperature = ((double)read_val) * TEMP_CONST;

    printf("ADC value is %d\r\n",read_val);
    printf("Temperature is %.1f°C\n", temperature);

    HDF_LOGI("%s: ADC read successful!", __func__);

    /* 访问完毕关闭ADC设备 */ 
    AdcClose(adcHandle);
    return HDF_SUCCESS;
}

2. 编写BUILD.gn

import("//build/ohos.gni")
import("//drivers/hdf_core/adapter/uhdf2/uhdf.gni")

ohos_executable("adc") {
  sources = [ "adc.c" ]

  include_dirs = [
    "//drivers/hdf_core/framework/include/platform",
  ]

  deps = [ "//drivers/hdf_core/adapter/uhdf2/platform:libhdf_platform" ]

  external_deps = [
    "hdf_core:libhdf_utils",
    "hiviewdfx_hilog_native:libhilog",
  ]

  cflags = [
    "-Wall",
    "-Wextra",
    "-Werror",
    "-Wno-format",
    "-Wno-format-extra-args",
  ]

  install_enable = true
  install_images = [ "vendor" ]
  module_install_dir = "bin"
  part_name = "unionman_products"
}

3. 添加进编译

import("//build/ohos.gni")

group("hdf") {
  deps = [
    "gpio:gpio",
    "led_light:led_light",
    "pwm:pwm",
    "adc:adc" # 添加这句话
  ]
}

4. 编译打包烧录

具体步骤参考:https://gitee.com/openharmony/device_board_unionman/blob/master/unionpi_tiger/README_zh.md#编译与调试

如果开发板原本烧录的系统与编译的系统一致,也可以直接通过hdc_std工具直接将生成的可执行程序发送到开发板,编译生成的可执行程序位于out/unionpi_tiger/packages/phone/vendor/bin。

  • 打开cmd窗口,挂载,打开权限
hdc_std shell
mount -o rw,remount /
  • 发送文件
hdc_std file 你的路径/adc /vendor/adc
  • 运行可执行文件
./vendor/bin/adc
  1. 运行 连接好传感器后,进入开发板终端:
./vendor/bin/adc  #默认通道0进行采样(ADC_1)
./vendor/bin/adc 1 #使用通道1进行采样(ADC_2)

运行结果 image.png

附件链接:https://ost.51cto.com/resource/2622

本文作者:FFH杞人

想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com/#bkwz​

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

noedAHRF1iby