【物联网】PWM控制蜂鸣器

news2025/4/18 21:11:51

文章目录

  • 一、PWM介绍
    • 1.PWM的频率
    • 2.PWM的周期
  • 二、PWM工作原理分析
  • 三、I.MX6ull PWM介绍
    • 1.时钟信号
    • 2.工作原理
    • 3.FIFO
  • 四、PWM重点寄存器介绍
    • 1.PWM Control Register (PWMx_PWMCR)
    • 2.PWM Counter Register (PWMx_PWMCNR)
    • 3.PWM Period Register (PWMx_PWMPR)
    • 4.PWM Sample Register (PWMx_PWMSAR)
  • 五、PWM驱动蜂鸣器
    • 1.原理图分析
    • 2.编程思路
    • 3.代码实现


一、PWM介绍

PWM(Pulse Width Modulation) 简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在测量、通信、工控等方面。

在这里插入图片描述

1.PWM的频率

是指在1秒钟内, 信号从高电平到低电平再回到高电平的次数,也就是说一秒钟PWM有多少个周期,单位HZ。

2.PWM的周期

T=1/f,T是周期,f是频率。
如果频率为50Hz ,也就是说一个周期是20ms,那么一秒钟就有 50次PWM周期。

是一个脉冲周期内,高电平的时间与整个周期时间的比例(0%-100%)

二、PWM工作原理分析

占空比是高电平
计数器可以决定输出信号的频率,比较器可以决定占空比是多少
在这里插入图片描述

三、I.MX6ull PWM介绍

脉宽调制(PWM)有一个16位计数器,经过优化,可以从存储的样本音频图像中生成声音,还可以生成音调。它使用16位分辨率和4 x 16数据FIFO。
在这里插入图片描述

1.时钟信号

(1)High-frequency reference clock (ipg_clk_highfreq) pat_ref
(这是一个高频时钟,由时钟控制模块(CCM)提供。当ipg_clk关闭时,处于低功耗模式,该时钟应打开)

(2)Low-frequency reference clock (ipg_clk_32k, CKIL)
(这是CCM提供的32 KHz低参考时钟。当ipg_clk关闭时,该时钟应该在低功耗模式下打开。因此,PWM在低功耗模式下使用该时钟运行)

(3) Peripheral clock (ipg_clk)
(该时钟在正常运行时应为开启状态。在低功耗模式下,可将其关闭)

(4) Peripheral access clock (ipg_clk_s)
(该时钟用于寄存器的读/写)

2.工作原理

PWM的输出是一个切换信号,其频率和占空比可以通过编程相应的寄存器来调制。它有一个16位向上计数器,从0x0000开始计数,直到计数器值等于PWM_PR+1。匹配发生后,计数器重置为0x0000。

采样器≈比较器

在计数周期周期的开始,PWMO引脚设置为1(默认),计数器从0x0000开始向上计数。采样值在采样FIFO中,它的值在每个时钟周期和计数器的值比较。当采样值和计数值匹配时,PWMO信号被清除为零(默认)。计数器继续计数,直到周期匹配发生,随后另一个周期周期开始。

当PWM被启用时,计数器开始运行,并使用周期和采样寄存器中的重置值生成输出。建议在启用PWM之前完成这些寄存器的编程。

硬件复位导致所有PWM计数和采样寄存器被清除,FIFO被刷新。控制寄存器显示FIFO为空,可以写入,PWM被禁用。软件复位具有相同的结果,但是控制寄存器中DBGEN、STOPEN、DOZEN和WAITEN位的状态不受影响。即使PWM处于禁用状态,也可以断言软件复位。

3.FIFO

写采样值的时候 会加载到FIFO(缓冲区) 最多写4个16位的数据
如果溢出 会有一个异常寄存器被置1(状态寄存器中的FWE)

数字采样值可以作为16位字加载到脉宽调制器中。可以使用控制寄存器的BCTR和HCTR位来改变字节序。4字(16位)FIFO最大限度地减少了中断开销。当数据字的数量低于控制寄存器中FWM字段设置的水位时,会产生可屏蔽中断。

如果FIFO未满,对PWM_SAR样本寄存器的写入会导致该值被存储到FIFO中。FIFO已满时的写入会设置状态寄存器中的FWE(FIFO写入错误)位,并且FIFO内容保持不变。FIFO可以随时写入,但只有在启用PWM时才能读取。PWM_SR[FIFOAV]字段显示FIFO中当前包含多少数据字以及是否可以写入。

四、PWM重点寄存器介绍

1.PWM Control Register (PWMx_PWMCR)

25 24 23 22 什么工作模式 瞌睡模式(省电) 一般没用
19-18 控制开始使能的时候 是先高再低还是先低再高
2-1 FIFO(缓冲区)的每一个值 可以使用多少次 一般就一次

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.PWM Counter Register (PWMx_PWMCNR)

只读脉冲宽度调制器计数器寄存器(PWM_PWMCNR)包含当前计数值,可以随时读取而不会干扰计数器。
在这里插入图片描述

3.PWM Period Register (PWMx_PWMPR)

PWM周期寄存器(PWM_PWMPR)确定PWM输出信号的周期,计数器值匹配PERIOD+1后,计数器复位以开始另一个周期。

PWMO (Hz) = PCLK(Hz) / (period +2)

由于写入PWM_PWMPR导致的周期值的变化会导致计数器重置为零并开始新的计数周期。
在这里插入图片描述

4.PWM Sample Register (PWMx_PWMSAR)

PWM采样寄存器(PWM_PWMSAR)是FIFO的输入。16位字被加载到FIFO中。FIFO可以随时写入,但只有在启用PWM时才能读取。
在这里插入图片描述

五、PWM驱动蜂鸣器

1.原理图分析

在这里插入图片描述
蜂鸣器CAMERA_MOTOR_PWN_IN1gpio1.IO[9]

2.编程思路

• 使能GPIO和PWM时钟信号
• 管脚设置为PWM功能模式
• 复位PWM控制器
• 选择时钟信号确定PWM的输入时钟信号
• 设置PWM周期值和采样值
• 开启PWM,然后延时一段时间,最后关闭PWM

3.代码实现

运行的时候 需要看波形有没有变化

#include "imx6ull.h"

/**
 * @brief 初始化蜂鸣器对应的PWM输出
 * @param sample 占空比设定值(有效电平时间)
 * @param period 周期值(决定PWM频率)
 */
void beep_init(uint32_t sample, uint32_t period)
{
    /* 开启 PWM2 和 IOMUX 模块的时钟 */
    CCM_CCGR1 |= (0x3 << 26);
    CCM_CCGR4 |= (0x3 << 18);

    /* 设置GPIO1_IO09复用为PWM2输出(ALT0) */
    IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO09 &= ~(0xf << 0);  // 先清零
    IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO09 |= 0x0;          // 配置为ALT0模式

    /* 复位PWM模块 */
    PWM2->PWMCR |= (1 << 3);             // 软复位
    while(PWM2->PWMCR & (1 << 3));       // 等待复位完成

    /*
     * 设置PWM时钟:
     * PWM时钟源为IPG_CLK_ROOT,频率为66MHz
     * 设置预分频器为65,则PWM输入时钟为 66MHz / (65 + 1) = 1MHz
     */
    PWM2->PWMCR = (1 << 16) | (65 << 4); // CLKSRC=1 (IPG_CLK), PRESCALER=65

    /* 设置PWM周期和占空比 */
    PWM2->PWMPR  = period - 2;   // 周期寄存器(减2是硬件要求)
    PWM2->PWMSAR = sample;       // 有效电平时间

    return;
}

/**
 * @brief 启动蜂鸣器(开启PWM)
 */
void beep_start(void)
{
    PWM2->PWMCR |= (1 << 0);    // 使能PWM
}

/**
 * @brief 停止蜂鸣器(关闭PWM)
 */
void beep_stop(void)
{
    PWM2->PWMCR &= ~(1 << 0);   // 关闭PWM
}

/**
 * @brief 设置蜂鸣器PWM占空比
 * @param value 占空比值(有效电平时间)
 */
void set_sample_value(uint32_t value)
{
    PWM2->PWMSAR = value;
}

/**
 * @brief 蜂鸣器测试函数,逐渐调整占空比
 */
void beep_test(void)
{
    int i;

    /* 初始化蜂鸣器,PWM频率为1kHz,占空比初始为50% */
    beep_init(500, 1000);

    beep_start();

    /* 循环改变占空比,从0%到100% */
    for(i = 0; i <= 100; i++){
        set_sample_value(i * 10);      // 设置占空比
        gpt_delay_ms(500);            // 延时500ms
    }

    beep_stop();

    return;
}

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

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

相关文章

Python----机器学习(基于PyTorch的乳腺癌逻辑回归)

Logistic Regression&#xff08;逻辑回归&#xff09;是一种用于处理二分类问题的统计学习方法。它基于线性回归 模型&#xff0c;通过Sigmoid函数将输出映射到[0, 1]范围内&#xff0c;表示概率。逻辑回归常被用于预测某个实 例属于正类别的概率。 一、数据集介绍 在本例中&…

5分钟学会接口自动化测试框架

今天&#xff0c;我们来聊聊接口自动化测试。 接口自动化测试是什么&#xff1f;如何开始&#xff1f;接口自动化测试框架如何搭建&#xff1f; 自动化测试 自动化测试&#xff0c;这几年行业内的热词&#xff0c;也是测试人员进阶的必备技能&#xff0c;更是软件测试未来发…

基于FreeRTOS和LVGL的多功能低功耗智能手表(APP篇)

目录 一、简介 二、软件框架 2.1 MDK工程架构 2.2 CubeMX框架 2.3 板载驱动BSP 1、LCD驱动 2、各个I2C传感器驱动 3、硬件看门狗驱动 4、按键驱动 5、KT6328蓝牙驱动 2.4 管理函数 2.4.1 StrCalculate.c 计算器管理函数 2.4.2 硬件访问机制-HWDataAccess 2.4.3 …

布局决定终局:基于开源AI大模型、AI智能名片与S2B2C商城小程序的战略反推思维

摘要&#xff1a;在商业竞争日益激烈的当下&#xff0c;布局与终局预判成为企业成功的关键要素。本文探讨了布局与终局预判的智慧性&#xff0c;强调其虽无法做到百分之百准确&#xff0c;但能显著提升思考能力。终局思维作为重要战略工具&#xff0c;并非一步到位的战略部署&a…

告别循环!用Stream优雅处理集合

什么是stream&#xff1f; 也叫Stream流&#xff0c;是jdk8新增的一套API&#xff08;java.util.stream.*&#xff09;可以用于操作集合或者数组的数据。 优势&#xff1a;Stream流大量的结合了Lambda语法的风格编程&#xff0c;提供了一种更加强大&#xff0c;更加简单的方式…

Linux电源管理、功耗管理 和 发热管理 (CPUFreq、CPUIdle、RPM、thermal、睡眠 和 唤醒)

1 架构图 1.1 Linux内核电源管理的整体架构 《Linux设备驱动开发详解&#xff1a;基于最新的Linux4.0内核》图19.1 1.2 通用的低功耗软件栈 《SoC底层软件低功耗系统设计与实现》 1.3 低功耗系统的架构设计&#xff1b;图1-3 2 系统级睡眠和唤醒管理 Linux系统的待机、睡眠…

OSCP - Proving Grounds -FunboxEasy

主要知识点 弱密码路径枚举文件上传 具体步骤 首先是nmap扫描一下&#xff0c;虽然只有22&#xff0c;80和3306端口&#xff0c;但是事情没那么简单 Nmap scan report for 192.168.125.111 Host is up (0.45s latency). Not shown: 65532 closed tcp ports (reset) PORT …

Vue 3 国际化实战:支持 Element Plus 组件和语言持久化

目录 Vue 3 国际化实战&#xff1a;支持 Element Plus 组件和语言持久化实现效果&#xff1a;效果一、中英文切换效果二、本地持久化存储效果三、element Plus国际化 vue3项目国际化实现步骤第一步、安装i18n第二步、配置i18n的en和zh第三步&#xff1a;使用 vue-i18n 库来实现…

1.阿里云快速部署Dify智能应用

一、宝塔面板 宝塔面板是一款功能强大且易于使用的服务器管理软件&#xff0c;支持Linux和Windows系统&#xff0c;通过web端可视化操作&#xff0c;优化了建站流程&#xff0c;提供安全管理、计划任务、文件管理以及软件管理等功能。 1.1 宝塔面板的特点与优势 易用性 宝塔面…

在pycharm配置虚拟环境和jupyter,解决jupyter运行失败问题

记录自己pycharm环境配置和解决问题的流程。 解决pycharm无法运行jupyter代码&#xff0c;仅运行import板块显示运行失败&#xff0c;但是控制台不输出任何错误信息&#xff0c;令人困惑。 遇到的问题是&#xff1a;运行代码左下角显示运行失败但是有没有任何的输出错误信息。 …

【Docker】离线安装Docker

背景 离线安装Docker的必要性&#xff0c;第一&#xff0c;在目前数据安全升级的情况下&#xff0c;很多外网已经基本不好访问了。第二&#xff0c;如果公司有对外部署的需求&#xff0c;那么难免会存在对方只有内网的情况&#xff0c;那么我们就要做到学会离线安装。 下载安…

极简cnn-based手写数字识别程序

1.先看看识别效果&#xff1a; 这个程序识别的是0~9的一组手写数字&#xff0c;这是最终的识别效果&#xff0c;为1&#xff0c;代表识别成功&#xff0c;0为失败。 然后数据源是&#xff1a;ds deeplake.load(hub://activeloop/optical-handwritten-digits-train)里面是一组…

C++核心机制-this 指针传递与内存布局分析

示例代码 #include<iostream> using namespace std;class A { public:int a;A() {printf("A:A()的this指针&#xff1a;%p!\n", this);}void funcA() {printf("A:funcA()的this指针&#xff1a;%p!\n", this);} };class B { public:int b;B() {prin…

vue3 history路由模式刷新页面报错问题解决

在使用history路由模式时刷新网页提示404错误&#xff0c;这是改怎么办呢。 官方解决办法 https://router.vuejs.org/zh/guide/essentials/history-mode.html

PHP爬虫教程:使用cURL和Simple HTML DOM Parser

一个关于如何使用PHP的cURL和HTML解析器来创建爬虫的教程&#xff0c;特别是处理代理信息的部分。首先&#xff0c;我需要确定用户的需求是什么。可能他们想从某个网站抓取数据&#xff0c;但遇到了反爬措施&#xff0c;需要使用代理来避免被封IP。不过用户没有提到具体的目标网…

3.2.2.1 Spring Boot配置静态资源映射

在Spring Boot中配置静态资源映射&#xff0c;可以通过默认路径或自定义配置实现。默认情况下&#xff0c;Spring Boot会在classpath:/static/等目录下查找静态资源。若需自定义映射&#xff0c;可通过实现WebMvcConfigurer接口的addResourceHandlers方法或在全局配置文件中设置…

# 更换手机热点后secureCRT无法连接centOS7系统

更换手机热点后secureCRT无法连接centOS7系统 一、问题描述 某些情况下&#xff0c;我们可能使用手机共享热点而给电脑联网。本来用一个手机热点共享网络时&#xff0c;SecureCRT可以正常连接到CentOS 7虚拟机&#xff0c;当更换一个手机热点时&#xff0c;突然发现SecureCR…

jupyter notebook 无法启动- markupsafe导致

一、运行jupyter notebook和Spyder报错&#xff1a;(已安装了Anaconda&#xff0c;以前可打开) 1.背景&#xff1a;为了部署机器学习模型&#xff0c;按教程直接安装了flask 和markupsafe&#xff0c;导致jupyter notebook&#xff0c;Spyder 打不开。 pip install flas…

CTF web入门之命令执行 完整版

web29 文件名过滤 由于flag被过滤,需要进行文件名绕过,有以下几种方法: 1.通配符绕过 fla?.* 2.反斜杠绕过 fl\ag.php 3.双引号绕过 fl’‘ag’.php 还有特殊变量$1、内联执行等 此外 读取文件利用cat函数,输出利用system、passthru 、echo echo `nl flag.php`; ec…

Java 开发工具:从 Eclipse 到 IntelliJ IDEA 的进化之路

Java 开发工具&#xff1a;从 Eclipse 到 IntelliJ IDEA 的进化之路 在 Java 开发的历史长河中&#xff0c;开发工具的演变不仅改变了程序员的编码方式&#xff0c;也深刻影响了整个行业的开发效率和代码质量。从 Eclipse 到 IntelliJ IDEA&#xff0c;这不仅是工具的更替&…