合肥响应式网站开发方案,哈尔滨网站推广优化公司,wordpress单本小说主题,长春seo公司网站ADC#xff08;Analog to Digital Converter#xff09;#xff0c;即模拟-数字转换器#xff0c;可将模拟信号转换成对应的数字信号#xff0c;便于存储与计算等操作。除电源线和地线之外#xff0c;ADC只需要1根线与被测量的设备进行连接。 一、案例简介
该程序是基于… ADCAnalog to Digital Converter即模拟-数字转换器可将模拟信号转换成对应的数字信号便于存储与计算等操作。除电源线和地线之外ADC只需要1根线与被测量的设备进行连接。 一、案例简介
该程序是基于OpenHarmony标准系统编写的基础外设类ADC驱动。
目前该案例已在凌蒙派-RK3568开发板跑通。详细资料请参考官网https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk3568-openharmony/tree/master/samples/b04_platform_device_adc。
详细资料请参考OpenHarmony官网
ADC平台驱动开发ADC应用程序开发
二、基础知识
1、ADC简介
ADCAnalog to Digital Converter即模拟-数字转换器可将模拟信号转换成对应的数字信号便于存储与计算等操作。除电源线和地线之外ADC只需要1根线与被测量的设备进行连接。
2、ADC平台驱动
在HDF框架中同类型设备对象较多时可能同时存在十几个同类型配置器若采用独立服务模式则需要配置更多的设备节点且相关服务会占据更多的内存资源。相反采用统一服务模式可以使用一个设备服务作为管理器统一处理所有同类型对象的外部访问这会在配置文件中有所体现实现便捷管理和节约资源的目的。ADC模块即采用统一服务模式。如下图所示 OpenHarmony全流程讲解如何编写ADC平台驱动以及应用程序-开源基础软件社区
ADC模块各分层的作用为
接口层提供打开设备写入数据关闭设备的能力。核心层主要负责服务绑定、初始化以及释放管理器并提供添加、删除以及获取控制器的能力。适配层由驱动适配者实现与硬件相关的具体功能如控制器的初始化等。
在统一模式下所有的控制器都被核心层统一管理并由核心层统一发布一个服务供接口层因此这种模式下驱动无需再为每个控制器发布服务。
3、ADC应用程序
ADC模块提供的主要接口如表1所示具体API详见//drivers/hdf_core/framework/include/platform/adc_if.h。
ADC驱动API接口功能介绍如下所示 接口名 接口描述 DevHandle AdcOpen(uint32_t number) 打开ADC设备 void AdcClose(DevHandle handle) 关闭ADC设备 int32_t AdcRead(DevHandle handle, uint32_t channel, uint32_t *val) 读取AD转换结果值
使用ADC设备的一般流程如下所示 OpenHarmony全流程讲解如何编写ADC平台驱动以及应用程序-开源基础软件社区
三、程序解析
1、准备工作
查看《凌蒙派-RK3568开发板_排针说明表_》即Git仓库的//docs/board/凌蒙派-RK3568开发板_排针说明表_v1.0.xlsx选中ADC5即ADC5。
2、配置文件
1device_info.hcs
创建config/device_info.hcs用于驱动设备描述具体内容如下
#include adc_config.hcsroot {device_info {platform :: host {device_adc :: device {device0 :: deviceNode { // ADC控制器信息描述policy 2; // 对外发布服务必须为2用于定义ADC管理器的服务priority 50;permission 0644;moduleName HDF_PLATFORM_ADC_MANAGER; // 这与drivers/hdf_core/framework/support/platform/src/adc/adc_core.c的g_adcManagerEntry.moduleName对应它主要负责ADC的管理serviceName HDF_PLATFORM_ADC_MANAGER;}device1 :: deviceNode {policy 0; // 等于0不需要发布服务priority 55; // 驱动驱动优先级permission 0644; // 驱动创建设备节点权限moduleName linux_adc_adapter; // 用于指定驱动名称必须是linux_adc_adapterdeviceMatchAttr linux_adc_adapter; // 用于配置控制器私有数据必须与adc_config.hcs中对应控制器保持一致}}}}
}
注意
device0ADC控制器为了引入HDF_PLATFORM_ADC_MANAGER驱动必须要。device1ADC实际操作接口。moduleName该驱动名称必须是linux_adc_adapter//drivers/hdf_core/adapter/khdf/linux/platform/adc/adc_iio_adapter.c已编写好。deviceMatchAttr关键字必须与config.hcs的match_attr匹配。
2adc_config.hcs
创建config/adc_config.hcs用于定义私有变量具体内容如下
root {platform {adc_config {match_attr linux_adc_adapter; // 与device_info.hcs的deviceMatchAttr的值一致template adc_device { // 必须与//drivers/hdf_core/adapter/khdf/linux/platform/adc/adc_iio_adapter.c的配置树定义保持一致deviceNum 0; // 设备号标识channelNum 8; // ADC通道数量driver_channel0_name ; // 通道0在linux文件系统路径driver_channel1_name ; // 通道1在linux文件系统路径driver_channel2_name ; // 通道2在linux文件系统路径driver_channel3_name ; // 通道3在linux文件系统路径driver_channel4_name ; // 通道4在linux文件系统路径driver_channel5_name ; // 通道5在linux文件系统路径driver_channel6_name ; // 通道6在linux文件系统路径driver_channel7_name ; // 通道7在linux文件系统路径scanMode 0; // 扫描模式必要但无意义rate 1000; // 转换速率必要但无意义}device_0 :: adc_device {deviceNum 0;channelNum 8;driver_channel0_name /sys/bus/iio/devices/iio:device0/in_voltage0_raw;driver_channel1_name /sys/bus/iio/devices/iio:device0/in_voltage1_raw;driver_channel2_name /sys/bus/iio/devices/iio:device0/in_voltage2_raw;driver_channel3_name /sys/bus/iio/devices/iio:device0/in_voltage3_raw;driver_channel4_name /sys/bus/iio/devices/iio:device0/in_voltage4_raw;driver_channel5_name /sys/bus/iio/devices/iio:device0/in_voltage5_raw;driver_channel6_name /sys/bus/iio/devices/iio:device0/in_voltage6_raw;driver_channel7_name /sys/bus/iio/devices/iio:device0/in_voltage7_raw;}}}
}
ADC实际驱动是//drivers/hdf_core/adapter/khdf/linux/platform/adc/adc_iio_adapter.ctemplate adc_device定义的各项关键变量是由adc_iio_adapter.c决定不可修改。
adc_iio_adapter.c实际是对Linux IIO子系统进行操作来控制ADC。
注意
channelNum表示通道数量。driver_channelX_name必须是从0开始。
3参与配置树编译
编辑//vendor/lockzhiner/rk3568/hdf_config/khdf/hdf.hcs将device_info.hcs添加配置树中。具体内容如下所示
#include ../../samples/b04_platform_device_adc/config/device_info.hcs
3、HDF驱动
ADC平台驱动是//drivers/hdf_core/adapter/khdf/linux/platform/adc/adc_iio_adapter.c用户不必编写HDF驱动。
4、参与Linux内核编译
编辑//kernel/linux/config/linux-5.10/arch/arm64/configs/rk3568_standard_defconfig启用CONFIG_DRIVERS_HDF_PLATFORM_ADC具体内容如下
CONFIG_DRIVERS_HDF_PLATFORM_ADCy
5、应用程序
1adc_test.c
添加平台驱动ADC的头文件具体内容如下
#include adc_if.h // ADC标准接口头文件
程序可通过具体内容如下
int main(int argc, char* argv[])
{DevHandle handle NULL;int32_t ret;uint32_t value;// 解析参数parse_opt(argc, argv);printf(adc_device: %d\n, m_adc_device);printf(adc_channel: %d\n, m_adc_channel);// 打开ADC设备handle AdcOpen(m_adc_device);if (handle NULL) {PRINT_ERROR(AdcOpen failed\n);return -1;}// 进行AD转换并读取转换结果ret AdcRead(handle, m_adc_channel, value);if (ret ! 0) {PRINT_ERROR(AdcRead failed and ret %d\n, ret);AdcClose(handle);return -1;}printf(Adc Device(%d), Channel(%d) read successful and value %d\n, m_adc_device, m_adc_channel, value);// 关闭ADC设备AdcClose(handle);return 0;
}
2BUILD.gn
import(//build/ohos.gni)
import(//drivers/hdf_core/adapter/uhdf2/uhdf.gni)print(samples: compile rk3568_adc_test)
ohos_executable(rk3568_adc_test) {sources [ adc_test.c ]include_dirs [$hdf_framework_path/include,$hdf_framework_path/include/core,$hdf_framework_path/include/osal,$hdf_framework_path/include/platform,$hdf_framework_path/include/utils,$hdf_uhdf_path/osal/include,$hdf_uhdf_path/ipc/include,//base/hiviewdfx/hilog/interfaces/native/kits/include,//third_party/bounds_checking_function/include,]deps [$hdf_uhdf_path/platform:libhdf_platform,$hdf_uhdf_path/utils:libhdf_utils,//base/hiviewdfx/hilog/interfaces/native/innerkits:libhilog,]cflags [-Wall,-Wextra,-Werror,-Wno-format,-Wno-format-extra-args,]subsystem_name applicationspart_name product_rk3568install_enable true
}
3参与应用程序编译
编辑//vendor/lockzhiner/rk3568/samples/BUILD.gn开启编译选项。具体如下
b04_platform_device_adc/app:rk3568_adc_test,
四、程序编译
建议使用docker编译方法运行如下
hb set -root .
hb set
# 选择lockzhiner下的rk3568编译分支。
hb build -f
五、运行结果
该程序运行结果如下所示
# rk3568_adc_test -d 0 -c 5
../../vendor/lockzhiner/rk3568/samples/b21_platform_device_adc/app/adc_test.c, main, 103, info: adc_device: 0
../../vendor/lockzhiner/rk3568/samples/b21_platform_device_adc/app/adc_test.c, main, 104, info: adc_channel: 5
Adc Device(0), Channel(5) read successful and value 955
#
可以将ADC引脚通过引线接入排针线中的GNU或3V3中可以查看ADC的变化。
最后
有很多小伙伴不知道学习哪些鸿蒙开发技术不知道需要重点掌握哪些鸿蒙应用开发知识点而且学习时频繁踩坑最终浪费大量时间。所以有一份实用的鸿蒙HarmonyOS NEXT资料用来跟着学习是非常有必要的。
这份鸿蒙HarmonyOS NEXT资料包含了鸿蒙开发必掌握的核心知识要点内容包含了ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等鸿蒙HarmonyOS NEXT技术知识点。
希望这一份鸿蒙学习资料能够给大家带来帮助有需要的小伙伴自行领取限时开源先到先得~无套路领取
获取这份完整版高清学习路线请点击→纯血版全套鸿蒙HarmonyOS学习资料
鸿蒙HarmonyOS NEXT最新学习路线 HarmonOS基础技能 HarmonOS就业必备技能 HarmonOS多媒体技术 鸿蒙NaPi组件进阶 HarmonOS高级技能 初识HarmonOS内核 实战就业级设备开发 有了路线图怎么能没有学习资料呢小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙OpenHarmony 学习手册共计1236页与鸿蒙OpenHarmony 开发入门教学视频内容包含ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。
获取以上完整版高清学习路线请点击→纯血版全套鸿蒙HarmonyOS学习资料
《鸿蒙 (OpenHarmony)开发入门教学视频》 《鸿蒙生态应用开发V2.0白皮书》 《鸿蒙 (OpenHarmony)开发基础到实战手册》
OpenHarmony北向、南向开发环境搭建 《鸿蒙开发基础》
ArkTS语言安装DevEco Studio运用你的第一个ArkTS应用ArkUI声明式UI开发.…… 《鸿蒙开发进阶》
Stage模型入门网络管理数据管理电话服务分布式应用开发通知与窗口管理多媒体技术安全技能任务管理WebGL国际化开发应用测试DFX面向未来设计鸿蒙系统移植和裁剪定制…… 《鸿蒙进阶实战》
ArkTS实践UIAbility应用网络案例…… 获取以上完整鸿蒙HarmonyOS学习资料请点击→纯血版全套鸿蒙HarmonyOS学习资料
总结
总的来说华为鸿蒙不再兼容安卓对中年程序员来说是一个挑战也是一个机会。只有积极应对变化不断学习和提升自己他们才能在这个变革的时代中立于不败之地。