Linux_应用篇(18) PWM应用编程

本章我们将学习如何对开发板上的 PWM 设备进行应用编程。本章将会讨论如下主题内容。
⚫ 应用层 PWM 编程介绍;
⚫ PWM 测试。

应用层如何操控 PWM

与 LED 设备一样, PWM 同样也是通过 sysfs 方式进行操控,进入到/sys/class/pwm 目录下,如下所示:

这里列举出了 8 个以 pwmchipX(X 表示数字 0~7)命名的文件夹,这八个文件夹其实就对应了 I.MX6U的 8 个 PWM 控制器, I.MX6U 总共有 8 个 PWM 控制器,大家可以通过查询 I.MX6U 参考手册得知。我们随便以其中一个为例,进入到 pwmchip0 目录下:

在这个目录下我们重点关注的是 export、 npwm 以及 unexport 这三个属性文件,下面一一进行介绍:
⚫ npwm: 这是一个只读属性,读取该文件可以得知该 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。导出成功后会在 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);
}
Vivado2023是一款集成开发环境软件,用于设计和验证FPGA(现场可编程门阵列)和可编程逻辑器件。对于使用Vivado2023的用户来说,license是必不可少的。 Vivado2023的license是一种许可证,用于授权用户合法使用该软件。许可证分为多种类型,包括评估许可证、开发许可证和节点许可证等。每种许可证都有不同的使用条件和功能。 评估许可证是免费提供的,让用户可以在一段时间内试用Vivado2023的全部功能。用户可以使用这个许可证来了解软件的性能和特点,对于初学者和小规模项目来说是一个很好的选择。但是,使用评估许可证的用户在使用期限过后需要购买正式的许可证才能继续使用软件。 开发许可证是付费的,可以永久使用Vivado2023的全部功能。这种许可证适用于需要长期使用Vivado2023进行开发的用户,通常是专业的FPGA设计师或工程师。购买开发许可证可以享受Vivado2023的技术支持和更新服务,确保软件始终保持最新的版本和功能。 节点许可证是用于多设备或分布式设计的许可证,可以在多个计算机上安装Vivado2023,并共享使用。节点许可证适用于大规模项目或需要多个处理节点进行设计的用户,可以提高工作效率和资源利用率。 总之,Vivado2023 license是用户在使用Vivado2023时必须考虑的问题。用户可以根据自己的需求选择合适的许可证类型,以便获取最佳的软件使用体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Absorbed_w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值