linux驱动 -- PWM配置和SysFs操作方法

news2024/9/23 3:15:26

1:PWM介绍

PWM的定义为:可调节脉冲调节器,换句话来说就是一个总周期不变,占空比可调节的方波。

2:PWM的总周期和占空比、有效点平

方波:在信号领域一般分为数字信号和模拟信号,数字信号就两种状态:0和1,相互交替成为方波。

总周期:从1状态到1状态。也就是总周期为:从一个电平再回到这个电平。

占空比:有效电平占据占总周期的比例

有效电平:器件生效的电平

3:linux内核下的PWM

3.1 linux下的PWM的设备树编写方式

我所使用的开发板为RK3588S支持15路的PWM,经过裁剪之后配置三个PWM,分别为PWM7、PWM11、PWM12。

设备树编写:

&pwm7{
    pinctrl-0 = <&pwm7m0_pins>;//pwm作用的引脚
    status = "okay";
}
引脚配置:
pwm7m0_pins->GPIO0_RKPD0
pwm7m1_pins->GPIO4_RKPD4
pwm7m2_pins->GPIO1_RKPC3

额外说明:

        pwm开启后会按照从0的 ID号依次生成内核设备!

        PWM7        PWM11        PW12

                0               1                2

3.2 linux下PWM操作的中间接口

头文件:

#include "linux/pwm.h"

函数功能:向内核申请一个pwm设备,通过ID申请

函数原型:

struct pwm_device *pwm_request(
    int pwm_id,
    const char *label
);

函数参数:

        pwm_id:

                申请PWM的ID号,一般从0开始

        label:

                申请PWM使用的标签名

函数返回值:

        内核抽象出来的PWM设备结构体

        后续操作PWM都依靠这个结构体

函数功能:设置一个PWM 、总周期、占空比

函数原型:

int pwm_config(
    struct pwm_device *pwm,
    int duty_ns,
    int period_ns
)

函数参数:

        pwm:

                刚才申请得到的PWM的设备结构体

        duty_ns:

                占空周期的时间

        period_ns:

               总周期时间

函数返回值:

        成功返回0;失败返回非0

其他接口函数:

pwm_free();//释放函数

pwm_enable();//使能

pwm_disable();//失能

4:linux下SysFs下的PWM操作方法

PWM设备分别对PWM7 PWM11 PWM12

在sys系统中:

        export注册接口文件

        unexport取消注册

echo 0 > export 注册 PWM7 的通道 0
echo 0 > unexport 取消注册 PWM7 的通道 0
如果注册成功就会生成 pwm0 这个文件夹

生成pwm0就是sys下的控制接口文件

duty_cycle:占空比

enble:使能        0代表失能  1代表使能

period:总周期

polarity:极性反转;inverse 翻转的 normal正常

5:设备文件呼吸灯代码示例:

#include "linux/kernel.h"
#include "linux/module.h"
#include "linux/of.h"
#include "linux/cdev.h"
#include "linux/fs.h"
#include "linux/gpio.h"
#include "linux/of_gpio.h"
#include "linux/device.h"
#include "linux/platform_device.h"
#include "linux/miscdevice.h"
#include "asm/uaccess.h"
#include "linux/input.h"
#include "linux/irq.h"
#include "linux/interrupt.h"
#include "linux/pwm.h"
#define MAX_PWM_VALUE 100000
struct miscdevice  misc;
struct file_operations *fop;
struct pwm_device * pwm_dev;//pwm核心结构体
//打开函数
int pwm_open (struct inode *ino, struct file *f)
{
	//pwm初始化函数
	pwm_config(pwm_dev, 0,MAX_PWM_VALUE);
	//使能PWM
	pwm_enable(pwm_dev);
	return 0;
}
//出口函数
int pwm_close (struct inode *i, struct file *f)
{
	pwm_config(pwm_dev, 0,0);//清零
	pwm_disable(pwm_dev	);
	return 0;
}
ssize_t pwm_write (struct file *f, const char __user *buf, size_t size, loff_t *lof)
{
	int ret = 0;
	uint32	value =0;
	ret = copy_from_user(&value,buf,size);
	if(value > MAX_PWM_VALUE)
	{
		return -EIO;
	}
	ret =ret;
	pwm_enable(pwm_dev);
	pwm_config(pwm_dev,value,MAX_PWM_VALUE)
	return 0;
	
	
}

//加载函数
static int __init pwm_init(void)
{
	pwm_dev = pwm_request(0,"pwm_led");
	if(pwm_dev == NULL)
	{
		printk("PWM Reuqest Failed\r\n");
		return -EINVAL;
	}
	fop.open = pwm_open;
	fop.owner = THIS_MODULE;
	fop.release = pwm_close;
	fop.write = pwm_write;
	
	misc.minor = 255;
	misc.name = "pwm_led";
	misc.fops =&fop ;
	return misc_register(&misc);
	
}
//卸载函数
static void __exit pwm_exit(void)
{
	misc_deregister(&misc);
	pwm_free(pwm_dev);
}
module_init(pwm_init);
module_exit(pwm_exit);
MODULE_LICENSE("GPL");

终端控制法:

#include "stdio.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "unistd.h"#include "stdint.h"
#include "linux/input.h"
#include <stdlib.h>
#include <string.h>
struct input_event myreadvalue;
#define MAX_VALUE 10000
int main()
{
    int readvalue = 0;
    char buf[128]={0};
    system("echo 0 > /sys/class/pwm/pwmchip0/export");
    usleep(1000);
    system("echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable");
    usleep(1000);
    system("echo normal > /sys/class/pwm/pwmchip0/pwm0/polarity");
    usleep(1000);
    system("echo 10000 > /sys/class/pwm/pwmchip0/pwm0/period");
    usleep(1000);
    while(1)
    {
        printf("请输入一个占空比的值! :\r\n\t");
        scanf("%d",&readvalue);
        sprintf(buf,"echo %d > /sys/class/pwm/pwmchip0/pwm0/duty_cycle",readvalue);
        system(buf);
        memset(buf,0,128);
    }
    return 0;
}

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

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

相关文章

UML类图中的依赖,继承,和实现关系

依赖关系 依赖关系是一种使用关系&#xff0c;它是对象之间耦合度最弱的一种关系。在代码中&#xff0c;某个类通过局部变量&#xff0c;方法的参数或者对静态方法的调用来访问另外一个类的方法。 依赖关系通过带箭头的虚线表示&#xff0c;箭头从使用类指向被依赖的类 继承关…

中仕公考怎么样?函授大专可以考公吗?

函授大专学历&#xff0c;作为成人高等教育的一种形式&#xff0c;是被认证的&#xff0c;所以在绝大多数情况下&#xff0c;持有函授大专学历的个人符合公务员及事业单位岗位的报考资格。只有招聘公告中明确要求考生必须持有全日制或统招学历时&#xff0c;才不符合条件。 在…

【STM32开发指南】STM32最小系统板详解

【前言】 在单片机项目开发中&#xff0c;STM32系列微控制器因其高性能、低功耗和丰富的外设资源而备受青睐。其中&#xff0c;STM32最小系统板作为STMicroelectronics STM32系列微控制器的基础硬件平台&#xff0c;不仅简化了硬件设计&#xff0c;还极大地促进了软件开发的便…

用ChatGPT提升论文质量:改进语法、用词和行文的有效方法

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在学术写作中&#xff0c;语法、用词和行文的质量直接影响论文的可读性和学术价值。今天我们将介绍如何利用ChatGPT优化论文的语法结构、改进用词精准度以及提升行文流畅性。帮助写作者…

多线程篇(锁相关类- StampedLock(改进的读写锁)(JDK8新增))(持续更新迭代)

目录 一、前言 二、StampedLock提供的三种读写模式的锁分别如下 写锁writeLock 悲观读锁 readLock 乐观读锁 tryOptimisticRead 三、StampedLock支持这三种锁在一定条件下进行相互转换 四、案例介绍 五、知识小结 一、前言 StampedLock 是并发包里面 JDK8 版本新增的一…

线性代数 第二讲 矩阵_逆矩阵_伴随矩阵_分块矩阵_初等矩阵_矩阵的秩

矩阵 文章目录 矩阵1.矩阵的定义2.矩阵的运算法则3.特殊矩阵3.1 伴随矩阵3.2 可逆矩阵3.2.1 定义3.2.2 可逆矩阵的一些定理3.2.3 可逆矩阵公式与转置矩阵公式3.2.4 求逆矩阵 3.3 分块矩阵3.3.1 分块矩阵的运算3.3.2 分块矩阵的初等行变换&#xff08;超纲内容但要了解&#xff…

YOLOv9输出模型每一层的耗时和GFLOPs

在做一些比较实验中&#xff0c;如何更精确的查看和对比我们的改进模块时候有效&#xff0c;是否有提升&#xff0c;特别是在模型轻量化时&#xff0c;这时候我们就可以打印改进模型每一层的耗时和GFLOPS来比较不同模块的占用量。在YOLOv9中&#xff0c;打印模型每一层的耗时和…

食堂线上预约点餐系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;菜品分类管理&#xff0c;菜品管理&#xff0c;关于我们管理&#xff0c;意见反馈&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;菜品&#xff0c;购…

TPH-YOLOv5:基于Transformer预测头的改进YOLOv5,用于无人机捕获场景的目标检测

摘要 提出了TPH-YOLOv5。在YOLOv5的基础上&#xff0c;增加了一个预测头来检测不同尺度的目标。然后用Transformer Prediction Heads&#xff08;TPH&#xff09;代替原有的预测头&#xff0c;探索自注意机制的预测潜力。还集成了卷积块注意力模型&#xff08;CBAM&#xff09;…

2D 智慧水务厂:引领水资源数字化管理

图扑 2D 智慧水务厂通过数字监控和数据分析&#xff0c;实现高效水资源管理与优化&#xff0c;显著提升运营效率。

【开发心得】筑梦上海:项目风云录(2)

特别声明 这个长篇终于开了头&#xff0c;工作的节奏也不能耽搁&#xff0c;暂时也不知道何时才能收尾。人生漫漫&#xff0c;即使没有雷军们的成功&#xff0c;但是也有自己的一些小确幸。 特别声明一下&#xff0c;虽然这个长篇是基于真实经历&#xff0c;但其中有些内容纯…

Python优化算法22——自适应变异麻雀搜索优化算法(AMSSA)

科研里面优化算法都用的多&#xff0c;尤其是各种动物园里面的智能仿生优化算法&#xff0c;但是目前都是MATLAB的代码多&#xff0c;python几乎没有什么包&#xff0c;这次把优化算法系列的代码都从底层手写开始。 需要看以前的优化算法文章可以参考&#xff1a;Python优化算…

四、Selenium操作指南(一)

文章目录 一、基本用法&#xff08;一&#xff09;初始化浏览器对象&#xff08;二&#xff09;访问页面&#xff08;三&#xff09;设置浏览器大小&#xff08;四&#xff09;刷新页面&#xff08;五&#xff09;前进后退 二、获取页面基础属性三、定位页面元素&#xff08;一…

30Kg载重1小时长续航油电混动无人机技术详解

关于30Kg载重、1小时长续航的油电混动无人机技术&#xff0c;我们可以从以下几个方面进行详细解析&#xff1a; 一、动力系统 1. 油电混合技术 油电混合优势&#xff1a;油电混合无人机结合了燃油发动机的高能量密度和电动机的稳定性和精确控制性&#xff0c;能够在长时间飞…

力扣452-用最少数量的箭引爆气球(Java详细题解)

题目链接&#xff1a;452. 用最少数量的箭引爆气球 - 力扣&#xff08;LeetCode&#xff09; 前情提要&#xff1a; 因为本人最近都来刷贪心类的题目所以该题就默认用贪心方法来做。 贪心方法&#xff1a;局部最优推出全局最优。 如果一个题你觉得可以用局部最优推出全局最…

PCL-直通滤波

本篇内容&#xff1a; 讲解直通滤波的作用通过pcl实现直通滤波 效果&#xff1a; 1 主要原理 点云数据通常包含x、y、z三个维度的数据&#xff0c;用户指定维度、范围后&#xff0c;直通滤波过滤或保留该范围内的所有点云 假设我指定维度’y’&#xff0c;范围&#xff08;…

华为OD机试真题 - 字符串加解密(Java/Python/JS/C/C++ 2024 D卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Java/Python/JS/C/C++)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX…

如何让“相信相信的力量”帮你多赚100万

公门洞开纳百川 众心逐梦越千山 号召引领潜力绽 心觉潜意识无间 我们经常听到这句话&#xff1a;相信相信的力量 为什么要相信相信的力量 相信是什么意思 相信的力量又是什么意思 我估计99%的人不知道这句话的底层逻辑是什么 如果你悟透了&#xff0c;你的并且践行了&…

数据结构之稀疏数组

稀疏数组 特殊的数据结构&#xff0c;其特点是大部分元素为同一值。 适用场景 处理方式 以二维数组为例&#xff1a; ● 遍历原始二维数组&#xff0c;查询出不同的值 ● 稀疏数组列数固定为3 ● 第一行记录原始二维数组的行数、列数、不同值的个数 ● 第二行开始记录不同值的…

Python优化算法21——混沌反馈共享和群体协同效应的蝴蝶优化算法(CFSBOA)

科研里面优化算法都用的多&#xff0c;尤其是各种动物园里面的智能仿生优化算法&#xff0c;但是目前都是MATLAB的代码多&#xff0c;python几乎没有什么包&#xff0c;这次把优化算法系列的代码都从底层手写开始。 需要看以前的优化算法文章可以参考&#xff1a;Python优化算…