【STM32MP157应用编程】3.控制PWM

news2024/11/13 16:19:33

目录

PWM文件

指令操作PWM

程序操作PWM

程序说明

程序代码

3_PWM_1.c

启动交叉编译工具

编译

拷贝到开发板

测试

PWM文件

在/sys/class/pwm目录下,存放了PWM的文件。

 

         pwmchip0pwmchip4目录对应了MP157 SoC的2个PWM控制器,pwmchip0对应的是MP157的TIM4,而pwmchip4对应的则是TIM1,并且STM32MP157只提供了一个PWM通道(PA10--TIM1_CH3)。TIM4_CH2用作LCD背光控制。

        npwm:只读文件,读取该文件可以得知该PWM控制器下共有几路PWM输出。

cat npwm

 export:在使用PWM之前,需要将其导出,通过export属性进行导出。

echo 2 > export

数字对应的通道
0CH1
1CH2
2CH3
3CH4

 unexport:将导出的PWM通道删除。

echo 2 > unexport

指令操作PWM

period:用于配置PWM周期,可读可写;写入一个字符串数字值,以ns(纳秒)为单位。最小值为5000

echo 1000000 > period	#设置1ms的周期

 

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

echo 500000 > duty_cycle	#设置0.5ms的占空比

 

 polarity:用于设置极性,可读可写,可写入的值: "normal":普通; "inversed":反转。

echo normal > polarity		#设置普通极性

         enable:可读可写,写入"0"表示禁止PWM;写入"1"表示使能PWM。读取该文件获取PWM当前是禁止还是使能状态。通常配置好PWM之后,再使能PWM。

echo 1 > enable		#使能PWM

 

程序操作PWM

程序说明

./xxx 参数1 参数2

参数1:周期,以us为单位,最小值为5。

参数2:占空比,百分比。

        0~100:占空比的百分比。

程序代码

3_PWM_1.c

/*
	PWM控制
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

//./xxx 周期 占空比(百分比)

static char PWM_path[] = "/sys/class/pwm/pwmchip4/pwm2";
static char PWM_export_path[] = "/sys/class/pwm/pwmchip4/export";
static char PWM_period_path[] = "/sys/class/pwm/pwmchip4/pwm2/period";
static char PWM_duty_cycle_path[] = "/sys/class/pwm/pwmchip4/pwm2/duty_cycle";
static char PWM_polarity_path[] = "/sys/class/pwm/pwmchip4/pwm2/polarity";
static char PWM_enable_path[] = "/sys/class/pwm/pwmchip4/pwm2/enable";

int main(int argc, char *argv[])
{
    //检查参数个数
    if (argc != 3)
    {
        printf("%s文件的参数个数错误!\n", argv[0]);
        return -1;
    }

    //检查参数
    char *endptr;
    //检查参数1是否为纯数字
    strtol(argv[1], &endptr, 10);
    if ((endptr == argv[1]) || ((!isspace(*endptr)) && (*endptr != '\0')))
    {
        perror("参数错误!\n");
        return -1;
    }
    endptr = NULL;
    //检查参数2是否为纯数字
    strtol(argv[2], &endptr, 10);
    if ((endptr == argv[2]) || ((!isspace(*endptr)) && (*endptr != '\0')))
    {
        perror("参数错误!\n");
        return -1;
    }
    //检查参数1的取值范围:>=5
    int ZhouQi = atol(argv[1]);
    if (ZhouQi < 5)
    {
        perror("参数错误!\n");
        return -1;
    }
    //检查参数2的取值范围:0-100
    int ZhanKongBi = atol(argv[2]);
    if (ZhanKongBi < 0 || ZhanKongBi > 100)
    {
        perror("参数错误!\n");
        return -1;
    }
    //检查PWM是否导出
    int fd;
    if (access(PWM_path, F_OK))
    {
        if (0 > (fd = open(PWM_export_path, O_WRONLY)))
        {
            perror("文件打开错误!\n");
            return -1;
        }
        if (strlen("2") != (write(fd, "2", strlen("2"))))
        {
            perror("PWM文件导出错误!\n");
            return -1;
        }
        close(fd);
    }

    //配置周期
    if (0 > (fd = open(PWM_period_path, O_WRONLY)))
    {
        perror("period文件打开错误!\n");
        return -1;
    }
    char str[100];
    sprintf(str, "%d", ZhouQi * 1000);
    if (strlen(str) != write(fd, str, strlen(str)))
    {
        perror("配置周期错误!\n");
        return -1;
    }
    close(fd);

    //配置占空比
    if (0 > (fd = open(PWM_duty_cycle_path, O_WRONLY)))
    {
        perror("duty_cycle文件打开错误!\n");
        return -1;
    }
    sprintf(str, "%d", ZhouQi * 10 * ZhanKongBi );
    if (strlen(str) != write(fd, str, strlen(str)))
    {
        perror("配置占空比错误!\n");
        return -1;
    }
    close(fd);

    //配置极性
    if (0 > (fd = open(PWM_polarity_path, O_WRONLY)))
    {
        perror("polarity文件打开错误!\n");
        return -1;
    }
    if (strlen("normal") != write(fd, "normal", strlen("normal")))
    {
        perror("配置极性错误!\n");
        return -1;
    }
    close(fd);

    //使能
    if (0 > (fd = open(PWM_enable_path, O_WRONLY)))
    {
        perror("enable文件打开错误!\n");
        return -1;
    }
    if (strlen("1") != write(fd, "1", strlen("1")))
    {
        perror("使能错误!\n");
        return -1;
    }
    close(fd);
    return 0;
}

启动交叉编译工具

source /opt/st/stm32mp1/3.1-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

编译

${CC} -o 3_PWM_1 3_PWM_1.c

拷贝到开发板

scp 3_PWM_1 root@10.3.22.219:/home/root/Linux_C_YingYong_BianCheng/JiaoCheng/3_PWM/

 

测试

输出周期为1ms,占空比为30%的PWM。

./3_PWM_1 1000 30

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

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

相关文章

【Python】torch.norm()用法解析

【Python】torch.norm()用法解析 文章目录【Python】torch.norm()用法解析1. 介绍1.1 p-范数1.2 Frobenius 范数1.3 核范数2. API3. 示例1. 介绍 torch.norm()是对输入的tensor求对应的范数。tensor的范数有以下三种&#xff1a; 1.1 p-范数 1.2 Frobenius 范数 即&#xff…

Linux-GCC介绍+入门级Makefile使用

前言&#xff08;1&#xff09;我们都知道&#xff0c;在Linux中编译.c文件需要使用gcc -o .c文件的指令来将C文件变成可执行文件。但是我们有没有发现&#xff0c;如果我们需要编译大一点的工程&#xff0c;后面需要加上的.c文件是不是太多了&#xff1f;感觉非常的麻烦。&…

linux篇【16】:传输层协议<后序>

目录 六.滑动窗口 &#xff08;1&#xff09;发送缓冲区结构 &#xff08;2&#xff09;滑动窗口介绍 &#xff08;3&#xff09;滑动窗口不一定只会向右移动。滑动窗口可以变大也可以变小。 &#xff08;4&#xff09;那么如果出现了丢包, 如何进行重传? 这里分两种情况…

「微报告」激光雷达前装“成色”

激光雷达正处于第一波规模上车期。 高工智能汽车研究院监测数据显示&#xff0c;2022年中国市场&#xff08;不含进出口&#xff09;乘用车前装标配搭载激光雷达12.99万台&#xff0c;配套车辆11.18万辆&#xff0c;同比分别增长1544.30%和2626.82%。此外&#xff0c;提供选装的…

华为OD机试题,用 Java 解【相对开音节】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…

基于BERT-PGN模型的中文新闻文本自动摘要生成——文本摘要生成(论文研读)

基于BERT-PGN模型的中文新闻文本自动摘要生成&#xff08;2020.07.08&#xff09; 基于BERT-PGN模型的中文新闻文本自动摘要生成&#xff08;2020.07.08&#xff09;摘要&#xff1a;0 引言相关研究2 BERT-PGN模型2. 1 基于预训练模型及多维语义特征的词向量获取阶段2. 1. 1 BE…

Python3-数据结构

Python3 数据结构 本章节我们主要结合前面所学的知识点来介绍Python数据结构。 列表 Python中列表是可变的&#xff0c;这是它区别于字符串和元组的最重要的特点&#xff0c;一句话概括即&#xff1a;列表可以修改&#xff0c;而字符串和元组不能。 以下是 Python 中列表的…

3.3 GPIO输入

按键1.1 按键介绍•按键&#xff1a;常见的输入设备&#xff0c;按下导通&#xff0c;松手断开•按键抖动&#xff1a;由于按键内部使用的是机械式弹簧片来进行通断的&#xff0c;所以在按下和松手的瞬间会伴随有一连串的抖动1.2 按键的四种接法P1是最常用的接法&#xff0c;p1…

【小程序】django学习笔记1

网页能用&#xff0c;不知道小程序能不能用。应该能吧。。。。。创建django程序文件包&#xff0c;xxx处是给该文件夹起个名django-admin startproject xxx一个project是由很多个app&#xff08;小应用&#xff09;组成的在文件夹目录下创建一个app&#xff0c;xxx处给该app起个…

脑雾到来的6个症状

在阳康后的一段时间里&#xff0c;很多人发现自己脑力不似从前&#xff0c;长时间的修养也没能彻底恢复&#xff0c;以为自己有后遗症&#xff0c;十分紧张。其实&#xff0c;脑雾不是专业的医学名词&#xff0c;它是对一类症状的统称&#xff1a;健忘、注意力不集中、思维迟钝…

第17天-整合Redis缓存改造三级分类,并解决缓存击穿、穿透、雪崩、一致性问题

1.缓存 1.1.缓存使用 为了系统性能的提升&#xff0c;一般都会将部分数据放入缓存中&#xff0c;达到快速响应的目的。而数据库承担数据落盘工作。 哪些数据适合放入缓存&#xff1f; 即时性、数据一致性要求不高的访问量大且更新频率不高的数据&#xff08;读多&#xff0c…

布隆过滤器Bloom -> Redisson系列-3

接上文&#xff1a;RBucket对象桶 -&#xff1e; Redisson系列-1&#xff08;让redis操作更优雅&#xff09;_子书少卿的博客-CSDN博客 本质上布隆过滤器是一种数据结构&#xff0c;是一种比较巧妙的概率性数据结构&#xff0c;特点是可以高效的插入和查询&#xff0c;可…

浅谈一下虚拟机栈

虚拟机栈 概述 由于跨平台性的设计&#xff0c;Java的指令都是根据栈来设计的。不同平台CPU架构不同&#xff0c;所以不能设计为基于寄存器的。 优点是跨平台&#xff0c;指令集小&#xff0c;编译器容易实现&#xff0c;缺点是性能下降&#xff0c;实现同样的功能需要更多的…

SpringBoot学习笔记(二)配置文件

1、配置文件SpringBoot使用一个全局的配置文件&#xff0c;配置文件名是固定的&#xff1b;application.propertiesapplication.yml配置文件的作用&#xff1a;修改SpringBoot自动配置的默认值&#xff1b;SpringBoot在底层都给我们自动配置好&#xff1b;YAML&#xff1a;以数…

MySQL常用函数整理

MySQL常用函数整理sql函数分类一、流程控制1、判断值为null或空字符串2、IF函数3、IFNULL函数4、CASE函数(1) 相当于switch case的作用(2) 相当于if elseif的作用5、COALESCE函数二、字符串类&#xff08;GBT答案&#xff09;1、用于select、insert等子句中2、用于where子句中其…

来吧!接受Kotlin 协程--线程池的7个灵魂拷问

前言 之前有分析过协程里的线程池的原理&#xff1a;Kotlin 协程之线程池探索之旅(与Java线程池PK)&#xff0c;当时偏重于整体原理&#xff0c;对于细节之处并没有过多的着墨&#xff0c;后来在实际的使用过程中遇到了些问题&#xff0c;也引发了一些思考&#xff0c;故记录之…

从零开始学习c语言|21、动态内存管理

一、malloc函数 1、什么是malloc函数 malloc是memery(内存)和allocate(分配)的缩写&#xff0c;顾名思义&#xff0c;malloc函数为动态分配内存的意思 2、malloc函数语句 int *p(int *)malloc(sizeof(int))malloc函数的形参为申请的内存空间大小&#xff0c;上述申请了一个i…

“巨亏成名”的魔鬼交易员,你知道几个?

谁说在期货市场上只有赚大钱才能出名&#xff1f;殊不知还有这样一群特殊的交易员靠着巨额亏损而“一战成名”&#xff0c;亏得是老东家元气大伤&#xff0c;外号“魔鬼交易员”——“不亏不成魔”&#xff01;接下来火象就给大家盘点几位代表性魔鬼交易员&#xff0c;看看他们…

论文阅读 | 轻量级网络 MobileNets/Xception/ShuffleNet

前言&#xff1a;重温经典&#xff0c;整理了一些几年前做轻量级网络的论文&#xff0c;其中的深度可分离卷积和通道shuffle的思想至今也在沿用 &#xff08;这几天都没看论文然而实验还是没跑出来&#xff0c;不卷会议了&#xff0c;开始摆烂…&#xff09; 论文地址&#xff…

JavaScript Math 算数对象

文章目录JavaScript Math 算数对象Math 对象Math 对象属性Math 对象方法算数值算数方法JavaScript Math 算数对象 Math&#xff08;算数&#xff09;对象的作用是&#xff1a;执行常见的算数任务。 Math 对象 Math&#xff08;算数&#xff09;对象的作用是&#xff1a;执行普…