【北京迅为】《iTOP-3588开发板系统编程手册》-第17章 PWM应用编程

RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP,内置NPU,支持INT4/INT8/INT16/FP16混合运算能力,支持安卓12和、Debian11、Build root、Ubuntu20和22版本登系统。了解更多信息可点击迅为官网   

【粉丝群】824412014

【实验平台】:迅为RK3588开发板

【内容来源】《iTOP-3588开发板系统编程手册》

【全套资料及网盘获取方式】联系淘宝客服加入售后技术支持群内下载

【视频介绍】:【强者之芯】 新一代AIOT高端应用芯片 iTOP -3588人工智能工业AI主板


第17章 PWM应用编程

由于本章节要进行PWM章节的实验,所以使用gpio座子其中的1号引脚来做PWM的实验管脚,所以需要在设备树中注释掉此引脚的相关内容,并使能PWM13。

为了方便起见,已经将修改好的内核设备树放到了“iTOP-3588开发板\03_【iTOP-RK3588开发板】指南教程\03_系统编程配套程序\67”目录下,如下图所示:

将提供的boot.img文件根据07_【北京迅为】itop-3588开发板快速烧写手册.pdf手册中的“单独烧写 Linux 固件”小节进行单独烧写,烧写完成之后就可以进行本章节的学习了。

17.1 PWM介绍

PWM,即脉冲宽度调制(Pulse Width Modulation),是一种通过改变信号的脉冲宽度来控制电路的输出信号的方法。在PWM中,周期不变,但是脉冲宽度随时间改变,从而控制电路的输出。

PWM技术最初被广泛应用于模拟电路,用于调节电路的电压、电流、功率等。随着数字技术的发展,PWM技术被广泛应用于数字电路、控制系统和嵌入式系统等领域。

在PWM信号中,每个周期包含一个高电平和一个低电平,它们之间的时间称为脉冲周期,通常用T表示。脉冲的宽度称为占空比,表示高电平持续的时间与一个周期的时间的比例,通常用D表示,D的取值范围是0到1之间。

PWM信号的输出可以通过多种方式实现,包括硬件PWM和软件PWM。硬件PWM通常是通过专用的PWM模块实现的,它可以在一个固定的频率下生成PWM信号,并且可以配置占空比和其他参数。软件PWM通常是在控制器的程序中实现的,它通过周期性地改变输出引脚的状态来实现PWM信号。

PWM技术可以用于许多应用,例如调节电机的转速、控制LED亮度、控制电磁阀的开关等。在这些应用中,PWM信号可以提供精确的控制和调节,从而实现更高的效率和更精确的控制。在本章将会使用PWM对LED灯的亮度进行控制。

17.2应用层操控PWM 

PWM和之前讲解的LED、GPIO相同,都是通过 sysfs 方式进行操控的。开发板系统启动之后进入到/sys/class/pwm 目录下,如下所示:

在pwm目录下存在 4个以 pwmchipX(X 表示数字)命名的文件夹。在本章节的开始部分,重新烧写了设备树内核镜像,该设备树中总共使能了四个PWM,分别为PWM1,PWM3,PWM13和PWM15,系统会根据PWM的编号大小进行排序,在这里PWM1对应 pwmchip0、PWM3对应pwmchip1,PWM13对应pwmchip2,PWM15对应pwmchip3。

通过查询网盘“TOP-3588开发板\01_【iTOP-RK3588开发板】基础资料\01_iTOP-RK3588硬件资料\03_芯片数据手册\01_rk3588数据手册和参考手册”路径下的Rockchip RK3588 Datasheet V1.1-20220124.pdf数据手册得知,RK3588总共有16个 PWM 控制器(具体的查询会在之后的驱动手册中进行讲解,本章节只是学习PWM的使用),本章节将会以GPIO3_B6对应的PWM13为例进行讲解和演示。使用以下命令进入 PWM13对应的 pwmchip2目录下如下图所示:

在这个目录下总共有七个文件分别为device、export、npwm、power、subsystem、uevent  和unexport。需要关注的是 export、npwm 以及 unexport 这三个属性文件,下面一一进行介绍:

npwm:是一个只读属性,读取该文件可以得知该 PWM 控制器下共有几路 PWM 输出,如下所示:

export:在使用 PWM 之前,通过 export 属性进行导出,以下所示:

echo 0 > export

unexport:当使用完 PWM 之后,需要将导出的 PWM 删除,譬如:

echo 0 > unexport

写入到 unexport 文件中的编号与写入到 export 文件中的编号是相对应的;需要注意的是,export 文件 和 unexport 文件都是只写的、没有读权限。

再次使用以下命令导出pwm0目录,导出成功之后进入该文件夹如下图所示:

echo 0 > export

cd pwm0

可以看到pwm0文件夹下分别有capture、duty_cycle、enable、output_type、period、polarity、power、uevent七个文件,而需要了解的文件是 duty_cycle、enable、period 以及 polarity 这四个属性文件,接下来分别介绍这四个属性文件的作用:

polarity:用于PWM极性的查看,只读属性,这里为inversed表示极性反转,如下图所示:

period:用于配置 PWM 周期,可读可写;写入一个字符串数字值,以 ns(纳秒)为单位,譬如配置 PWM 周期为 10us(微秒):

echo 10000 > period

duty_cycle:用于配置 PWM 的占空比,可读可写;写入一个字符串数字值,同样也是以 ns 为单位,譬如: 

echo 5000 > duty_cycle

enable:使能 PWM 输出通常配置好 PWM 之后,再使能 PWM。可读可写,写入"0"表示禁止 PWM;写入"1"表示使能 PWM。

允许PWM输出:

echo 1 > enable

禁止 PWM 输出:

echo 0 > enable

17.3 PWM应用编程

本小节代码在配套资料“iTOP-3588开发板\03_【iTOP-RK3588开发板】指南教程\03_系统编程配套程序\67”目录下,如下图所示:

实验要求:

通过PWM输入应用程序来控制引脚GPIO3_B6的占空比,以此来实现呼吸灯的效果。

17.3.1编写应用程序 

实验步骤:

首先进入到ubuntu的终端界面输入以下命令来创建 demo67_pwm.c文件,如下图所示:

vim  demo67_pwm.c

  然后向该文件中添加以下内容:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

char pwm_path[100];
#define PWM13_PATH "/sys/class/pwm/pwmchip2/pwm0"

// PWM控制函数,arg为控制参数,val为参数值
int pwm_ctrl(char *arg, char *val)
{
    char file_path[100];
    int fd, len, ret;
    // 拼接文件路径
    sprintf(file_path, "%s/%s", PWM13_PATH, arg);
    // 打开文件
    fd = open(file_path, O_WRONLY);
    if (fd < 0)
    {
        // 打开文件失败
        printf("打开文件%s失败\n", file_path);
        return -1;
    }
    // 写入参数值
    len = strlen(val);
    ret = write(fd, val, len);
    if (ret < 0)
    {
        // 写入文件失败
        printf("写入文件%s失败\n", file_path);
        return -1;
    }
    // 关闭文件
    close(fd);
    return 0;
}

int main(int argc, int *argv[])
{
    int fd, len, ret;
    char buf[100];
    // 检测PWM0_PATH路径是否存在,不存在则创建
    if (access(PWM13_PATH, F_OK))
    {
        fd = open("/sys/class/pwm/pwmchip2/export", O_WRONLY);
        if (fd < 0)
        {
            // 打开文件失败
            printf("打开文件%s失败\n", "/sys/class/pwm/pwmchip2/export");
            return -1;
        }
        // 写入0到export文件,创建PWM设备
        len = 1;
        ret = write(fd, "0", len);
        if (ret < 0)
        {
            // 写入文件失败
            printf("写入文件%s失败\n", "/sys/class/pwm/pwmchip2/export");
            return -1;
        }
        // 关闭文件
        close(fd);
    }

    // 配置PWM周期、占空比并使能PWM输出
    pwm_ctrl("period", "10000"); // 设置周期为10000纳秒
    pwm_ctrl("duty_cycle", "10000"); // 设置占空比为10000纳秒,即100%
    pwm_ctrl("enable", "1"); // 使能PWM输出

    // 循环改变PWM占空比,实现LED呼吸灯效果
    while (1)
    {
        for (int i = 10000; i >= 0; i--) // 减小PWM占空比,LED变暗
        {
            sprintf(buf, "%d", i);
            pwm_ctrl("duty_cycle", buf);
            usleep(5); // 延时5微秒
        }
        for (int i = 0; i <= 10000; i++) // 增加PWM占空比,LED变亮
        {
            sprintf(buf, "%d", i);
            pwm_ctrl("duty_cycle", buf);
            usleep(5); // 延时5微秒
        }
    }

    return 0;
}

第45-65行首先会判断相应的pwm文件是否存在,不存在则进行gpio的导出,存在就继续运行,第68-70行分别确定了PWM的周期、PWM占空比,并对PWM进行使能。75-80和81-87为两个for循环,第一个for循环为占空比降低,LED灯的亮度由亮变暗,第二个for循环为占空比降增加,LED灯的亮度由暗变亮。

保存退出之后,使用以下命令设置交叉编译器环境,并对demo67_pwm.c进行交叉编译,编译完成如下图所示:

export PATH=/usr/local/arm64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin:$PATH

aarch64-none-linux-gnu-gcc -o demo67_pwm demo67_pwm.c

最后将交叉编译生成的demo67_pwm文件拷贝到/home/nfs共享目录下即可。

17.3.2开发板测试

Buildroot系统启动之后,首先使用以下命令进行nfs共享目录的挂载(其中192.168.1.7为作者ubuntu的ip地址,需要根据自身ubuntu的ip来设置),如下图所示:

mount -t nfs -o nfsvers=3,nolock 192.168.1.7:/home/nfs /mnt

 

nfs共享目录挂载到了开发板的/mnt目录下,进入到/mnt目录下,如下图所示:

可以看到/mnt目录下demo67_pwm文件已经存在了,然后使用以下命令运行该程序如下图所示:

./demo67_pwm

程序运行之后,会看到GPIO3_B6引脚外接的LED小灯会进行呼吸式亮度变化。至此我们的PWM实验就完成了。 

  • 17
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值