imx6ull/linux应用编程学习(8)PWM应用编程(基于正点)

1.应用层如何操控PWM:

与 LED 设备一样, PWM 同样也是通过 sysfs 方式进行操控,进入到/sys/class/pwm 目录下
        这里列举出了 8 个以 pwmchipX(X 表示数字 0~7)命名的文件夹,这八个文件夹其实就对应了 I.MX6U的 8 个 PWM 控制器, I.MX6U 总共有 8 个 PWM 控制器

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

在这个目录下我们重点关注的是 export、 npwm 以及 unexport 这三个属性文件。

       npwm: 这是一个只读属性,读取该文件可

echo 0 > /sys/class/pwm/pwmchip0/export #导出 PWM1
echo 0 > /sys/class/pwm/pwmchip1/export #导出 PWM2
echo 0 > /sys/class/pwm/pwmchip2/export #导出 PWM3
echo 0 > /sys/class/pwm/pwmchip3/export #导出 PWM4
echo 0 > /sys/class/pwm/pwmchip4/export #导出 PWM5
echo 0 > /sys/class/pwm/pwmchip5/export #导出 PWM6

以得知该 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

echo 0 > /sys/class/pwm/pwmchip0/export #导出 PWM1
echo 0 > /sys/class/pwm/pwmchip1/export #导出 PWM2
echo 0 > /sys/class/pwm/pwmchip2/export #导出 PWM3
echo 0 > /sys/class/pwm/pwmchip3/export #导出 PWM4
echo 0 > /sys/class/pwm/pwmchip4/export #导出 PWM5
echo 0 > /sys/class/pwm/pwmchip5/export #导出 PWM6
导出成功后会在 pwmchipX(X 表示数字 0~7)目录下生成一个名为 pwm0 的目录

        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

例程:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
static char pwm_path[100];
static int pwm_config(const char *attr, const char *val)
{
char file_path[100];
int len;
int fd;
sprintf(file_path, "%s/%s", pwm_path, attr);
if (0 > (fd = open(file_path, O_WRONLY))) {
perror("open error");
return fd;
}
len = strlen(val);
if (len != write(fd, val, len)) {
perror("write error");
close(fd);
return -1;
}
close(fd); //关闭文件
return 0;
}
int main(int argc, char *argv[])
{
/* 校验传参 */
if (4 != argc) {
fprintf(stderr, "usage: %s <id> <period> <duty>\n",
argv[0]);
exit(-1);
}
/* 打印配置信息 */
printf("PWM config: id<%s>, period<%s>, duty<%s>\n",
argv[1], argv[2],
argv[3]);
/* 导出 pwm */
sprintf(pwm_path, "/sys/class/pwm/pwmchip%s/pwm0", argv[1]);
if (access(pwm_path, F_OK)) {//如果 pwm0 目录不存在, 则导出
char temp[100];
int fd;
sprintf(temp, "/sys/class/pwm/pwmchip%s/export", argv[1]);
if (0 > (fd = open(temp, O_WRONLY))) {
perror("open error");
exit(-1);
}
if (1 != write(fd, "0", 1)) {//导出 pwm
perror("write error");
close(fd);
exit(-1);
}
close(fd); //关闭文件
}
/* 配置 PWM 周期 */
if (pwm_config("period", argv[2]))
exit(-1);
/* 配置占空比 */
if (pwm_config("duty_cycle", argv[3]))
exit(-1);
/* 使能 pwm */
pwm_config("enable", "1");
/* 退出程序 */
exit(0);
}

        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。

,前面提到,这块imx6ull的pwm1拿去用做控制lcd背光了,而其他几路没有pwm资源,所有测不了,如果要测试pwm需要去内核禁用io,太麻烦,所以不演示了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

同样的APP为何在Android 8以后网络感觉变卡?

前言 在无线网络技术不断发展的今天&#xff0c;Wi-Fi已经成为了我们日常生活中不可或缺的一部分。无论是家庭娱乐、办公还是在线游戏&#xff0c;Wi-Fi都在提供着便捷的互联网接入服务。然而&#xff0c;在安卓8.1后&#xff0c;为了进一步延长安卓设备的待机时间。原生安卓(A…

Ubuntu18.04新安装--无网络连接、重启黑屏解决教程

一、安装Ubuntu Ubuntu安装需要U盘作为启动盘&#xff0c;在目前教新的电脑中选中GPT作为分区&#xff0c;制作启动盘&#xff0c;其中在安装双系统Ubuntu时&#xff0c;以自定义格式作为存储空间。详细安装过程以以及如何分区请参考下列链接&#xff1a;内含详细安装过程&…

不是大厂云用不起,而是五洛云更有性价比

明月代维的一个客户的大厂云境外云服务器再有几天就到期了&#xff0c;续费提醒那是提前一周准时到来&#xff0c;但是看到客户发来的续费价格截图&#xff0c;我是真的没忍住。这不就是在杀熟吗&#xff1f;就这配置续费竟然如此昂贵&#xff1f;说实话这个客户的服务器代维是…

哈哈看到这条消息感觉就像是打开了窗户

在这个信息爆炸的时代&#xff0c;每一条动态可能成为我们情绪的小小触发器。今天&#xff0c;当我无意间滑过那条由杜海涛亲自发布的“自曝式”消息时&#xff0c;不禁心头一颤——如果这是我的另一半&#xff0c;哎呀&#xff0c;那画面&#xff0c;简直比烧烤摊还要“热辣”…

Qt安装配置教程

目录 一、下载Qt二、进行安装1、点击安装包&#xff08;QT6.7版本演示&#xff09;2、注册Qt账号3、选择安装的位置4、选择对应的组件 三、新建项目1、打开Qt Creator2、创建项目3、编辑名称和地址4、选择默认的CMake或切换成qmake构建5、选择自己的编译器&#xff0c;在此选择…

ui.perfetto.dev sql 查询某个事件范围内,某个事件的耗时并降序排列

ui.perfetto.dev sql 查询某个事件范围内,某个事件的耗时并降序排列 1.打开https://ui.perfetto.dev 导入Chrome Trace Json文件2.ParallelMLP.forward下的RowParallelLinear.forward3.点击Query(SQL),在输入框中输入以下内容,按CtrlEnter,显示查询结果4.点击Show timeline,点击…

告别PS修图,设计师都在用的AI抠图工具

引言 大家好&#xff01;如果你是美工或设计师&#xff0c;肯定深知Photoshop修图的繁琐和耗时。现在有一款超方便的工具&#xff0c;让你摆脱这些问题——千鹿设计助手。它不仅是个抠图工具&#xff0c;还能通过先进的AI技术&#xff0c;让抠图变得简单快速&#xff0c;让你专…

jdk动态代理-基于反射的动态代理

JDK动态代理的示例图&#xff0c;下图的绿色箭头表示实现的关系&#xff0c;白色虚线表示依赖关系&#xff0c;target表示被ProxyFactory的target成员表示代理类对象&#xff0c;由ProxyFactory传入的Object参数初始化&#xff0c;接着调用getProxyInstance函数利用反射来返回代…

npm 淘宝镜像证书过期,错误信息 Could not retrieve https://npm.taobao.org/mirrors/node/latest

更换 npm 证书 问题描述报错原因更换步骤1 找到 nvm 安装目录2 发现证书过期3 更换新地址4 保存后&#xff0c;重新安装成功 问题描述 在使用 nvm 安装新版本时&#xff0c;未成功&#xff0c;出现报错&#xff1a; Could not retrieve https://npm.taobao.org/mirrors/node/l…

02:项目1 (按键点灯)

按键点灯 1、嘉立创EDA的简要介绍2、硬件的选型与原理图设计3、PCB设计4、下单啦 1、嘉立创EDA的简要介绍 1、EDA的基础设置 2、新建工程 2、硬件的选型与原理图设计 ①在EDA软件按下 shiftf 打开嘉立创商城&#xff0c;然后在里面选型 ②打开数据手册&#xff0c;能看到基本…

【FDTD 仿真案例解析】

平面结热电子光探测器是一种基于热电子效应的光探测器&#xff0c;其工作原理是利用光子的能量激发金属表面的热电子&#xff0c;从而产生电流。 激发光学Tamm态是指在金属-介质结界面上的电磁场分布出现共振现象&#xff0c;形成一种特殊的表面态。这种表面态具有高度局域化的…

JS(JavaScript)数据校验 表单校验-案例

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Spark join数据倾斜调优

Spark中常见的两种数据倾斜现象如下 stage部分task执行特别慢 一般情况下是某个task处理的数据量远大于其他task处理的数据量&#xff0c;当然也不排除是程序代码没有冗余&#xff0c;异常数据导致程序运行异常。 作业重试多次某几个task总会失败 常见的退出码143、53、137…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【18】认证服务02—微博社交登录

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【18】认证服务02—微博社交登录 微博社交登录图示原理前置准备实现流程完整代码 参考 微博社交登录 OAuth&#xff1a; OAuth&#xff08;开放授权&#xff09;是一个开放标准&#xff0…

qt6 通过http查询天气的实现

步骤如下&#xff1a; cmakelist 当中&#xff0c;增加如下配置 引入包 访问远端api 解析返回的数据 cmakelist 当中&#xff0c;增加如下配置&#xff0c;作用是引入Network库。 引入包 3、访问远端api void Form1::on_pushButton_clicked() {//根据URL(http://t.weather.…

6.Android逆向协议-配置FD抓包环境

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;微尘网校 上一个内容&#xff1a;5.Android逆向协议-初识HTTP和HTTPS协议 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.…

20.《C语言》——【移位操作符】

&#x1f339;开场语 亲爱的读者&#xff0c;大家好&#xff01;我是一名正在学习编程的高校生。在这个博客里&#xff0c;我将和大家一起探讨编程技巧、分享实用工具&#xff0c;并交流学习心得。希望通过我的博客&#xff0c;你能学到有用的知识&#xff0c;提高自己的技能&a…

大数据之Linux部署常用命令脚本封装

文章目录 编写集群命令执行脚本xcall集群命令执行1. 脚本需求2. 需求分析3. 脚本实现3.1 创建脚本存放目录3.2 编写xcall脚本3.3 修改脚本执行权限3.4 测试脚本 编写集群分发脚本xsync集群分发脚本1. 脚本需求2. 需求分析3. 脚本实现3.1 创建脚本存放目录3.2 编写xsync脚本3.3 …

cad由于找不到mfc140u.dll的解决方法,彻底解决mfc140u.dll丢失问题

在计算机辅助设计&#xff08;CAD&#xff09;的时候&#xff0c;我们可能会遇到各种错误和问题。其中&#xff0c;“CAD由于找不到mfc140u.dll&#xff0c;无法继续执行代码”的错误提示。这个问题可能会导致CAD无法启动运行&#xff0c;因此&#xff0c;我希望通过分享我的经…

外籍学员报到,四川眼科医院开启国际屈光手术专科医生培训

“能够来到中国、来到四川眼科医院学习&#xff0c;我真的很幸运&#xff01;”这个夏天&#xff0c;对于马来西亚眼科医生Ivan Cheng En Yoo来说&#xff0c;充满了期待和挑战。他是首位来到四川眼科医院进修学习的马来西亚籍医生&#xff0c;Ivan Cheng将在周进院长的带领下&…