From 33200b6e4a9718f2cd2f8989e533845acecb6695 Mon Sep 17 00:00:00 2001 From: yinshuqing Date: Thu, 4 Nov 2021 17:15:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9EPWM=E9=A9=B1=E5=8A=A8?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=8C=87=E5=AF=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yinshuqing --- zh-cn/device-dev/driver/Readme-CN.md | 1 + .../driver/driver-platform-pwm-des.md | 477 ++++++++++++++++++ ...0\346\265\201\347\250\213\345\233\276.png" | Bin 0 -> 4638 bytes 3 files changed, 478 insertions(+) create mode 100755 zh-cn/device-dev/driver/driver-platform-pwm-des.md create mode 100755 "zh-cn/device-dev/driver/figure/PWM\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" diff --git a/zh-cn/device-dev/driver/Readme-CN.md b/zh-cn/device-dev/driver/Readme-CN.md index 27caa89536b..bd5a2ca5fdf 100755 --- a/zh-cn/device-dev/driver/Readme-CN.md +++ b/zh-cn/device-dev/driver/Readme-CN.md @@ -27,6 +27,7 @@ - [SPI](driver-platform-spi-des.md) - [UART](driver-platform-uart-des.md) - [WATCHDOG](driver-platform-watchdog-des.md) + - [PWM](driver-platform-pwm-des.md) - [MIPI DSI](driver-platform-mipidsi-des.md) - [外设驱动开发](driver-peripherals.md) - [LCD](driver-peripherals-lcd-des.md) diff --git a/zh-cn/device-dev/driver/driver-platform-pwm-des.md b/zh-cn/device-dev/driver/driver-platform-pwm-des.md new file mode 100755 index 00000000000..1f490e1b563 --- /dev/null +++ b/zh-cn/device-dev/driver/driver-platform-pwm-des.md @@ -0,0 +1,477 @@ +# PWM + +- [概述](#section1_PWM_des) + - [PwmConfig结构体](#section1.1_PWM_des) + - [接口说明](#section1.2_PWM_des) +- [使用指导](#section2_PWM_des) + - [使用流程](#section2.1_PWM_des) + - [打开PWM设备](#section2.2_PWM_des) + - [关闭PWM设备](#section2.3_PWM_des) + - [使能](#section2.4_PWM_des) + - [禁用](#section2.5_PWM_des) + - [设置PWM设备周期](#section2.6_PWM_des) + - [设置PWM设备占空时间](#section2.7_PWM_des) + - [设置PWM设备极性](#section2.8_PWM_des) + - [设置PWM设备参数](#section2.9_PWM_des) + - [获取PWM设备参数](#section2.10_PWM_des) + +- [使用实例](#section3_PWM_des) + +## 概述 + +- PWM是脉冲宽度调制(Pulse Width Modulation)的缩写,是一种对模拟信号电平进行数字编码,转换为脉冲的一种技术。常用于马达控制、背光亮度调节等。 + +- PWM接口定义了操作PWM设备的通用方法集合,包括: + - PWM设备句柄获取和释放。 + - PWM周期、占空比、极性的设置。 + - PWM使能和关闭。 + - PWM配置信息的获取和设置 + +### PwmConfig结构体 + +**表1** PwmConfig结构体介绍 + + + +| 名称 | 描述 | +| -------- | ------------------------------------------------------------ | +| duty | 占空时间,以纳秒为单位 | +| period | PWM周期,以纳秒为单位 | +| number | 要生成的方波数。正值表示将生成指定数量的方波,0表示方波将不断产生 | +| polarity | 极性:正极性/反极性 | +| status | 状态:启用状态/禁用状态 | + +### 接口说明 + +**表2** PWM设备API接口功能介绍 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
功能分类接口名描述
PWM句柄操作PwmOpen获取PWM设备驱动句柄
PwmClose释放PWM设备驱动句柄
使能/禁用PWMPwmEnable使能PWM
PwmDisable禁用PWM
PWM配置操作PwmSetPeriod设置PWM周期
PwmSetDuty设置PWM占空时间
PwmSetPolarity设置PWM极性
设置/获取PWM配置信息PwmSetConfig设置PWM配置信息
PwmGetConfig获取PWM配置信息
+ + +>![](W:\doc\docs\zh-cn\device-dev\public_sys-resources\icon-note.gif) **说明:** +>PWM当前仅限内核态使用,不支持在用户态使用。 + +## 使用指导 + +### 使用流程 + +在操作系统启动过程中,驱动管理模块根据配置文件加载PWM驱动,PWM驱动会检测PWM器件并初始化驱动。 + +使用PWM设备的一般流程如[图1](#fig1_PWM_des)所示。 + +**图 1** PWM设备使用流程图 + + +![](figure/PWM使用流程图.png) + +### 打开PWM设备 + +PWM驱动加载成功后,驱动开发者使用驱动框架提供的查询接口并调用PWM设备驱动接口。 + +```c +DevHandle PwmOpen(uint32_t num); +``` + +**表3** PwmOpen参数和返回值描述 + + + +| 参数 | 参数描述 | +| ---------- | ----------------------- | +| void | NA | +| num | PWM设备编号 | +| **返回值** | **返回值描述** | +| handle | 获取成功返回PWM设备句柄 | +| NULL | 获取失败 | + + +```c +uint32_t num = 0; /* PWM设备号 */ +DevHandle handle = NULL; + +/* 获取PWM设备句柄 */ +handle = PwmOpen(num); +if (handle == NULL) { + /* 错误处理 */ +} +``` + +### 关闭PWM设备 + +关闭PWM设备,系统释放对应的资源。 + +```c +void PwmClose(DevHandle handle); +``` + +**表4** PwmClose参数描述 + + + +| 参数 | 参数描述 | +| ------ | ----------- | +| handle | PWM设备句柄 | + + +```c +/* 关闭PWM设备句柄 */ +PwmClose(handle); +``` + +### 使能 + +启用PWM设备。 + +```c +int32_t PwmEnable(DevHandle handle); +``` + +**表5** PwmEnable参数描述 + + + +| 参数 | 参数描述 | +| ---------- | -------------- | +| handle | PWM设备句柄 | +| **返回值** | **返回值描述** | +| 0 | 使能成功 | +| 负数 | 使能失败 | + +```c +int32_t ret; + +/*启用PWM设备*/ +ret = PwmEnable(handle); +if (ret != 0) { + /*错误处理*/ +} +``` + +### 禁用 + +禁用PWM设备。 + +```c +int32_t PwmDisable(DevHandle handle); +``` + +**表6** PwmDisable参数描述 + + + +| 参数 | 参数描述 | +| ---------- | -------------- | +| handle | PWM设备句柄 | +| **返回值** | **返回值描述** | +| 0 | 禁用成功 | +| 负数 | 禁用失败 | + +```c +int32_t ret; + +/*禁用PWM设备*/ +ret = PwmDisable(handle); +if (ret != 0) { + /*错误处理*/ +} +``` + +### 设置PWM设备周期 + +设置PWM设备周期。 + +```c +int32_t PwmSetPeriod(DevHandle handle, uint32_t period); +``` + +**表7** PwmSetPeriod参数描述 + + + +| 参数 | 参数描述 | +| ---------- | ------------------------ | +| handle | PWM设备句柄 | +| period | 要设置的周期,单位为纳秒 | +| **返回值** | **返回值描述** | +| 0 | 设置成功 | +| 负数 | 设置失败 | + +```c +int32_t ret; + +/*设置周期为50000000纳秒*/ +ret = PwmSetPeriod(handle, 50000000); +if (ret != 0) { + /*错误处理*/ +} +``` +### 设置PWM设备占空时间 + +设置PWM设备占空时间。 + +```c +int32_t PwmSetDuty(DevHandle handle, uint32_t duty); +``` + +**表8** PwmSetDuty参数描述 + + + +| 参数 | 参数描述 | +| ---------- | ---------------------------- | +| handle | PWM设备句柄 | +| duty | 要设置的占空时间,单位为纳秒 | +| **返回值** | **返回值描述** | +| 0 | 设置成功 | +| 负数 | 设置失败 | + +```c +int32_t ret; + +/*设置占空时间为25000000纳秒*/ +ret = PwmSetDuty(handle, 25000000); +if (ret != 0) { + /*错误处理*/ +} +``` +### 设置PWM设备极性 + +设置PWM设备极性。 + +```c +int32_t PwmSetPolarity(DevHandle handle, uint8_t polarity); +``` + +**表9** PwmSetPolarity参数描述 + + + +| 参数 | 参数描述 | +| ---------- | ------------------- | +| handle | PWM设备句柄 | +| polarity | 要设置的极性,正/反 | +| **返回值** | **返回值描述** | +| 0 | 设置成功 | +| 负数 | 设置失败 | + +```c +int32_t ret; + +/*设置极性为反*/ +ret = PwmSetPolarity(handle, PWM_INVERTED_POLARITY); +if (ret != 0) { + /*错误处理*/ +} +``` + + +### 设置PWM设备参数 + +设置PWM设备参数。 + +```c +int32_t PwmSetConfig(DevHandle handle, struct PwmConfig *config); +``` + +**表10** PwmSetConfig参数描述 + + + +| 参数 | 参数描述 | +| ---------- | -------------- | +| handle | PWM设备句柄 | +| *config | 参数指针 | +| **返回值** | **返回值描述** | +| 0 | 设置成功 | +| 负数 | 设置失败 | + +```c +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; /*运行状态为启用*/ + +/*设置PWM设备参数*/ +ret = PwmSetConfig(handle, &pcfg); +if (ret != 0) { + /*错误处理*/ +} +``` + +### 获取PWM设备参数 + +获取PWM设备参数。 + +```c +int32_t PwmGetConfig(DevHandle handle, struct PwmConfig *config); +``` + +**表11** PwmGetConfig参数描述 + + + +| 参数 | 参数描述 | +| ---------- | -------------- | +| handle | PWM设备句柄 | +| *config | 参数指针 | +| **返回值** | **返回值描述** | +| 0 | 获取成功 | +| 负数 | 获取失败 | + +```c +int32_t ret; +struct PwmConfig pcfg; + +/*获取PWM设备参数*/ +ret = PwmGetConfig(handle, &pcfg); +if (ret != 0) { + /*错误处理*/ +} +``` + +## 使用实例 + +PWM设备完整的使用示例如下所示,首先获取PWM设备句柄,接着使能,设置设备周期、占空时间、极性,设置设备参数,之后获取设备参数,禁用,最后销毁PWM设备句柄。 + +``` +void PwmTestSample(void) +{ + int32_t ret; + uint32_t num; + 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; /*运行状态为启用*/ + + /* PWM设备编号,要填写实际平台上的编号 */ + num = 1; + + /* 获取PWM设备句柄 */ + handle = PwmOpen(num); + if (handle == NULL) { + HDF_LOGE("PwmOpen: failed!\n"); + return; + } + + /*启用PWM设备*/ + ret = PwmEnable(handle); + if (ret != 0) { + HDF_LOGE("PwmEnable: failed, ret %d\n", ret); + goto _ERR; + } + + /*设置周期为50000000纳秒*/ + ret = PwmSetPeriod(handle, 50000000); + if (ret != 0) { + HDF_LOGE("PwmSetPeriod: failed, ret %d\n", ret); + goto _ERR; + } + + /*设置占空时间为25000000纳秒*/ + ret = PwmSetDuty(handle, 25000000); + if (ret != 0) { + HDF_LOGE("PwmSetDuty: failed, ret %d\n", ret); + goto _ERR; + } + + /*设置极性为反*/ + ret = PwmSetPolarity(handle, PWM_INVERTED_POLARITY); + if (ret != 0) { + HDF_LOGE("PwmSetPolarity: failed, ret %d\n", ret); + goto _ERR; + } + + /*设置PWM设备参数*/ + ret = PwmSetConfig(handle, &pcfg); + if (ret != 0) { + HDF_LOGE("PwmSetConfig: failed, ret %d\n", ret); + goto _ERR; + } + + /*获取PWM设备参数*/ + ret = PwmGetConfig(handle, &pcfg); + if (ret != 0) { + HDF_LOGE("PwmGetConfig: failed, ret %d\n", ret); + goto _ERR; + } + + /*禁用PWM设备*/ + ret = PwmDisable(handle); + if (ret != 0) { + HDF_LOGE("PwmDisable: failed, ret %d\n", ret); + goto _ERR; + } + +_ERR: + /* 销毁PWM设备句柄 */ + PwmClose(handle); +} +``` + diff --git "a/zh-cn/device-dev/driver/figure/PWM\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" "b/zh-cn/device-dev/driver/figure/PWM\344\275\277\347\224\250\346\265\201\347\250\213\345\233\276.png" new file mode 100755 index 0000000000000000000000000000000000000000..b70d8d7d09bc30608529c06175183cf0cc523d41 GIT binary patch literal 4638 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