当前位置: 首页 > news >正文

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,太麻烦,所以不演示了

相关文章:

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

1.应用层如何操控PWM&#xff1a; 与 LED 设备一样&#xff0c; PWM 同样也是通过 sysfs 方式进行操控&#xff0c;进入到/sys/class/pwm 目录下 这里列举出了 8 个以 pwmchipX&#xff08;X 表示数字 0~7&#xff09;命名的文件夹&#xff0c;这八个文件夹其实就对应了…...

等保2.0 实施方案

一、引言 随着信息技术的广泛应用&#xff0c;网络安全问题日益突出&#xff0c;为确保信息系统安全、稳定、可靠运行&#xff0c;保障国家安全、公共利益和个人信息安全&#xff0c;根据《网络安全法》及《信息安全技术 网络安全等级保护基本要求》&#xff08;等保2.0&#x…...

7/3 第六周 数据库的高级查询

...

ubuntu20.04安装kazam桌面屏幕录制工具

在Ubuntu 20.04上安装Kazam可以通过以下步骤进行&#xff1a; 1.打开终端&#xff1a;可以通过按下Ctrl Alt T组合键来打开终端。 2.添加PPA源&#xff1a;Kazam不再在官方Ubuntu仓库中&#xff0c;但可以通过PPA源进行安装。在终端中输入以下命令来添加PPA&#xff1a; su…...

Python应对反爬虫的策略

Python应对反爬虫的策略 概述User-Agent 伪造应对302重定向IP限制与代理使用Cookies和Session管理动态内容加载数据加密与混淆请求频率限制爬虫检测算法法律与道德考量结语 概述 在数字化时代&#xff0c;网络数据采集已成为获取信息的重要手段之一。然而&#xff0c;随着技术…...

240703_昇思学习打卡-Day15-K近邻算法实现红酒聚类

KNN(K近邻)算法实现红酒聚类 K近邻算法&#xff0c;是有监督学习中的分类算法&#xff0c;可以用于分类和回归&#xff0c;本篇主要讲解其在分类上的用途。 文章目录 KNN(K近邻)算法实现红酒聚类算法原理数据下载数据读取与处理模型构建--计算距离模型预测 算法原理 KNN算法虽…...

keil5模拟 仿真 报错没有读写权限

debug*** error 65: access violation at 0x4002100C : no write permission 修改为&#xff1a; Dialog DLL默认是DCM3.DLL Parameter默认是-pCM3 应改为 Dialog DLL默认是DARMSTM.DLL Parameter默认是-pSTM32F103VE...

力扣爆刷第158天之TOP100五连刷56-60(子集、最小栈、最长有效括号)

力扣爆刷第158天之TOP100五连刷56-60&#xff08;子集、最小栈、最长有效括号&#xff09; 文章目录 力扣爆刷第158天之TOP100五连刷56-60&#xff08;子集、最小栈、最长有效括号&#xff09;一、78. 子集二、105. 从前序与中序遍历序列构造二叉树三、43. 字符串相乘四、155. …...

高薪程序员必修课-Java中 Synchronized锁的升级过程

目录 前言 锁的升级过程 1. 偏向锁&#xff08;Biased Locking&#xff09; 原理&#xff1a; 示例&#xff1a; 2. 轻量级锁&#xff08;Lightweight Locking&#xff09; 原理&#xff1a; 示例&#xff1a; 3. 重量级锁&#xff08;Heavyweight Locking&#xff09;…...

Vue项目打包上线

Nginx 是一个高性能的开源HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理服务器。它在设计上旨在处理高并发的请求&#xff0c;是一个轻量级、高效能的Web服务器和反向代理服务器&#xff0c;广泛用于提供静态资源、负载均衡、反向代理等功能。 1、下载nginx 2、…...

算法题中常用的C++功能

文章目录 集合优先队列双端队列排序时自定义比较函数最大数值字符串追加&#xff1a;删除&#xff1a;子串&#xff1a; 元组vector查找创建和初始化赋值&#xff1a; 字典map引入头文件定义和初始化插入元素访问元素更新元素删除元素检查元素存在遍历元素int和string转换 集合…...

左扰动和右扰动

在SLAM&#xff08;Simultaneous Localization and Mapping&#xff09;中&#xff0c;使用左扰动还是右扰动主要取决于你如何定义坐标系和你希望扰动影响的姿态表示。这通常与你的坐标系选择和你正在解决的具体问题有关。 左扰动通常用于以下情况&#xff1a; 当你使用局部坐…...

【计算机网络】期末复习(2)

目录 第一章&#xff1a;概述 第二章&#xff1a;物理层 第三章&#xff1a;数据链路层 第四章&#xff1a;网络层 第五章&#xff1a;传输层 第一章&#xff1a;概述 三大类网络 &#xff08;1&#xff09;电信网络 &#xff08;2&#xff09;有线电视网络 &#xff0…...

ojdbc8-full Oracle JDBC 驱动程序的一个完整发行版各文件的功能

文章目录 1. ojdbc8.jar2. ons.jar -3. oraclepki.jar -4. orai18n.jar -5. osdt_cert.jar -6. osdt_core.jar -7. ojdbc.policy -8. README.txt -9. simplefan.jar -10. ucp.jar -11. xdb.jar - ojdbc8-full 是 Oracle JDBC 驱动程序的一个完整发行版&#xff0c;包含了连接和…...

在Linux环境下使用sqlite3时,如果尝试对一个空表进行操作(例如插入数据),可能会遇到表被锁定的问题。

在Linux环境下使用sqlite3时&#xff0c;如果尝试对一个空表进行操作&#xff08;例如插入数据&#xff09;&#xff0c;可能会遇到表被锁定的问题。这通常是因为sqlite3在默认情况下会对空表进行“延迟创建”&#xff0c;即在实际需要写入数据之前&#xff0c;表不会被真正创建…...

【目标检测】DINO

一、引言 论文&#xff1a; DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection 作者&#xff1a; IDEA 代码&#xff1a; DINO 注意&#xff1a; 该算法是在Deformable DETR、DAB-DETR、DN-DETR基础上的改进&#xff0c;在学习该算法前&#…...

一文包学会ElasticSearch的大部分应用场合

ElasticSearch 官网下载地址&#xff1a;Download Elasticsearch | Elastic 历史版本下载地址1&#xff1a;Index of elasticsearch-local/7.6.1 历史版本下载地址2&#xff1a;Past Releases of Elastic Stack Software | Elastic ElasticSearch的安装(windows) 安装前所…...

创建kobject

1、kobject介绍 kobject的全称是kernel object&#xff0c;即内核对象。每一个kobject都会对应系统/sys/下的一个目录。 2、相关结构体和api介绍 2.1 struct kobject // include/linux/kobject.h 2.2 kobject_create_and_add kobject_create_and_addkobject_createkobj…...

数据结构 - C/C++ - 树

公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 树的概念 结构特性 树的样式 树的存储 树的遍历 节点增删 二叉搜索树 平衡二叉树 树的概念 二叉树是树形结构&#xff0c;是一种非线性结构。 非线性结构&#xff1a;在二叉树中&#x…...

Linux源码阅读笔记12-RCU案例分析

在之前的文章中我们已经了解了RCU机制的原理和Linux的内核源码&#xff0c;这里我们要根据RCU机制写一个demo来展示他应该如何使用。 RCU机制的原理 RCU&#xff08;全称为Read-Copy-Update&#xff09;,它记录所有指向共享数据的指针的使用者&#xff0c;当要修改构想数据时&…...

CentOS 7下‘Development Tools’和‘开发工具’组有区别吗?实测告诉你答案

CentOS 7下‘Development Tools’与‘开发工具’的隐藏关联&#xff1a;技术细节全解析在Linux系统管理中&#xff0c;yum的软件包组功能一直是个既实用又充满谜团的领域。特别是当系统语言环境与软件包元数据语言不一致时&#xff0c;开发者们常常会遇到一个有趣的现象&#x…...

top50 BF16算力(TFLOPS) 显卡排行榜 天梯图

排名显卡型号BF16算力(TFLOPS)售价(元)单TFLOPS价格(元)1B200(SXM)45002200000488.892H200(SXM)19801200000606.063MI300X1307750000573.834H100 SXM519501100000564.105RTX PRO 6000 Blackwell1150780000678.266H100 PCIe 80GB1560850000544.877RTX 50906803400050.008A100 80…...

DeepSeek系统设计辅助:如何在48小时内完成可审计、可回滚、可压测的AI服务架构图?

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DeepSeek系统设计辅助 DeepSeek系统设计辅助模块面向架构师与后端工程师&#xff0c;提供模型能力调用、接口契约生成、异步任务编排等核心支撑能力。该模块不替代人工设计决策&#xff0c;而是通过结构…...

App Inventor蓝牙调试避坑指南:从连接失败到数据乱码,一次讲清所有常见问题

App Inventor蓝牙调试避坑指南&#xff1a;从连接失败到数据乱码的实战解决方案在移动应用开发领域&#xff0c;蓝牙通信一直是实现设备间短距离数据交换的核心技术之一。对于使用App Inventor的开发者而言&#xff0c;蓝牙模块提供了无需复杂编码即可实现无线通信的便捷途径。…...

6款高效降AI率工具 改写实力出众

写论文时反复检测出的AI痕迹总让你提心吊胆&#xff1f;别担心&#xff0c;这里整理了6款真正好用的论文降AI率工具&#xff0c;堪称应对AI生成特征的“得力助手”。它们能有效识别并消除AI生成的痕迹&#xff0c;改写能力出众&#xff0c;帮你快速降低查重率&#xff0c;顺利通…...

长期使用Taotoken聚合服务对项目月度账单的可预测性提升

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 长期使用Taotoken聚合服务对项目月度账单的可预测性提升 在AI驱动的项目开发与运营中&#xff0c;成本控制与预算规划是团队管理者…...

PentestGPT实战部署指南:AI驱动的渗透测试工作流落地

1. 这不是另一个“AI安全”的概念玩具&#xff0c;而是一套能真正跑起来的渗透测试辅助工作流“PentestGPT”这个名字刚在GitHub上出现时&#xff0c;我第一反应是点开又关掉——过去三年里&#xff0c;我见过太多打着“AI渗透”旗号的项目&#xff1a;有的只是把ChatGPT API封…...

基于ESP8266与MQTT的家庭水压自动控制系统设计与实现

1. 项目概述与核心需求解析家里水压不稳、供水时断时续&#xff0c;这大概是很多朋友都遇到过的烦心事。我所在的城市供水情况就很不理想&#xff0c;为了解决这个问题&#xff0c;我不得不自己动手&#xff0c;搭建了一套基于ESP8266微控制器的家庭水压增压与储水自动控制系统…...

终极Node.js Mock工具:Mockery入门到精通实战教程

终极Node.js Mock工具&#xff1a;Mockery入门到精通实战教程 【免费下载链接】mockery Simplifying the use of mocks with Node.js 项目地址: https://gitcode.com/gh_mirrors/mock/mockery Mockery是Node.js生态中简化Mock使用的终极工具&#xff0c;它为开发者提供了…...

【DeepSeek集成测试黄金标准】:20年专家亲授5大避坑指南与自动化落地框架

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DeepSeek集成测试黄金标准的演进与核心价值 集成测试在大语言模型工程化落地过程中已从“验证功能可用”跃迁为“保障推理一致性、上下文鲁棒性与安全边界的三位一体质量门禁”。DeepSeek系列模型&…...