[imx6ull]PWM编程-蜂鸣器控制

news/2024/11/20 11:51:11/

文章目录

  • 一、PWM概述
  • 二、PWM的参数
  • 三、驱动配置
  • 四、PWM应用测试
    • 1.应用程序
    • 2.makefile
    • 3.运行测试


一、PWM概述

PWM(Pulse Width Modulation),是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%。PWM是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。PWM信号一般下图所示:
在这里插入图片描述

经常见到的就是交流调光电路(手机充电的呼吸灯),也可以说是无级调速,高电平占多一点,也就是占空比大一点亮度就亮一点,占空比小一点亮度就没有那么亮,前提是PWM的频率要大于我们人眼识别频率(大约80Hz以上最好)。在电机驱动、无源蜂鸣器驱动、LCD屏幕背光调节、逆变电路等都会有应用。

二、PWM的参数

PWM一共有三个重要的参数:频率、 周期、 占空比:

  • PWM的频率:代表1秒钟PWM从高电平到低电平再到高电平的次数,也就是1秒钟内PWM有多少个周期,单位:HZ
  • PWM的周期:周期也就是完成一次从高电平到低电平再到高电平的时间,单位:ms
  • 占空比:指定是一个脉冲周期中高电平的时间占整个周期的比例,单位:%

示例:
在这里插入图片描述
周期:代表一个脉冲信号的时间,1s周期的个数为频率
脉宽时间:高电平的时间,脉宽时间(也就是高电平的时间)占总周期的时间为占空比

三、驱动配置

我们可以知道开发板上有4路PWM分别为:

PWM1 ---> backlight //LCD背光
PWM2 ---> beep         //蜂鸣器
PWM7,PWM8 ---> 40pin扩展 //需要使能开启

想要使能40pin扩展口的PWM7和8的话,需要修改/run/media/mmcblk1p1路径下的config.txt文件如下:

# Enable PWM overlays, PWM8 conflict with UART8(NB-IoT/4G module)
dtoverlay_pwm=7 8

修改后重启系统,和gpio一样通过sysfs方式进行操作,在/sys/class/pwm路径下存在着我们PWM控制器的文件pwmchipN,我们可以在文件夹中看到几个比较重要的属性文件:

在这里插入图片描述

  • npwm:这是一个只读属性,可以通过cat命令去查看此PWM控制器共有几路输出
  • export:在使用PWM之前也需要将其导出,export属性与GPIO的控制中一样用于导出,导出方法如下:
echo 0 > export

导出后可以在pwmchipN文件中看见我们导出的一个pwm0的文件夹。

注意:echo导出的值必须小于我们npwm中看见的值

  • unexport:用于在我们使用完PWM之后将导出的pwm文件夹删除,删除方法如下:
echo 0 > unexport

注意:export文件和unexport文件都是只写的、没有读权限

四、PWM应用测试

1.应用程序

pwm_test.c

/**********************************************************************************      Copyright:  (C) 2023 Deng Yonghao<dengyonghao2001@163.com>*                  All rights reserved.**       Filename:  pwm_test.c*    Description:  This file use to test pwm*                 *        Version:  1.0.0(2023年03月17日)*         Author:  Deng Yonghao <dengyonghao2001@163.com>*      ChangeLog:  1, Release initial version on "2023年03月17日 11时54分08秒"*                 ********************************************************************************/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>static char pwm_path[100];static int pwm_config(const char *attr, const char *val);//pwm配置函数声明,attr:属性文件名字,val属性的值(字符串)int main(int argc, char **argv)
{char 	temp[100];int 	fd = -1;/*传参校验*/if(4 != argc){printf("usage: %s <id> <period> <duty>\n", argv[0]);exit(-1);//exit(0) 表示进程正常退出 exit(非0)表示异常退出}/*打印配置信息*/printf("PWM config: id<%s>, period<%s>, duty<%s>\n", argv[1], argv[2], argv[3]);/* 导出pwm 首先确定最终导出的文件夹路径*/memset(pwm_path, 0, sizeof(pwm_path));snprintf(pwm_path, sizeof(pwm_path), "/sys/class/pwm/pwmchip%s/pwm0", argv[1]);//如果pwm0目录不存在, 则导出memset(temp, 0, sizeof(temp));if(access(pwm_path, F_OK)) {snprintf(temp, sizeof(temp) , "/sys/class/pwm/pwmchip%s/export", argv[1]);if(0 > (fd = open(temp, O_WRONLY))) {printf("open pwmchip%s error\n", argv[1]);exit(-1);}//导出pwm0文件夹if(1 != write(fd, "0", 1)) {printf("write '0' to  pwmchip%s/export error\n", argv[1]);close(fd);exit(-2);}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");return 0;
}static int pwm_config(const char *attr, const char *val)
{char 	file_path[200];int 	len;int 	fd =-1;if(attr == NULL || val == NULL){printf("[%s] argument error\n", __FUNCTION__);return -1;}memset(file_path, 0, sizeof(file_path));snprintf(file_path, sizeof(file_path), "%s/%s", pwm_path, attr);if(0 > (fd = open(file_path, O_WRONLY))){printf("[%s] open %s error\n", __FUNCTION__, file_path);return fd;}len = strlen(val);if(len != write(fd, val, len)){printf("[%s] write %s to %s error\n", __FUNCTION__, val, file_path);close(fd);return -2;}close(fd);return 0;}

2.makefile

代码如下(示例):

CC=arm-linux-gnueabihf-gcc
APP_NAME1=pwm_testall:clean@${CC} ${APP_NAME1}.c -o ${APP_NAME1}clean:@rm -f ${APP_NAME1}

3.运行测试

首先,通过在通过make命令编译好我们的测试程序,然后通过如下命令把编译好的可执行程序下载到开发板上,并赋予可执行权限:

tftp -gr pwm_test 192.168.137.101
chmod a+x pwm_test

然后我们运行此测试程序来测试PWM8管脚:

root@igkboard:~# ./pwm_test 3 10000 1000 root@igkboard:~# ./pwm_test 3 10000 3000 root@igkboard:~# ./pwm_test 3 10000 7000 root@igkboard:~# ./pwm_test 3 10000 9000  

执行时可以看见led灯会随着我们的参数不同而变化,参数第一个代表pwmchip3,第二个为周期,越大越暗,第三个为占空比,越大灯越亮。

在这里插入图片描述
测试视频可见:PWM管脚led测试视频
然后我们可以测试蜂鸣器:
在这里插入图片描述
参数第一个代表pwmchip1蜂鸣器,第二个周期越大越小声,第三个占空比越大灯越大声,测试成功。


http://www.ppmy.cn/news/40900.html

相关文章

使用树状图可视化聚类

一般情况下&#xff0c;我们都是使用散点图进行聚类可视化&#xff0c;但是某些的聚类算法可视化时散点图并不理想&#xff0c;所以在这篇文章中&#xff0c;我们介绍如何使用树状图&#xff08;Dendrograms&#xff09;对我们的聚类结果进行可视化。 树状图 树状图是显示对象…

探索网络世界的核心:TCPIP协议四层模型解析.md

前言 欢迎来到今天的每日一题&#xff0c;每日一提。今天要聊的是面试中经常会问到tcp协议 。相信在以往的面试中&#xff0c;一定碰到过这个问题吧&#xff1a;什么是TCP/IP协议&#xff1f;它包括哪些层次&#xff1f;。虽然在面试中脱口而出&#xff0c;有四层&#xff1a;应…

有无SSL证书,网站安全大不同

随着互联网时代的发展&#xff0c;用户信息数据量越来越大&#xff0c;同时数据泄露的风险也越来越大。随意搜索一下&#xff0c;用户信息数据泄露等安全问题的事件常有发生。 一些数据泄露的报道事件令大众对于自身数据安全这一块非常敏感&#xff0c;保护自己信息安全的意识…

「抖in新风潮·春夏上新」,新品激活潮流“大”生意

不同的时代风靡各异的潮流&#xff0c;而在当下&#xff0c;更多年轻人正以年轻鲜活的视野&#xff0c;无限放大“自我”的力量&#xff0c;塑造着属于个体的潮流表达。这种基于真我本色的塑造&#xff0c;在抖音又得以被无限地看到&#xff0c;从而无限地聚集同好、引发交流、…

科研热点|2023基金委首批科研不端案件处理结果通报~

2023年查处的不端行为案件处理结果通报&#xff08;第一批次&#xff09; 近期&#xff0c;经国家自然科学基金委员会监督委员会调查审议、国家自然科学基金委员会委务会议审定&#xff0c;国家自然科学基金委员会对相关科研不端案件涉事主体进行了处理。现将给予通报批评的有…

实战大数据项目

存储日志数据集&#xff08;HDFS&#xff09; 数据仓库构建&#xff08;Hive&#xff09; 数据分区表构建 数据预处理 &#xff08;Spark计算引擎&#xff09;-使用Zeppelin进行写SQL 订单指标分析 Sqoop数据导出到传统数据库&#xff08;Mysql&#xff09; Superset数据…

Java设计模式之适配器模式

目录 1、什么是 Java 适配器模式 2、为什么要使用适配器模式 3、适配器模式的应用场景 4、Java代码中使用适配器的例子 1、什么是 Java 适配器模式 Java 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;用于将一个类的接口转换为客户端…

闲人闲谈PS之四十——项目售前费用归集

惯例闲话&#xff1a;广东这段时间老是下雨&#xff0c;堪比江浙一带梅雨季节&#xff0c;人的心情也像这天气一样&#xff0c;阴雨绵绵。2023年伊始&#xff0c;确实感觉很多事情在发生剧变&#xff0c;这种变化也稍微影响了闲人那本来稳如老狗的心。面对未知和变化&#xff0…