首页 > 系统相关 >Linux驱动学习之PWM

Linux驱动学习之PWM

时间:2024-08-30 14:54:55浏览次数:14  
标签:PWM struct linux include 占空比 Linux device 驱动 pwm

PWM介绍

他就是一个总周期不变 占空比可调制的方波!

PWM的基础知识

占空比:有效电平/周期

周期:周期不用多说,高中正弦,余弦波都学过。

分辨率:最小占空比(如把周期分为10份,那分辨率就是10%)

Linux下的pwm

Linux内核已经集成了pwm底层部分初始化,我们所要做的就是利用他给的接口,设置占空比,周期以及时钟极性,然后使能pwm就行。

  • 修改设备树

这样Linux就会识别pwm,并且做部分初始化。

 

Linux 下 PWM 操作的中间层接口

struct pwm_device *pwm_request(int pwm, const char *label)
struct pwm_device *devm_pwm_get(struct device *dev, const char *con_id)

参数1:pwmID,

参数2:标签,原则上随便给

返回值:pwm设备结构体。(所有操作都要基于这个结构体)

下方函数是平台设备总线函数。 

可以通过state设置占空比,周期,极性,是否使能

 

  • pwm参数设置 
int pwm_config(struct pwm_device *pwm, int duty_ns,int period_ns)

参数一:pwm结构体,

参数二:有效电平持续时间

参数三:周期

返回值:成功0,失败非0 

 关于参数设置,也可以直接结构体赋值(包括使能)

pwm_free();//释放
pwm_enable();
pwm_disable();

这三个函数不必多说,字面意思。参数为pwm结构体

返回值:成功0,失败非0 

  • 其他函数 
  • //设置占空比
    void pwm_set_duty_cycle(struct pwm_device *pwm, unsigned int duty) 
    //设置周期
    void pwm_set_period(struct pwm_device *pwm, u64 period)
    //获得占空比
    u64 pwm_get_duty_cycle(const struct pwm_device *pwm)
    //获得周期
     u64 pwm_get_period(const struct pwm_device *pwm)
    //获得极性
     enum pwm_polarity pwm_get_polarity(const struct pwm_device *pwm)
    //获得占空比,周期,极性,是否是能
    void pwm_get_state(const struct pwm_device *pwm,struct pwm_state *state)
    

    函数非常多,我们只用常用的几个就行了

 

阅读这些函数就能发现,内部也是直接结构体赋值操作,我不能理解的是,竟然没有给占空比赋值的函数。 

 示例代码

#include "linux/pwm.h"
#include "linux/device.h"
#include "linux/device/class.h"
#include "linux/export.h"
#include "linux/fs.h"
#include "linux/kdev_t.h"
#include "linux/module.h"
#include "linux/cdev.h"
#include "linux/uaccess.h"

static struct pwm_device *pwm;

dev_t dev;  
struct cdev *cdev;
struct class *cls;
int major;
uint32_t value;
ssize_t write (struct file *f, const char __user *buff, size_t size, loff_t *offt)
{
    int ret=copy_from_user(&value,buff,size);
    if(ret)
    {
        return -1;
    }
    pwm_config(pwm,value,1000000);
    pwm_enable(pwm);
    return 0;
}
struct file_operations fops={
    .owner =THIS_MODULE,
    .write=write,
};
static int __init pwm_start(void)
{
    major=register_chrdev(0,"led_pwm",&fops);
    pwm=pwm_request(0,"pwm");
    pwm->state.polarity=0;      //设置极性
    printk("%d\r\n",pwm->state.polarity);
    cls=class_create(THIS_MODULE, "led_pwm_class");
    device_create(cls,NULL,MKDEV(major,0), NULL, "led_pwm");
    return 0;
}
static void __exit pwm_stop(void)
{

}
module_init(pwm_start);
module_exit(pwm_stop);
MODULE_LICENSE("GPL");

 

标签:PWM,struct,linux,include,占空比,Linux,device,驱动,pwm
From: https://blog.csdn.net/m0_57485149/article/details/141717166

相关文章

  • Linux驱动学习之input子系统
    简介input子系统就是管理输入的子系统,和pinctrl、gpio子系统一样,都是Linux内核针对某一类设备而创建的框架。按键、鼠标、键盘、触摸屏等都属于输入设备,linux内核为此专门做了一个叫做input子系统的框架来处理输入事件。输入设备本质上还是字符设备,只是在此基础上套上了......
  • 修改 Linux 默认 Shell 用 chsh -s /bin/zsh 命令不生效,提示 chsh: Shell not changed
    我想现在应该有很多人都已经使用zsh作为默认的Shell了,尤其是搭配oh-my-zsh之后,真是好用得飞起。一般,我们在切换系统默认的Shell的时候,都会使用 chsh-s/bin/zsh 命令来进行修改。今天我遇到一个问题,在某台老服务器上,使用这个命令无法修改,具体原因未知。始终提示——chsh:She......
  • Linux日志的查看方法
    使用cat命令:显示文件内容,适合快速查看文件开头部分或结合管道命令如grep进行过滤。cat/var/log/syslog|greperror使用tail命令:查看文件末尾部分,常用于查看最新的日志信息。-f选项可实时跟踪日志更新。tail-n50/var/log/syslogtail-f/var/log/syslog使用head......
  • 安全:linux禁止响应ping,不使用防火墙
    一,永久性关闭响应ping查看默认是否允许ping:[root@bloggsapi]#cat/proc/sys/net/ipv4/icmp_echo_ignore_all0 说明:(0表示允许,1表示禁止)编辑sysctl.conf[root@bloggsapi]#vi/etc/sysctl.conf增加一行:#ignorepingnet.ipv4.icmp_echo_ignore_all=1使生效:[root......
  • 世微 AP9195 7-24V 大功率升压恒流驱动芯片 LED照明与控制器方案
    概述AP9195是一款高效率、高精度的升压型大功率LED灯恒流驱动控制芯片。AP9195内置高精度误差放大器,固定关断时间控制电路,恒流驱动电路等,特别适合大功率、多个高亮度LED灯串的恒流驱动。AP9195通过调节外置的电流采样电阻,能控制高亮度LED灯的驱动电流,使LED灯亮......
  • Linux中cd命令的基本用法!
    cd命令是Linux中最常见的命令之一,全拼changedirectory,其命令主要用于切换当前工作目录,本篇文章为大家介绍一下Linux中cd命令的常见用法,一起来看看吧。常见的cd命令用法:1、进入当前工作目录下的目录:cd./2、进入其他目录:cd/home/user/documents/3、......
  • linux系统加固一般包含那些方面?
    账户管理(1)禁用或删除无用账号:减少系统中不必要的用户账户数量,降低安全风险。(2)加强密码策略:确保密码强度足够,定期更换密码。(3)限制root登录:尽量避免直接使用root账户登录,而是使用sudo 或 su 命令切换到root用户。(4)最小权限原则:确保用户仅具有完成任务所需的最低权限。系统配......
  • 打造 LLMOps 时代 Prompt 数据驱动引擎
    导读本次分享的主题是“打造LLMOps时代的Prompt数据驱动引擎”。其中LLMOps想要表达的概念是LLMforAIOps。AIOps概念提出至少已有四年,从去年开始,在学术界出现了LLMOps的趋势,大家都在想把LLM用于AIOps来做运维,但中间会遇到一些挑战。本文将重点探讨在Promp......
  • PageOffice6国产Linux系统最简集成代码(Asp.Net)
    本文描述了PageOffice产品在普通的Asp.Net项目中如何集成调用。PageOffice国产版:支持信创系统,支持银河麒麟V10和统信UOS,支持X86(intel、兆芯、海光等)、ARM(飞腾、鲲鹏、麒麟等)、longarch芯片架构。新建Asp.Net项目:PageOffice6-Net-Simple在您的web项目的“依赖项-包-管理NuGet......
  • Linux--实现U盘,SD卡的自动挂载
    1.编辑/etc/init.d/rsC或S10mdev文件在/etc/init.d/rsC或S10mdev中加入以下语句:echo/sbin/mdev>/proc/sys/kernel/hotplug当有热插拔事件产生时,内核会调用/proc/sys/kernel/hotplug文件里指定的应用程序来处理热插拔事件。把/sbin/mdev写到/proc/sys/kernel/hotplug文件......