Linux-PWM应用编程

本章我们将学习如何对开发板上的 PWM 设备进行应用编程。

本章将会讨论如下主题内容。

⚫ 应用层 PWM 编程介绍;

⚫ PWM 测试。

应用层如何操控 PWM

与 LED 设备一样,PWM 同样也是通过 sysfs 方式进行操控,进入到/sys/class/pwm 目录下,如下所示:

这里列举出了 8 个以 pwmchipX(X 表示数字 0~7)命名的文件夹,这八个文件夹其实就对应了 I.MX6U的 8 个 PWM 控制器,I.MX6U 总共有 8 个 PWM 控制器,大家可以通过查询 I.MX6U 参考手册得知。

我们随便以其中一个为例,进入到 pwmchip0 目录下:

在这个目录下我们重点关注的是 export、npwm 以及 unexport 这三个属性文件,下面一一进行介绍:

npwm:这是一个只读属性,读取该文件可以得知该 PWM 控制器下共有几路 PWM 输出,如下所示:

I.MX6U 每个 PWM 控制器只有 1 路 PWM 输出,所以总共有 8 路 PWM,分别对应 I.MX6U 的PWM1~PWM8 这 8 路输出(pwmchip0 对应 PWM1,pwmchip1 对应 PWM2,以此类推,开发板出厂系统中,PWM1 已经被用作 LCD 背光控制了,应用层不能直接对它进行控制了;而其它 PWM 均不能使用,原因在于 I/O 资源不够,为了满足板子上其它外设对 I/O 引脚的需求,取舍情况下只能如此!)。

export:与 GPIO 控制一样,在使用 PWM 之前,也需要将其导出,通过 export 属性进行导出,以下所示:

echo 0 > export

0 表示一个编号,注意,每个 PWM 控制器(pwmchipX)下,使用 export 属性文件导出 PWM 时,编号都是从 0 开始;因为 I.MX6U 每个控制器都只有一路 PWM,所以都只能使用编号 0,如下所示:

导出成功后会在 pwmchipX(X 表示数字 0~7)目录下生成一个名为 pwm0 的目录,如图 24.1.4 所示,稍后介绍。

unexport:将导出的 PWM 删除。当使用完 PWM 之后,我们需要将导出的 PWM 删除,譬如:

echo 0 > unexport

写入到 unexport 文件中的编号与写入到 export 文件中的编号是相对应的;需要注意的是,export 文件和 unexport 文件都是只写的、没有读权限。

如何控制 PWM

通过 export 导出之后,便会生成 pwm0 这个目录,我们进入到该目录下看看:

该目录下也有一些属性文件,我们重点关注 duty_cycle、enable、period 以及 polarity 这四个属性文件,接下来一一进行介绍。

enable:可读可写,写入"0"表示禁止 PWM;写入"1"表示使能 PWM。读取该文件获取 PWM 当前是禁止还是使能状态。

echo 0 > enable #禁止 PWM 输出
echo 1 > enable #使能 PWM 输出

通常配置好 PWM 之后,再使能 PWM。

polarity:用于设置极性,可读可写,可写入的值如下:

"normal":普通;
"inversed":反转;echo normal > polarity #默认极性
echo inversed > polarity #极性反转

很多 SoC 的 PWM 外设其硬件上并不支持极性配置,所以对应的驱动程序中并未实现这个接口,应用层自然也就无法通过 polarity 属性文件对 PWM 极性进行配置,ALPHA/Mini I.MX6U 开发板出厂系统便是如此!

period:用于配置 PWM 周期,可读可写;写入一个字符串数字值,以 ns(纳秒)为单位,譬如配置 PWM 周期为 10us(微秒):

echo 10000 > period #PWM 周期设置为 10us(10 * 1000ns)

duty_cycle:用于配置 PWM 的占空比,可读可写;写入一个字符串数字值,同样也是以 ns 为单位,譬如:

echo 5000 > duty_cycle #PWM 占空比设置为 5us

更多待补充。

编写应用程序

通过上面的介绍,我们已经知道在应用层如何去使用 PWM 外设了,本小节我们来编写一个简单的测试代码,来控制开发板上的 PWM 外设,示例代码如下所示:

本例程源码对应的路径为:开发板光盘->11、Linux C 应用编程例程源码->24_pwm->pwm.c。

main()函数中,首先对传参进行校验,执行该应用程序的时候需要用户传入 3 个参数,分别是编号(0、1、2、3 等,分别表示 I.MX6U 的 PWM1、PWM2、PWM3…)、周期(以 ns 为单位)、PWM 占空比(以ns 为单位)。譬如:

./testApp 0 500000 250000

接下来需要导出 pwm,首先使用 access()函数判断 pwm0 目录是否存在,如果存在表示 pwm 已经导出,如果不存在,则表示未导出,那么就需要通过 export 文件将其导出。

导出成功之后,接着配置 PWM 周期、占空比,最后使能 PWM。

编译示例代码:

在开发板上测试

将上小节编译得到的可执行文件拷贝到开发板 Linux 系统/home/root 目录下,如下所示:

前面提到了,开发板出厂系统没法使用 PWM,如果大家想要测试 PWM,可以对出厂系统的内核源码进行配置、需修改设备树,禁用 LCD 和 backlight 背光设备(status 属性设置为 disabled 即可),修改完之后重新编译设备树,用编译得到的设备树镜像文件(dtb 文件)替换掉开发板启动文件中的 dtb 文件。也可以参考《I.MX6U 嵌入式 Linux 驱动开发指南》第七十三章内容,自行配置 PWM。

这里笔者告诉大家一个简单地方法,不用重新编译设备树文件,直接把禁用 LCD 和 backlight 背光设备,将 PWM1 腾出来给我们测试使用,直接操作呢?

具体参考正点原子相关内容,此处不赘述。

执行上小节编译得到的可执行文件:

本实验测试的是 PWM1,开发板出厂系统已经将 PWM1 输出绑定到了 GPIO1_IO08 引脚(也就是 LCD背光引脚),该引脚已经通过开发板上的扩展口引出,如下所示:

Mini 开发板可以通过背面丝印标注的名称或原理图进行确认。

接下来使用示波器来检测 GPIO1_IO08 引脚输出的 PWM 波形,如下所示:

此时 GPIO1_IO08 引脚输出了 PWM 波形,其周期为 500us(也就是 500000ns),对应的频率为 2KHz,占空比为 50%,与我们配置的情况是一样的。

本章内容到此结束!

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Seaborn | 绘制数据分布的两个函数distplot和countplot

distplot 和 countplot 是 seaborn(Seaborn)库中用于绘制数据分布的两个函数,它们各自有不同的用途和特点: 1. distplot(分布图) distplot 函数用于绘制单变量的分布图。它可以显示数据的直方图&#xff…

网络原理 网络协议栈

POSIX API与网络协议栈 unix有不同的衍生版本,针对不同的版本,通过Posix定义了一套标准的操作系统接口API,使得不同的开发版本可以使用相同的API调用,具有可移植性。 网络连接相关API: 客户端 socket() bind() con…

java注解(二):注解的解析以及应用场景、用注解和反射模拟junit框架代码演示

目录 1、什么是注解的解析? 2、解析注解的案例 1、自定义一个注解 2、在类和方法上使用自己定义的注解 3、解析注解 3、模拟Junit框架案例 1、自定义一个MyTest注解 2、定义一个测试类,使用自定义的注解 3、写一个启动类 本文章主要讲解什么是注…

【华科X地平线】DiffusionDrive:端到端截断扩散模型

论文: https://arxiv.org/pdf/2411.14499 代码: https://github.com/hustvl/DiffusionDrive 0. 摘要 最近,扩散模型作为一种强大的生成式技术,已经出现在机器人策略学习领域,能够建模多模态动作分布。利用其进行端到端自动驾驶的能力是一个…

HarmonyOS 5.0应用开发——Ability与Page数据传递

【高心星出品】 文章目录 Ability与Page数据传递Page向Ability传递数据Ability向Page传递数据 Ability与Page数据传递 基于当前的应用模型,可以通过以下几种方式来实现UIAbility组件与UI之间的数据同步。 使用EventHub进行数据通信:在基类Context中提供…

【unity框架开发10】从零手搓一个UI管理器/UI框架,自带一个提示界面,还有自带DOTween动画效果(2024/10/10修改补充)

最终效果 文章目录 最终效果前言UI组件和布局的基础使用UI管理器1、新增UI面板层枚举2、初始化2.1、用代码创建画布2.2、用代码创建UI面板的父物体层2.3、代码添加EventSystem物体 3、ShowPanel显示面板方法4、HidePanel隐藏面板的方法5、CloseUI关闭界面的方法6、UI界面基类 测…

智能指针【C++11】

文章目录 智能指针std::auto_ptr std::unique_ptrstd::shared_ptrstd::shared_ptr的线程安全问题std::weak_ptr 智能指针 std::auto_ptr 管理权转移 auto_ptr是C98中引入的智能指针,auto_ptr通过管理权转移的方式解决智能指针的拷贝问题,保证一个资源…

Win11 24h2 不能正常ensp

Win11 24h2 不能正常ensp 因为Win11 24h2的内核大小更改,目前virtualbox在7.1.4中更新解决了。而ensp不支持5.2.44之后的virtualbox并已停止维护,不再进行5.2.44修复,virtualbox 5.2.24的ntdll文件sizeofimage问题,此问题导致ens…

使用GO--Swagger生成文档

概述 在前后端分离的项目中,后端配置swagger可以很好的帮助前端人员了解后端接口参数和数据传输。go-swagger 是一个功能全面且高性能的Go语言实现工具包,用于处理Swagger 2.0(即OpenAPI 2.0)规范。它提供了丰富的工具集&#x…

沃德云商协系统微信小程序PHP+Uniapp

“多组织”的云服务平台,打造总商会、总协会、总校友会、工商联等多组织无障碍沟通合作平台,让各大分会、各大分校友会、分组织实现轻松管理,线上宣传展示、商机挖掘、会员管理、会员服务、跨界交流等, 借助沃德云商协平台系统,让…

网站打开速度测试工具:互联网优化的得力助手

在信息飞速流转的互联网时代,网站如同企业与用户对话的窗口,其打开速度直接关乎用户体验,乃至业务的成败。所幸,一系列专业的网站打开速度测试工具应运而生,它们宛如幕后的技术侦探,精准剖析网站性能&#…

shell脚本实战案例

文章目录 实战第一坑功能说明脚本实现 实战第一坑 实战第一坑:在Windows系统写了一个脚本,比如上面,随后上传到服务,执行会报错 原因: 解决方案:在linux系统touch文件,并通过vim添加内容&…

Face2QR:可根据人脸图像生成二维码,还可以扫描,以后个人名片就这样用了!

今天给大家介绍的是一种专为生成个性化二维码而设计的新方法Face2QR,可以将美观、人脸识别和可扫描性完美地融合在一起。 下图展示为Face2QR 生成的面部图像(第一行)和二维码图像(第二行)。生成的二维码不仅忠实地保留…

数据结构---队列(Queue)

1. 简介 队列(Queue)是一种常用的数据结构,它遵循先进先出(FIFO,First In First Out)的原则。这意味着第一个进入队列的元素将是第一个被移除的元素。队列在计算机科学中有着广泛的应用,比如任…

玩游戏没有flash插件的解决方案(No Flash)

一、概述 在网页游戏开发领域,Flash和H5是两种主流的技术。Flash游戏曾经占据主导地位,但随着HTML5技术的发展和浏览器对Flash支持的逐渐减少,H5游戏逐渐成为主流。本教程将详细介绍Flash和H5的区别,并提供将Flash游戏转换为H5游戏…

如何查看电脑的屏幕刷新率?

1、按一下键盘的 win i 键,打开如下界面,选择【系统】: 2、选择【屏幕】-【高级显示设置】 如下位置,显示屏幕的刷新率:60Hz 如果可以更改,则选择更高的刷新率,有助于电脑使用起来界面更加流…

新书速览|循序渐进Node.js企业级开发实践

《循序渐进Node.js企业级开发实践》 1 本书内容 《循序渐进Node.js企业级开发实践》结合作者多年一线开发实践,系统地介绍了Node.js技术栈及其在企业级开发中的应用。全书共分5部分,第1部分基础知识(第1~3章)&#xf…

AUTOSAR AP和CP的安全要求规范(Safety Req)详细解读

一、规范的编制的背景原因 编制该规范的原因 确保系统安全性和可靠性 随着汽车电子系统日益复杂,功能不断增加,对安全性和可靠性的要求也越来越高。该规范为AUTOSAR平台在安全执行、配置、更新、信息交换、数据处理等多方面制定了明确要求,…

数仓技术hive与oracle对比(四)

问题处理 sqoop导入异常 将oracle数据库中的表,用sqoop导入hive时,如果表中字段值含有“,”,会导致导入hive后,每一行所有字段的内容都放在了第一个字段,其他字段均没有值。这是因为hive底层是以文件的形…

流网络等价性证明:边分解后的最大流保持不变

流网络等价性证明:边分解后的最大流保持不变 问题描述证明思路伪代码C 代码实现解释问题描述 在流网络中,证明将一条边分解为两条边所得到的是一个等价的网络。具体来说,假设流网络 $ G $ 包含边 $ (u, v) $,我们以如下方式创建一个新的流网络 $ G’ $: 创建一个新结点 $…