全志R128 SDK HAL 模块开发指南之PWM

PWM

模块介绍

脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM 具有以下特点:

  • 支持脉冲(脉冲个数可配)、周期和互补对输出;
  • 支持捕捉输入;
  • 带可编程死区发生器,死区时间可控;
  • 0-24M/100M 输出频率范围、0%-100% 占空比可调、最小分辨率 1/65536;
  • 支持 PWM 输出和捕捉输入产生中断;
  • 支持 PWM 组模式,同组内各个通道起始相位可配置。

模块配置

配置路径如下:

Kernel Setup --->Drivers Setup --->SoC HAL Drivers --->pwm devices --->[*] enable pwm driver

源码结构

rtos-hal/
|--hal/source/pwm/hal_pwm.c    // hal层接口代码
|--include/hal/sunxi_hal_pwm.h // 头文件

模块接口说明

头文件

#include <sunxi_hal_pwm.h>

返回值枚举

typedef enum {HAL_PWM_STATUS_ERROR_PARAMETER = -3,HAL_PWM_STATUS_ERROR_CHANNEL = -2,HAL_PWM_STATUS_ERROR = -1,HAL_PWM_STATUS_OK = 0
} hal_pwm_status_t;

PWM 初始化接口

PWM 模块初始化,主要完成 clk 初始化

函数原型:

pwm_status_t hal_pwm_init(void)

参数:

返回值:

  • 0:成功
  • 负数:失败

PWM 通道配置接口

配置 PWM 模块某个通道,包括周期、占空比和极性

函数原型:

pwm_status_t hal_pwm_control(int channel, struct pwm_config *config_pwm)

参数:

  • channel 代表通道号
  • config_pwm 代表该通道的配置参数

返回值:

  • 0:成功
  • 负数:失败

PWM 通道使能接口

使能 PWM 模块某个通道

函数原型:

void hal_pwm_enable_controller(uint32_t channel_in)

参数:

  • channel_in 代表通道号

返回值:

PWM 去初始化接口

PWM 模块去初始化,主要关闭 clk

函数原型:

pwm_status_t hal_pwm_deinit(void)

参数:

返回值:

  • 0:成功
  • 负数:失败

模块使用范例

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>#include <hal_log.h>
#include <hal_cmd.h>
#include <sunxi_hal_pwm.h>#if defined(CONFIG_ARCH_DSP)
#include <delay.h>
#define sleep(sec) msleep(sec * 1000)
#endif#ifndef printfFromISR
#define printfFromISR printf
#endifstatic int cmd_test_pwm(int argc, char **argv)
{struct pwm_config *config;uint8_t port;//uint8_t ns;int period, duty;if (argc < 4){hal_log_info("Usage: pwm port | duty | period\n");return -1;}hal_log_info("Run pwm hal layer test case\n");port = strtol(argv[1], NULL, 0);hal_log_info("port = %d", port);duty = strtoul(argv[2], NULL, 0);period = strtoul(argv[3], NULL, 0);config = (struct pwm_config *)malloc(sizeof(struct pwm_config));config->duty_ns   = duty;config->period_ns = period;config->polarity  = PWM_POLARITY_NORMAL;hal_log_info("duty_ns = %d \n", config->duty_ns);hal_log_info("period_ns = %d \n", config->period_ns);hal_log_info("polarity = %d \n", config->polarity);hal_pwm_init();hal_pwm_control(port, config);hal_log_info("control pwm test finish\n");return 0;
}FINSH_FUNCTION_EXPORT_CMD(cmd_test_pwm, hal_pwm, pwm hal APIs tests)static int cmd_release_pwm_channel(int argc, char **argv)
{struct pwm_config *config;uint8_t port;uint8_t ns;ulong period, duty;if (argc < 2){hal_log_info("Usage: pwm port\n");return -1;}hal_log_info("Run close pwm channel test case\n");port = strtol(argv[1], NULL, 0);hal_log_info("port = %d", port);hal_pwm_release(port);hal_log_info("release pwm channel finish\n");return 0;
}FINSH_FUNCTION_EXPORT_CMD(cmd_release_pwm_channel, hal_pwm_close, release pwm channel hal APIs tests)static void pwm_cap_callback(void* param)
{hal_pwm_cap_info *info = (hal_pwm_cap_info *)param;printfFromISR("pwm%d capture callback, cnt is %d, period is %d, duty is %d\n", info->channel, info->cnt, info->period, info->duty);
}hal_pwm_status_t pwm_capture_init(uint32_t channel)
{hal_pwm_cap_enable(channel, pwm_cap_callback);return HAL_PWM_STATUS_OK;
}hal_pwm_status_t pwm_capture_deinit(uint32_t channel)
{hal_pwm_cap_disable(channel);return HAL_PWM_STATUS_OK;
}void cmd_pwm_capture_help(void)
{printf("pwm capture test, stop capture after 10s\n");printf("usage: pwm_capture_test<channel>\n");printf("\t<channel>: 0 ~ 15\n");printf("eg: pwm_capture_test 0, pwm0 capture function\n");
}int cmd_pwm_capture(int argc, char *argv[])
{int count = 0;if (argc != 2 || atoi(argv[1]) > 15) {cmd_pwm_capture_help();return -1;}/* capture setting */pwm_capture_init(atoi(argv[1]));for(count = 0; count < 10; count++) {sleep(1);}/* disable */pwm_capture_deinit(atoi(argv[1]));printf("[%s]: pwm stop capture ssd\n", __func__);return 0;
}FINSH_FUNCTION_EXPORT_CMD(cmd_pwm_capture, pwm_capture_test, pwm capture test)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/12694.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【java】异常与错误

Throwable包括Error和Expected。 Error Error错误是程序无法处理的&#xff0c;由JVM产生并抛出的。 举例&#xff1a;StackOverflowError \ ThreadDeath Expected Expected异常包括两类&#xff0c;即受检异常(非运行时异常)和非受检异常(运行时异常)&#xff0c;异常往往…

oracle 临时表 在sql 里面用完要删除吗

临时表 在sql 里面用完要删除吗 在Oracle数据库中&#xff0c;如果您使用的是ON COMMIT DELETE ROWS创建的临时表&#xff0c;那么当当前会话结束或者执行了显式的COMMIT或ROLLBACK操作后&#xff0c;表中的数据会自动被清除。这意味着通常情况下&#xff0c;您不需要手动删除…

阿里云服务器下,部署LNMP环境安装wordpress

目录 1 LNMP部署1、简单说明2、nginx部署3、php8 安装4、mysql8安装5、配置 nginx 实现支持 PHP 程序6、安装 php 组件7、测试 2 wordpress部署1、安装2、配置 总结 1 LNMP部署 1、简单说明 首先需要明白&#xff0c;LNMP指的是Linux、Nginx、MySQL、PHP。而如果使用阿里云服…

数字化应用标杆 | 又两家成套厂效率翻倍,利用率高达93%以上!

利驰 联能 & 利驰 俊郎 近日&#xff0c;利驰数字科技&#xff08;苏州&#xff09;有限公司&#xff08;简称利驰软件&#xff09;成功与俊郎电气有限公司&#xff08;简称俊郎电气&#xff09;、浙江联能电气有限公司&#xff08;简称联能电气&#xff09;成功确立了数字…

【全开源】国际版JAVA同城服务美容美发到店服务上门服务系统源码支持Android+IOS+H5

国际版同城服务美容美发到店与上门服务系统&#xff1a;一站式打造美丽新体验 随着人们生活水平的提高和审美观念的升级&#xff0c;美容美发服务已成为人们日常生活中不可或缺的一部分。为了满足全球消费者的多样化需求&#xff0c;我们推出了“国际版同城服务美容美发到店与…

时间管理的误区:为什么你越高效就越没有时间?

在平衡生活和工作的过程中&#xff0c;时间管理无疑很重要。然而&#xff0c;许多人发现在提高效率后&#xff0c;却发现自己越来越感到时间紧迫&#xff0c;仿佛陷入了一个无解的循环。这背后的原因&#xff0c;往往是由于一系列时间管理的误区所致。 一个常见的误区是&…

在 CLion、Dev-C++ 或 Code::Blocks 下面配置 EasyX

前言 本文提供了将 EasyX 适配到 MinGW 上的库文件&#xff0c;并详细介绍如何将 EasyX 配置到 DevCpp 或 CodeBlocks 等以 MinGW 为编译器的集成开发环境。 库文件下载 点击这里下载 easyx4mingw_20220901 点击这里下载 easyx4mingw_20220610 &#xff08;上个版本&#x…

Php 读取execl

安装PhpSpreadsheet composer require phpoffice/phpspreadsheet <?phprequire vendor/autoload.php; // 引入Composer自动加载文件use PhpOffice\PhpSpreadsheet\IOFactory;// 指定Excel文件路径 $filePath path/to/your/excel/file.xlsx;try {// 加载Excel文件$spreadsh…

C++并发:锁

一、前言 C中的锁和同步原语的多样化选择使得程序员可以根据具体的线程和数据保护需求来选择最合适的工具。这些工具的正确使用可以大大提高程序的稳定性和性能&#xff0c;本文讨论了部分锁。 二、std::lock 在C中&#xff0c;std::lock 是一个用于一次性锁定两个或多个互斥…

鸿蒙 DevEcoStudio:关系型数据库增删改查练习

修改entry/src/main/ets/entryability目录下的EntryAbility.ts文件&#xff1a; 在 export default class EntryAbility extends UIAbility {onCreate(want, launchParam) {hilog.info(0x0000, testTag, %{public}s, Ability onCreate); 之后添加&#xff1a; const config…

学习Nginx(五):虚拟主机配置

核心功能 在演示虚拟主机配置之前&#xff0c;来看一下Nginx配置的核心功能说明。 了解配置更多功能&#xff0c;请查看官方说明&#xff1a; http://nginx.org/en/docs/ngx_core_module.html [rootRockyLinux9 conf]# cat nginx.conf # 核心功能&#xff0c;全局配置 # 设置启…

【Vue3源码实现】Ref isRef unRef proxyRefs实现

前言 在上篇文章中 我们了解了响应式原理&#xff0c;并在最后实现了reactive。 上文链接&#x1f525;&#x1f525;&#x1f525;Vue3响应式原理实现与track和trigger依赖收集和触发依赖 在我们的日常业务中&#xff0c;我们有可能需要将一个基础数据类型的值也转换成响应式…

Linux 生态与工具

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 目录 Linux生态简介:Linux工具lrzsz&#xff…

抖音产品全线恢复

商城&#xff0c;商品&#xff0c;直播&#xff0c;小黄车 等等

mysql数据库插入中文失败

有一张表&#xff0c;结构如下&#xff1a; MariaDB [test]> show create table dept; ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------…

智能仪表在铁塔行业的应用

应用场景 可应用于基站的交直流配电箱及对基站内的动力设备进行数据采集和控制。 功能 1.对多个回路进行全电参量测量&#xff0c;实现基站内各回路用电能耗的集中管理&#xff1b; 2.丰富的DI/DO输入输出&#xff0c;NTC测温&#xff0c;温湿度测量等非电参量监测&#xff…

分体工业读写器的适用场景有哪些?

工业读写器根据设计方式不同&#xff0c;可分为一体式读写器和分体式读写器&#xff0c;不同读写器特点不同&#xff0c;适用场景也不同&#xff0c;下面我们就一起来了解一下超高频分体读写器适用场景有哪些。 超高频分体读写器介绍 超高频分体读写器是一种射频识别(RFID)设…

Sass语法介绍-导入

11【Sass语法介绍-导入】 1.前言 在 CSS 中我们可以通过 import 来导入一个样式文件&#xff0c;Sass 扩展了 CSS 的 import 规则&#xff0c;使得可以导入 CSS 后缀的样式文件和 Scss 后缀的样式文件&#xff0c;并且提供了对 mixin 、函数和变量的访问。 与 CSS 的 import…

AI技术的实际应用和影响

随着人工智能技术的快速发展&#xff0c;越来越多的AI工具开始出现在我们的生活中。这些工具在各个领域都发挥着重要的作用&#xff0c;为人们带来了便利和效率。在这篇文章中&#xff0c;我们将探讨人们在使用AI工具时最喜欢的和认为最好用的工具&#xff0c;并展示AI技术的实…

【QEMU系统分析之实例篇(三十五)】

系列文章目录 第三十五章 QEMU系统仿真的机器创建分析实例 qdev_connect_gpio_out_named(lpc_dev, ICH9_GPIO_GSI) 文章目录 系列文章目录第三十五章 QEMU系统仿真的机器创建分析实例qdev_connect_gpio_out_named(lpc_dev, ICH9_GPIO_GSI) 前言一、QEMU是什么&#xff1f;二、…