Harmony鸿蒙南向驱动开发-PWM接口使用

2024-04-13 06:12

本文主要是介绍Harmony鸿蒙南向驱动开发-PWM接口使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

功能简介

PWM即脉冲宽度调制(Pulse Width Modulation)的缩写,是一种对模拟信号电平进行数字编码并将其转换为脉冲的技术。

PWM接口定义了操作PWM设备的通用方法集合,包括:

  • PWM设备句柄获取和释放

  • PWM周期、占空比、极性的设置

  • PWM使能和关闭

  • PWM配置信息的获取和设置

基本概念

脉冲是“电脉冲”的简称,指电路中电流或电压短暂起伏的现象,其特点是突变和不连续性。脉冲的种类很多,常见的脉冲波形有:三角脉冲、尖脉冲、矩形脉冲、方形脉冲、梯形脉冲及阶梯脉冲等。脉冲的主要参数包括重复周期T(T=1/F,F为重复频率)、脉冲幅度U、脉冲前沿上升时间ts、后沿下降时间t、脉冲宽度tk等。

运作机制

在HDF框架中,PWM接口适配模式采用独立服务模式(如图1所示)。在这种模式下,每一个设备对象会独立发布一个设备服务来处理外部访问,设备管理器收到API的访问请求之后,通过提取该请求的参数,达到调用实际设备对象的相应内部方法的目的。独立服务模式可以直接借助HDF设备管理器的服务管理能力,但需要为每个设备单独配置设备节点,增加内存占用。

独立服务模式下,核心层不会统一发布一个服务供上层使用,因此这种模式下驱动要为每个控制器发布一个服务,具体表现为:

  • 驱动适配者需要实现HdfDriverEntry的Bind钩子函数以绑定服务。

  • device_info.hcs文件中deviceNode的policy字段为1或2,不能为0。

PWM模块各分层作用:

  • 接口层提供打开PWM设备、设置PWM设备周期、设置PWM设备占空时间、设置PWM设备极性、设置PWM设备参数、获取PWM设备参数、使能PWM设备、禁止PWM设备、关闭PWM设备的接口。

  • 核心层主要提供PWM控制器的添加、移除以及管理的能力,通过钩子函数与适配层交互。

  • 适配层主要是将钩子函数的功能实例化,实现具体的功能。

图 1 PWM独立服务模式结构图

PWM独立服务模式结构图

使用指导

场景介绍

通常情况下,在使用马达控制、背光亮度调节时会用到PWM模块。

接口说明

PWM模块设备属性如表1所示,PWM模块提供的主要接口如表2所示,具体API详见//drivers/hdf_core/framework/include/platform/pwm_if.h。

表 1 PwmConfig结构体介绍

名称描述
dutyuint32_t类型,占空时间,以纳秒为单位。
perioduint32_t类型,PWM周期,以纳秒为单位。
numberuint32_t类型,要生成的方波数:
- 正值:表示将生成指定数量的方波
- 0:表示方波将不断产生
polarityuint8_t类型,极性:正极性/反极性。
statusuint8_t类型,状态:启用状态/禁用状态。

表 2 PWM驱动API接口功能介绍

接口名接口描述
DevHandle PwmOpen(uint32_t num)打开PWM设备
void PwmClose(DevHandle handle)关闭PWM设备
int32_t PwmSetPeriod(DevHandle handle, uint32_t period)设置PWM设备周期
int32_t PwmSetDuty(DevHandle handle, uint32_t duty)设置PWM设备占空时间
int32_t PwmSetPolarity(DevHandle handle, uint8_t polarity)设置PWM设备极性
int32_t PwmEnable(DevHandle handle)使能PWM设备
int32_t PwmDisable(DevHandle handle)禁用PWM设备
int32_t PwmSetConfig(DevHandle handle, struct PwmConfig *config)设置PWM设备参数
int32_t PwmGetConfig(DevHandle handle, struct PwmConfig *config)获取PWM设备参数

说明:
本文涉及PWM的所有接口,支持内核态及用户态使用。

开发步骤

使用PWM的一般流程如下图所示。

图 2 PWM使用流程图

PWM使用流程图

获取PWM设备句柄

在操作PWM设备时,首先要调用PwmOpen获取PWM设备句柄,该函数会返回指定设备号的PWM设备句柄。

DevHandle PwmOpen(uint32_t num);

表 3 PwmOpen参数和返回值描述

参数参数描述
numuint32_t类型,PWM设备号
返回值返回值描述
handle打开PWM设备成功,返回PWM设备句柄
NULL打开PWM设备失败

假设系统中的PWM设备号为0,获取该PWM设备句柄的示例如下:

uint32_t num = 0;         // PWM设备号
DevHandle handle = NULL;handle = PwmOpen(num);    // 打开PWM 0设备并获取PWM设备句柄
if (handle == NULL) {HDF_LOGE("PwmOpen: open pwm_%u failed.\n", num);return HDF_FAILURE;
}
销毁PWM设备句柄

关闭PWM设备,系统释放对应的资源。

void PwmClose(DevHandle handle);

表 4 PwmClose参数描述

参数参数描述
handleDevHandle类型,PWM设备句柄
PwmClose(handle);    // 关闭PWM设备销毁PWM设备句柄
使能PWM设备
int32_t PwmEnable(DevHandle handle);

表 5 PwmEnable参数和返回值描述

参数参数描述
handleDevHandle类型,PWM设备句柄
返回值返回值描述
HDF_SUCCESS使能PWM设备成功
负数使能PWM设备失败
int32_t ret;ret = PwmEnable(handle);    // 启用PWM设备
if (ret != HDF_SUCCESS) {HDF_LOGE("PwmEnable: enable pwm failed, ret:%d\n", ret);return ret;
}
禁用PWM设备
int32_t PwmDisable(DevHandle handle);

表 6 PwmDisable参数和返回值描述

参数参数描述
handleDevHandle类型,PWM设备句柄
返回值返回值描述
HDF_SUCCESS禁用PWM设备成功
负数禁用PWM设备失败
int32_t ret;ret = PwmDisable(handle);    // 禁用PWM设备
if (ret != HDF_SUCCESS) {HDF_LOGE("PwmDisable: disable pwm failed, ret:%d\n", ret);return ret;
}
设置PWM设备周期
int32_t PwmSetPeriod(DevHandle handle, uint32_t period);

表 7 PwmSetPeriod参数和返回值描述

参数参数描述
handleDevHandle类型,PWM设备句柄
perioduint32_t类型,要设置的周期,单位为纳秒
返回值返回值描述
HDF_SUCCESS设置PWM设备周期成功
负数设置PWM设备周期失败
int32_t ret;ret = PwmSetPeriod(handle, 50000000);    // 设置周期为50000000纳秒
if (ret != HDF_SUCCESS) {HDF_LOGE("PwmSetPeriod: pwm set period failed, ret:%d\n", ret);return ret;
}
设置PWM设备占空时间
int32_t PwmSetDuty(DevHandle handle, uint32_t duty);

表 8 PwmSetDuty参数和返回值描述

参数参数描述
handleDevHandle类型,PWM设备句柄
dutyuint32_t类型,要设置的占空时间,单位为纳秒
返回值返回值描述
HDF_SUCCESS设置PWM设备占空时间成功
负数设置PWM设备占空时间失败
int32_t ret;ret = PwmSetDuty(handle, 25000000);    // 设置占空时间为25000000纳秒
if (ret != HDF_SUCCESS) {HDF_LOGE("PwmSetDuty: pwm set duty failed, ret:%d\n", ret);return ret;
}
设置PWM设备极性
int32_t PwmSetPolarity(DevHandle handle, uint8_t polarity);

表 9 PwmSetPolarity参数和返回值描述

参数参数描述
handleDevHandle类型,PWM设备句柄
polarityuint8_t类型,要设置的极性,正/反
返回值返回值描述
HDF_SUCCESS设置PWM设备极性成功
负数设置PWM设备极性失败
int32_t ret;ret = PwmSetPolarity(handle, PWM_INVERTED_POLARITY);    // 设置极性为反
if (ret != HDF_SUCCESS) {HDF_LOGE("PwmSetPolarity: pwm set polarity failed, ret:%d\n", ret);return ret;
}
设置PWM设备参数
int32_t PwmSetConfig(DevHandle handle, struct PwmConfig *config);

表 10 PwmSetConfig参数和返回值描述

参数参数描述
handleDevHandle类型,PWM设备句柄
config结构体指针类型,配置参数
返回值返回值描述
HDF_SUCCESS设置PWM设备参数成功
负数设置PWM设备参数失败
int32_t ret;
struct PwmConfig pcfg;pcfg.duty = 25000000;                     // 占空时间为25000000纳秒
pcfg.period = 50000000;                   // 周期为50000000纳秒
pcfg.number = 0;                          // 不断产生方波
pcfg.polarity = PWM_INVERTED_POLARITY;    // 极性为反
pcfg.status = PWM_ENABLE_STATUS;          // 运行状态为启用ret = PwmSetConfig(handle, &pcfg);        // 设置PWM设备参数
if (ret != HDF_SUCCESS) {HDF_LOGE("PwmSetConfig: pwm set config failed, ret:%d\n", ret);return ret;
}
获取PWM设备参数
int32_t PwmGetConfig(DevHandle handle, struct PwmConfig *config);

表 11 PwmGetConfig参数和返回值描述

参数参数描述
handleDevHandle类型,PWM设备句柄
config结构体指针类型,配置参数
返回值返回值描述
HDF_SUCCESS获取PWM设备参数成功
负数获取PWM设备参数失败
int32_t ret;
struct PwmConfig pcfg;ret = PwmGetConfig(handle, &pcfg);    // 获取PWM设备参数
if (ret != HDF_SUCCESS) {HDF_LOGE("PwmGetConfig: pwm get config failed, ret:%d\n", ret);return ret;
}

使用实例

下面将基于Hi3516DV300开发板展示使用PWM完整操作,步骤主要如下:

  1. 传入PWM设备号,打开PWM设备并获得PWM设备句柄。

  2. 通过PWM设备句柄及待设置的周期,设置PWM设备周期。

  3. 通过PWM设备句柄及待设置的占空时间,设置PWM设备占空时间。

  4. 通过PWM设备句柄及待设置的极性,设置PWM设备极性。

  5. 通过PWM设备句柄及待获取的设备参数,获取PWM设备参数。

  6. 通过PWM设备句柄,使能PWM设备。

  7. 通过PWM设备句柄及待设置的设备参数,设置PWM设备参数。

  8. 通过PWM设备句柄,禁用PWM设备。

  9. 通过PWM设备句柄,关闭PWM设备。

#include "pwm_if.h"                                               // pwm标准接口头文件
#include "hdf_log.h"                                              // 标准日志打印头文件static int32_t PwmTestSample(void)
{int32_t ret;uint32_t num;uint32_t period;uint32_t duty;DevHandle handle = NULL;struct PwmConfig pcfg;pcfg.duty = 20000000;                                         // 占空时间为20000000纳秒                 pcfg.period = 40000000;                                       // 周期为40000000纳秒pcfg.number = 100;                                            // 生成100个方波pcfg.polarity = PWM_NORMAL_POLARITY;                          // 极性为正pcfg.status = PWM_ENABLE_STATUS;                              // 运行状态为启用num = 1;                                                      // PWM设备编号,要填写实际平台上的编号handle = PwmOpen(num);                                        // 获取PWM设备句柄if (handle == NULL) {HDF_LOGE("PwmTestSample: open pwm_%u fail!\n", num);return HDF_FAILURE;}period = 50000000;                                            // 设置周期为50000000纳秒ret = PwmSetPeriod(handle, period);if (ret != HDF_SUCCESS) {HDF_LOGE("PwmTestSample: pwm set period fail, ret:%d\n", ret);goto ERR;}duty = 25000000;                                              // 设置占空时间为25000000纳秒ret = PwmSetDuty(handle, duty);if (ret != HDF_SUCCESS) {HDF_LOGE("PwmTestSample: pwm set duty fail, ret:%d\n", ret);goto ERR;}ret = PwmSetPolarity(handle, PWM_INVERTED_POLARITY);          // 设置极性为反if (ret != HDF_SUCCESS) {HDF_LOGE("PwmTestSample: pwm set polarity fail, ret:%d\n", ret);goto ERR;}ret = PwmGetConfig(handle, &pcfg);                            // 获取PWM设备参数if (ret != HDF_SUCCESS) {HDF_LOGE("PwmTestSample: get pwm config fail, ret:%d\n", ret);goto ERR;}ret = PwmEnable(handle);                                      // 启用PWM设备if (ret != HDF_SUCCESS) {HDF_LOGE("PwmEnable: enable pwm fail, ret:%d\n", ret);goto ERR;}ret = PwmSetConfig(handle, &pcfg);                            // 设置PWM设备参数if (ret != HDF_SUCCESS) {HDF_LOGE("PwmTestSample: set pwm config fail, ret:%d\n", ret);goto ERR;}ret = PwmDisable(handle);                                     // 禁用PWM设备if (ret != HDF_SUCCESS) {HDF_LOGE("PwmTestSample: disable pwm fail, ret:%d\n", ret);goto ERR;}HDF_LOGD("PwmTestSample: all tests end.");
ERR:PwmClose(handle);                                             // 销毁PWM设备句柄return ret;
}

最后

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(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学习资料

总结

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。 

这篇关于Harmony鸿蒙南向驱动开发-PWM接口使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/899339

相关文章

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

关于@MapperScan和@ComponentScan的使用问题

《关于@MapperScan和@ComponentScan的使用问题》文章介绍了在使用`@MapperScan`和`@ComponentScan`时可能会遇到的包扫描冲突问题,并提供了解决方法,同时,... 目录@MapperScan和@ComponentScan的使用问题报错如下原因解决办法课外拓展总结@

mysql数据库分区的使用

《mysql数据库分区的使用》MySQL分区技术通过将大表分割成多个较小片段,提高查询性能、管理效率和数据存储效率,本文就来介绍一下mysql数据库分区的使用,感兴趣的可以了解一下... 目录【一】分区的基本概念【1】物理存储与逻辑分割【2】查询性能提升【3】数据管理与维护【4】扩展性与并行处理【二】分区的

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,