Linux PWM 开发指南

news/2024/4/19 8:51:08/文章来源:https://blog.csdn.net/thisway_diy/article/details/129178540

Linux PWM 开发指南

1 概述

1.1 编写目的

介绍 PWM 模块的详细设计方便相关人员进行 PWM 模块的代码设计开发。

1.2 使用范围

适用于 Linux-3.10,linux-4.4 和 Linux-4.9 内核,Linux-5.4 内核。

1.3 相关人员

PWM 驱动的开发人员/维护人员等

2 术语及概念

2.1 术语定义及缩略语

术语解释说明
Sunxi指 Allwinner 的一系列 SOC 硬件平台
频率PWM 的频率决定了所模拟电平的平滑度(逼真度),人耳感知的频率范围为 20Hz-16Khz,注意 PWM 的频率不要落在这个区间
占空比决定了一个周期内 PWM 信号高低的比例,进而决定了一个周期内的平均电压,也就是所模拟的电平的电压
极性决定了是高占空比的信号输出电平高,还是低占空比信号输出电平高。假设一个信号 的占空比为 100%,如果为正常极性,则输出电平最大,如果为翻转的极性,则输出 电平为 0
开关控制 PWM 信号是否输出
PWM对电机等硬件需要两路脉冲信号来控制其正常运转,一般两路极性相关,频率,占空比 参数相同的 PWM 构成一个 PWM 对
PWM死区控制时间大功率电机,变频器等由大功率管,IGBT 等元件组成 H 桥或 3 相桥,每个桥的上 半桥和下半桥是绝对不能导通的,在 PWM 信号驱动这些元件时,往往会由于没有延 迟而造成未关断某路半桥,这样会造成功率元件的损坏,在 PWM 中加入死区时间的 控制即是让上半桥关断后,自动插入一个事件,延迟后再打开下半桥

2.2 概念阐述

  1. 脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的 使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。
    1. PWM 模块属于 PWM 子系统,会调用 PWM 子系统的相关接口(详情可以查看 PWM 子系 统知识)

3 模块描述

3.1 模块功能

image-20221120190940471

图 3-1: 模块功能

不同平台上拥有不同个数的 PWM 通道,其中两个为一个 PWM 对(平台通道数不相同,PWM 对也就不相同,具体细节可以查看对应方案的 spec)。其中 PWM 具有以下特点:

• 支持脉冲,周期和互补对输出 • 支出捕捉输入

• 带可编程死区发生器,死区时间可控

• 0-24M/100M 输出频率范围。0%-100% 占空比可调,最小分辨率 1/65536

• 支持 PWM 输出和捕捉输入产生中断

3.2 模块位置

PWM 模块属于硬件驱动层,直接与硬件通信

3.3 模块配置

3.3.1 linux-4.9

在 linux-4.9 中, 在命令行中进入内核根目录,执行 make ARCH=arm(arm64) menuconfig 进入配置主界面,并按以下步骤操作:

  1. 首先,选择 Device Drivers 选项进入下一级配置,如下图所示:
  2. image-20221120191004435
图 3-2: Device Drivers
  1. 选择 Pulse-Width Modulation (PWM) Support 进入下一步配置,如下图所示:

image-20221120191036989

图3-3: Pulse-Width Modulation (PWM) Support

3.选择 SUNXI PWM SELECT 进入下一步配置,如下图所示:

image-20221120191124148

图3-4: SUNXI PWM SELECT

4.选择 Sunxi Enhance PWM support 配置

image-20221120191147248

图 3-5: Sunxi Enhance PWM support

在 4.9 内核选择该配置,选择的是对应目录中的 pwm-sunxi-new.c 文件。也可以有以下配置; 在第 3 步中直接选择 Allwinner PWM support 选项,选择的是对应目录中的 pwm-sun4i.c 文件

在第 4 步中选择 Sunxi PWM Support 选项,选择的是对应目录中的 pwm-sunxi.c 文件

3.3.2 linux-5.4

linux5.4 平台中, 在命令行中进入内核根目录,执行./build.sh menuconfig 进入配置主界面, 并按以下步骤操作:

  1. 首先,选择 Device Drivers 选项进入下一级配置,如下图所示:

    image-20221120191213928

    图 3-6: Device
  2. 选择 Pulse-Width Modulation (PWM) Support 进入下一步配置,如下图所示

    image-20221120191231809

    图 3-7: Pulse-Width Modulation (PWM) Suppor
  3. 选择 SUNXI PWM SELECT 进入下一步配置,如下图所示:

    image-20221120191247355

    图3-8: SUNXI PWM SELECT
  4. 选择 Sunxi PWM group support 配置

    image-20221120191310080

    图3-9: Sunxi PWM group support

3.4 设备树配置

3.4.1 linux-4.9

PWM 模块在设备树中的配置如下所示:

	pwm: pwm@0300a000 { ompatible = "allwinner,sunxi-pwm"; reg = <0x0 0x0300a000 0x0 0x3c>; //寄存器地址配置 pwm-number = <1>; //pwm的个数 pwm-base = <0x0>; //pwm的起始序号 pwms = <&pwm0>, <&pwm1>; }; s_pwm: s_pwm@0300a000 { compatible = "allwinner,sunxi-s_pwm"; reg = <0x0 0x0300a000 0x0 0x3c>; pwm-number = <1>; pwm-base = <0x10>; pwms = <&spwm0>; };

注意,如果在模块配置中选择了 Sunxi PWM support 选项 (具体参数可以查看相关源文件),则 需要配置以下设备树:

	pwm0: pwm0@01c23400 { compatible = "allwinner,sunxi-pwm0"; pinctrl-names = "active", "sleep"; reg_base = <0x01c23400>; reg_peci_offset = <0x00>; reg_peci_shift = <0x00>; reg_peci_width = <0x01>; reg_pis_offset = <0x04>; reg_pis_shift = <0x00>; reg_pis_width = <0x01>; reg_crie_offset = <0x10>; reg_crie_shift = <0x00>; reg_crie_width = <0x01>; reg_cfie_offset = <0x10>; reg_cfie_shift = <0x01>; reg_cfie_width = <0x01>; reg_cris_offset = <0x14>; reg_cris_shift = <0x00>; reg_cris_width = <0x01>; reg_cfis_offset = <0x14>; reg_cfis_shift = <0x01>; reg_cfis_width = <0x01>; reg_clk_src_offset = <0x20>; reg_clk_src_shift = <0x07>;reg_clk_src_width = <0x02>;reg_bypass_offset = <0x20>;reg_bypass_shift = <0x05>;reg_bypass_width = <0x01>;reg_clk_gating_offset = <0x20>;reg_clk_gating_shift = <0x04>;reg_clk_gating_width = <0x01>;reg_clk_div_m_offset = <0x20>;reg_clk_div_m_shift = <0x00>;reg_clk_div_m_width = <0x04>;reg_pdzintv_offset = <0x30>;reg_pdzintv_shift = <0x08>;reg_pdzintv_width = <0x08>;reg_dz_en_offset = <0x30>;reg_dz_en_shift = <0x00>;reg_dz_en_width = <0x01>;reg_enable_offset = <0x40>;reg_enable_shift = <0x00>;reg_enable_width = <0x01>;reg_cap_en_offset = <0x44>;reg_cap_en_shift = <0x00>;reg_cap_en_width = <0x01>;reg_period_rdy_offset = <0x60>;reg_period_rdy_shift = <0x0b>;reg_period_rdy_width = <0x01>;reg_pul_start_offset = <0x60>;reg_pul_start_shift = <0x0a>;reg_pul_start_width = <0x01>;reg_mode_offset = <0x60>;reg_mode_shift = <0x09>;reg_mode_width = <0x01>;reg_act_sta_offset = <0x60>;reg_act_sta_shift = <0x08>;reg_act_sta_width = <0x01>;reg_prescal_offset = <0x60>;reg_prescal_shift = <0x00>;reg_prescal_width = <0x08>;reg_entire_offset = <0x64>;reg_entire_shift = <0x10>;reg_entire_width = <0x10>;reg_active_offset = <0x64>;reg_active_shift = <0x00>;reg_active_width = <0x10>;
};

PWM 模块在 sys_config.fex 的配置如下所示:

    [pwm0]pwm_used = 1pwm_positive = port:PB2<3><0><default><default>[pwm0_suspend]pwm_positive = port:PB2<7><0><default><default>

3.4.2 linux-5.4

PWM 模块在设备树中的配置如下所示:

    pwm: pwm@2000c00 {#pwm-cells = <0x3>;compatible = "allwinner,sunxi-pwm";reg = <0x0 0x02000c00 0x0 0x400>;clocks = <&ccu CLK_BUS_PWM>;resets = <&ccu RST_BUS_PWM>;pwm-number = <8>;pwm-base = <0x0>;sunxi-pwms = <&pwm0>, <&pwm1>, <&pwm2>, <&pwm3>, <&pwm4>,<&pwm5>, <&pwm6>, <&pwm7>;};pwm0: pwm0@2000c10 {compatible = "allwinner,sunxi-pwm0";pinctrl-names = "active", "sleep";reg = <0x0 0x02000c10 0x0 0x4>;reg_base = <0x02000c00>;};pwm1: pwm1@2000c11 {compatible = "allwinner,sunxi-pwm1";pinctrl-names = "active", "sleep";reg = <0x0 0x02000c11 0x0 0x4>;reg_base = <0x02000c00>;};pwm2: pwm2@2000c12 {compatible = "allwinner,sunxi-pwm2";pinctrl-names = "active", "sleep";reg = <0x0 0x02000c12 0x0 0x4>;reg_base = <0x02000c00>;};pwm3: pwm3@2000c13 {compatible = "allwinner,sunxi-pwm3";pinctrl-names = "active", "sleep";reg = <0x0 0x02000c13 0x0 0x4>;reg_base = <0x02000c00>;};pwm4: pwm4@2000c14 {compatible = "allwinner,sunxi-pwm4";pinctrl-names = "active", "sleep";reg = <0x0 0x02000c14 0x0 0x4>;reg_base = <0x02000c00>;};pwm5: pwm5@2000c15 {compatible = "allwinner,sunxi-pwm5";pinctrl-names = "active", "sleep";reg = <0x0 0x02000c15 0x0 0x4>;reg_base = <0x02000c00>;};pwm6: pwm6@2000c16 {compatible = "allwinner,sunxi-pwm6";pinctrl-names = "active", "sleep";reg = <0x0 0x02000c16 0x0 0x4>;reg_base = <0x02000c00>;};pwm7: pwm7@2000c17 {compatible = "allwinner,sunxi-pwm7";pinctrl-names = "active", "sleep";reg = <0x0 0x02000c17 0x0 0x4>;reg_base = <0x02000c00>;};

在板级目录下的配置:

    pwm3_pin_a: pwm3@0 {pins = "PB0";function = "pwm3";drive-strength = <10>;bias-pull-up;};pwm3_pin_b: pwm3@1 {pins = "PB0";function = "gpio_in";bias-disable;};pwm7_pin_a: pwm7@0 {pins = "PD22";function = "pwm7";drive-strength = <10>;bias-pull-up;};pwm7_pin_b: pwm7@1 {pins = "PD22";function = "gpio_out";};&pwm3 {pinctrl-names = "active", "sleep";pinctrl-0 = <&pwm3_pin_a>;pinctrl-1 = <&pwm3_pin_b>;status = "okay";};&pwm7 {pinctrl-names = "active", "sleep";pinctrl-0 = <&pwm7_pin_a>;pinctrl-1 = <&pwm7_pin_b>;status = "okay";};

具体通道配置按照需求进行配置.

3.5 源码结构

PWM 驱动的源代码位于内核的 drivers/pwm 目录下,具体的路径如下所示:

3.5.1 linux-4.9

drivers/pwm/
├── pwm-sunxi-new.c // Sunxi Enhance PWM support对应的PWM驱动
├── pwm-sunxi.c // Sunxi PWM support对应的PWM驱动
├── pwm-sun4i.c // Allwiner PWM support对应的PWM驱动
├── sysfs.c //PWM子系统的文件系统相关文件
├── core.c //PWM子系统的核心文件

3.5.2 linux-5.4

drivers/pwm/
├── pwm-sunxi-group.c // Sunxi GROUP PWM support对应的PWM驱动
├── sysfs.c //PWM子系统的文件系统相关文件
├── core.c //PWM子系统的核心文件

3.6 调试接口

可以直接在 linux 内核中调试 pwm 模块,具体如下: 进入/sys/class/pwm 目录,该目录是 linux 内核为 pwm 子系统提供的类目录,遍历该目录:

/sys/class/pwm # ls
pwmchip0

可以看到,上述 pwmchip0 就是我们注册的 pwm 控制器,进入该目录,然后遍历该目录:

/sys/class/pwm # cd pwmchip0/
/sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0 # ls
device export npwm subsystem uevent unexport

其中 npwm 文件储存了该 pwm 控制器的 pwm 个数,而 export 和 unexport 是导出和删除某 个 pwm 设备的文件,下面演示导出 pwm1。

/sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0 # cat npwm
2
/sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0 # echo 1 > export
/sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0 # ls
device export npwm pwm1 subsystem uevent unexport

可以看到目录中多出 pwm1 目录,进入该目录,遍历:

/sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0 # cd pwm1/
/sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0/pwm1 # ls
capture duty_cycle enable period polarity uevent

该目录中,enable 是使能 pwm,duty_cycle 是占空比,period 是周期,polarity 是极性,可 以配置相关的 pwm 并且使能:

/sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0/pwm1 # echo 1000000000 > period
/sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0/pwm1 # echo 500000000 > duty_cycle
/sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0/pwm1 # echo normal > polarity
/sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0/pwm1 # echo 1 > enable

如果相关引脚接上了示波器等,可以看到波形。最后返回上层目录,删除该 pwm 设备:

/sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0/pwm1 # cd ..
/sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0 # ls
device export npwm pwm1 subsystem uevent unexport
/sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0 # echo 1 > unexport
/sys/devices/platform/soc/1c23400.pwm/pwm/pwmchip0 # ls
device export npwm subsystem uevent unexport

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

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

相关文章

数据库系统概论——绪论

1、绪论 1.1、数据库系统概述 数据库系统的构成示意图 1.1.1、数据库系统基本概念 基本概念&#xff1a;数据、数据库、数据库管理系统和数据库系统 1&#xff09;数据&#xff08;data&#xff09; 定义&#xff1a;描述事物的符号记录称为数据数据是数据库中存储的基本对象…

中科检测赴中科院广州电子CASAIM开展座谈会,围绕3D打印、三维扫描和精密测量展开深入交流

2月9日&#xff0c;中科检测技术服务(广州)股份有限公司&#xff08;简称&#xff1a;中科检测&#xff09;一行到访中科院广州电子技术有限公司&#xff0c;参观广东省增材制造工程实验室和三维扫描及精密测量重点实验室&#xff0c;就3D打印、三维扫描和精密测量相关技术内容…

NTP同步时钟为医院提供标准的时间信号

NTP同步时钟应用于城市重要公共领域&#xff0c;如车站、学校、医院、等。NTP同步时钟可提供准确的公众时间&#xff0c;为人们的日常生活提供便利&#xff0c;避免了因时钟不准确而带来的不便。NTP同步时钟采用智能模块化设计&#xff0c;与同类产品相比&#xff0c;更突出了安…

JavaScript Web API实战:7个小众技巧让你的网站瞬间提升用户体验

随着技术的日新月异&#xff0c;为开发人员提供了令人难以置信的新工具和API。但据了解&#xff0c;在100 多个 API中&#xff0c;只有5%被开发人员积极使用。 让我们来看看一些有用的Web API&#xff0c;它们可以帮助您将网站推向月球&#xff01; 1、 截屏接口 Screen Capt…

ELK日志分析--Logstash

Logstash简介 Logstash安装 测试运行 配置输入和输出 使用Geoip过滤器插件增强数据编辑 配置接收 Beats 的输入 1.Logstash简介 Logstash管道具有两个必需元素input和output&#xff0c;以及一个可选元素filter。输入插件使用来自源的数据&#xff0c;过滤器插件根据你的…

shell的测试语句

一、shell的条件测试语句 在写shell脚本时&#xff0c;经常遇到的问题就是判断字符串是否相等&#xff0c;可能还要检查文件状态或进 行数字测试&#xff0c;只有这些测试完成才能做下一步动作。 1.1、shell脚本中的条件测试如下&#xff1a; 1、文件测试 2、字符串测试 3、数…

《计算机组成与系统结构(第二版) 裘雪红 李伯成 西安电子科技大学出版社》课后习题答案(带解析)(三)

声明&#xff1a;此系列答案配套《计算机组成与系统结构&#xff08;第二版&#xff09; 裘雪红 李伯成 西安电子科技大学出版社》一书相关内容。所有内容为博主个人编辑&#xff0c;仅作参考学习交流之用&#xff0c;转载请注明出处。如发现错误&#xff0c;请联系博主及时勘误…

java JMM 内存屏障

内存屏障的目的 每个CPU都会有自己的缓存&#xff08;有的甚至L1,L2,L3&#xff09;&#xff0c;缓存的目的就是为了提高性能&#xff0c;避免每次都要向内存取。但是这样的弊端也很明显&#xff1a;不能实时的和内存发生信息交换&#xff0c;分在不同CPU执行的不同线程对同一…

基于SPI的增强式插件框架设计

很久之前&#xff0c;为了诊断线上的问题&#xff0c;就想要是能有工具可以在线上出问题的时候&#xff0c;放个诊断包进去马上生效&#xff0c;就能看到线上问题的所在&#xff0c;那该是多么舒服的事情。后来慢慢的切换到 java 领域后&#xff0c;这种理想也变成了现实&#…

【selenium 自动化测试】如何搭建自动化测试环境,搭建环境过程应该注意的问题

最近也有很多人私下问我&#xff0c;selenium学习难吗&#xff0c;基础入门的学习内容很多是3以前的版本资料&#xff0c;对于有基础的人来说&#xff0c;3到4的差别虽然有&#xff0c;但是不足以影响自己&#xff0c;但是对于没有学过的人来说&#xff0c;通过资料再到自己写的…

2023年PMP考试应该注意些什么?

首先注意&#xff08;报考条件&#xff09; 2023年PMP考试报名流程&#xff1a; 一、PMP英文报名&#xff1a; 英文报名时间无限制&#xff0c;随时可以报名&#xff0c;但有一年的有效期&#xff0c;所以大家尽量提前报名&#xff0c;在英文报名有效期内进行中文报名。 英…

深度卷积对抗神经网络 进阶 第三部分 GANs Unpaired Translation with Cycle GAN 模型

非配对的图像转换应用 Unpaired Image-to-Image Translation Unpaired image-to-image translation 主要用于学习两组图像之间的对应关系&#xff0c;检查和寻找两堆数据中的共同内容&#xff08;content&#xff09;以及每堆独有的特点&#xff08;style&#xff09;。而这个…

【Database-03】从 MySQL 迁移到 达梦数据库(DM 8)

1、环境 源数据库 MySQL 8.30 目标数据库 DM 8 操作系统 Centos 9 Steam 迁移工具 DM 数据迁移工具 (DM DTS) 2、开始迁移 2.1、打开DM数据迁移工具 在新建工程对话框中填写工程名和工程描述信息&#xff0c;点击【确定】按钮&#xff0c;成功添加了一个工程。 2.2、新建迁…

3年经验,3轮技术面+1轮HR面,拿下字节30k*16薪offer,这些自动化测试面试题值得大家借鉴

面试一般分为技术面和hr面&#xff0c;形式的话很少有群面&#xff0c;少部分企业可能会有一个交叉面&#xff0c;不过总的来说&#xff0c;技术面基本就是考察你的专业技术水平的&#xff0c;hr面的话主要是看这个人的综合素质以及家庭情况符不符合公司要求&#xff0c;一般来…

2023年,IT互联网还有发展前景吗?

不得不说&#xff0c;互联网在整个社会经济发展中扮演着不可或缺的角色&#xff1b;不仅自身的技术具有前沿性&#xff0c;也推动着其他行业进入数字化经济时代&#xff0c;让我们的工作生活变得更加便捷。 在“互联网”时代&#xff0c;每个服务行业都会利用大数据&#xff0…

SpringBoot入门(二)

这里写目录标题一、SpringBoot整合Junit1.1 搭建SpringBoot工程1.2 引入starter-test起步依赖1.3 编写类1.4 测试二、SpringBoot整合mybatis2.1 搭建SpringBoot工程2.2 引入mybatis起步依赖&#xff0c;添加驱动2.3 编写DataSource和MyBatis相关配置2.4 定义表和实体类2.5 编写…

Bootstrap入门到精通

文章目录前言一、Bootstrap是什么&#xff1f;二、Bootstrap安装方式一&#xff1a;将压缩包下载到本地引入使用方式二&#xff1a;使用Bootstrap官方cdn二.Bootstrap容器下面是屏幕宽度在不同大小时不同容器的显示状态三.Bootstrap栅格系统bootstrap网格系统有以下六个类网格系…

linux shell 入门学习笔记7 父子shell面试题

1. 不同的执行方式&#xff0c;不同的shell环境 每次调用bash/sh解释器执行脚本都会开启一个子shell&#xff0c;因此不保留当前shell变量&#xff0c;通过pstree命令检查进程树调用source是当前环境加载脚本&#xff0c;因此保留变量 例子&#xff1a; xiao123xiao123:~/Dow…

直播间的2个小感悟

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 在线人数固定 最近直播间出现了很多新面孔&#xff0c;有的是偶然刷到的&#xff0c;有的是关注互联网找到的。而直播间的人数一直没什么变化&#xff0c;卢松松在抖音直播较少&#xff0c;主播间…

开学第一周,超30所高校系主任选择与百度飞桨联办校赛

经历了一场特殊而漫长的假期&#xff0c;各地校园又恢复了往日的热闹&#xff0c;重新焕发出勃勃生机&#xff0c;师生们在一声声久别重逢的暖心问候中&#xff0c;迎来了2023年春季学期。 以赛促学蔚然成风 开学季是校内竞赛策划及启动的最佳时机之一&#xff0c;越来越多的老…