想了解更多关于开源的内容,请访问:
51CTO 开源基础软件社区
https://ost.51cto.com
前言
前面一篇文章已经实现了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
- 简介
ADC(Analog to Digital Converter),即模拟-数字转换器,是一种将模拟信号转换成对应数字信号的设备。 - 基本概念
- 分辨率:即每个采样数据精度,用多少位数字来表示采集到一个模拟量,分辨率越高就能采集越精确的数据。常用分辨率:8bit、10bit、12bit。
- 精度:即模拟量转换成数字量的精确程度
- 采样速率:即每秒对ADC采样的次数
ADC设备硬件连接
除电源线和地线之外,ADC只需要1根线与被测量的设备进行连接,例如对于UnionPi_Tiger与LM35线性模拟温度传感器如下:
- 红线 -- 3.3V
- 黑线 -- GND
- 蓝线 -- ADC_1/ADC_2
LM35温度传感器原理及计算
购买:LM35线性模拟温度传感器LM35数据手册
- LM35测温范围是0℃到100℃,灵敏度为10mV/℃,输出电压与温度成正比。
- 输入输出以及电压和温度的关系如下。
- 温度值计算方法:
开发板分辨率为12位,即,查看原理图可知ADC的信号基准电压为1.8V。
则信号电压值计算为:
每10mv为1°C,则温度值为:
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设备句柄 channel:通道号 *val:采样值 | 0:读取成功 负数:读取失败 |
使用流程
使用ADC设备的一般流程如图。
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。
hdc_std shell
mount -o rw,remount /
hdc_std file 你的路径/adc /vendor/adc
5、运行
连接好传感器后,进入开发板终端:
./vendor/bin/adc #默认通道0进行采样(ADC_1)
./vendor/bin/adc 1 #使用通道1进行采样(ADC_2)
运行结果:
文章相关附件可以点击下面的原文链接前往下载:
https://ost.51cto.com/resource/2622。
想了解更多关于开源的内容,请访问:
51CTO 开源基础软件社区
https://ost.51cto.com