【物联网】PWM控制蜂鸣器
文章目录
- 一、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;
}
相关文章:
【物联网】PWM控制蜂鸣器
文章目录 一、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…...
Python----机器学习(基于PyTorch的乳腺癌逻辑回归)
Logistic Regression(逻辑回归)是一种用于处理二分类问题的统计学习方法。它基于线性回归 模型,通过Sigmoid函数将输出映射到[0, 1]范围内,表示概率。逻辑回归常被用于预测某个实 例属于正类别的概率。 一、数据集介绍 在本例中&…...
5分钟学会接口自动化测试框架
今天,我们来聊聊接口自动化测试。 接口自动化测试是什么?如何开始?接口自动化测试框架如何搭建? 自动化测试 自动化测试,这几年行业内的热词,也是测试人员进阶的必备技能,更是软件测试未来发…...
基于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 …...
visual studio 常用的快捷键(已经熟悉的就不记录了)
以下是 Visual Studio 中最常用的快捷键分类整理,涵盖代码编辑、调试、导航等核心场景: 一、生成与编译 生成解决方案 Ctrl Shift B 一键编译整个解决方案,检查编译错误(最核心的生成操作)编译当前文件 Ctrl F…...
学习记录-接口自动化python数据类型
1.字符串 str "字符串" str_1 字符串1 2.列表[ ] list [1,2,3,4,5,6] list_1 ["boy","girl"] 3.字典{ } key:value 键值对 dict {"name":"小林","age":20} 4.元组( ) tuple …...
大语言模型深度思考与交互增强
总则:深度智能交互的全面升级 在主流大语言模型(LLM)与用户的每一次交互中,模型需于回应或调用工具前,展开深度、自然且无过滤的思考进程。当模型判断思考有助于提升回复质量时,必须即时进行全方位的思考与…...
<C#> 详细介绍.NET 依赖注入
在 .NET 开发中,依赖注入(Dependency Injection,简称 DI)是一种设计模式,它可以增强代码的可测试性、可维护性和可扩展性。以下是对 .NET 依赖注入的详细介绍: 1. 什么是依赖注入 在软件开发里࿰…...
布局决定终局:基于开源AI大模型、AI智能名片与S2B2C商城小程序的战略反推思维
摘要:在商业竞争日益激烈的当下,布局与终局预判成为企业成功的关键要素。本文探讨了布局与终局预判的智慧性,强调其虽无法做到百分之百准确,但能显著提升思考能力。终局思维作为重要战略工具,并非一步到位的战略部署&a…...
构建面向大模型训练与部署的一体化架构:从文档解析到智能调度
作者:汪玉珠|算法架构师 标签:大模型训练、数据集构建、GRPO、自监督聚类、指令调度系统、Qwen、LLaMA3 🧭 背景与挑战 随着 Qwen、LLaMA3 等开源大模型不断进化,行业逐渐从“能跑通”迈向“如何高效训练与部署”的阶…...
告别循环!用Stream优雅处理集合
什么是stream? 也叫Stream流,是jdk8新增的一套API(java.util.stream.*)可以用于操作集合或者数组的数据。 优势:Stream流大量的结合了Lambda语法的风格编程,提供了一种更加强大,更加简单的方式…...
Linux电源管理、功耗管理 和 发热管理 (CPUFreq、CPUIdle、RPM、thermal、睡眠 和 唤醒)
1 架构图 1.1 Linux内核电源管理的整体架构 《Linux设备驱动开发详解:基于最新的Linux4.0内核》图19.1 1.2 通用的低功耗软件栈 《SoC底层软件低功耗系统设计与实现》 1.3 低功耗系统的架构设计;图1-3 2 系统级睡眠和唤醒管理 Linux系统的待机、睡眠…...
OSCP - Proving Grounds -FunboxEasy
主要知识点 弱密码路径枚举文件上传 具体步骤 首先是nmap扫描一下,虽然只有22,80和3306端口,但是事情没那么简单 Nmap scan report for 192.168.125.111 Host is up (0.45s latency). Not shown: 65532 closed tcp ports (reset) PORT …...
探索 Go 与 Python:性能、适用场景与开发效率对比
1 性能对比:执行速度与资源占用 1.1 Go 的性能优势 Go 语言被设计为具有高效的执行速度和低资源占用。它编译后生成的是机器码,能够直接在硬件上运行,避免了 Python 解释执行的开销。 以下是一个用 Go 实现的简单循环计算代码: …...
c++:构造函数(Constructor)与析构函数(Destructor)
目录 为什么我们需要构造函数? 什么是构造函数? 🧬 本质:构造函数是“创建对象的一部分” 为什么 需要析构函数? 什么是析构函数? 析构函数的核心作用 ❗注意点 为什么我们需要构造函数?…...
三周年创作纪念日
文章目录 回顾与收获三年收获的五个维度未来的展望致谢与呼唤 亲爱的社区朋友们,大家好! 今天是 2025 年 4 月 14 日,距离我在 2022 年 4 月 14 日发布第一篇技术博客《SonarQube 部署》整整 1,095 天。在这条创作之路上,我既感慨…...
Vue 3 国际化实战:支持 Element Plus 组件和语言持久化
目录 Vue 3 国际化实战:支持 Element Plus 组件和语言持久化实现效果:效果一、中英文切换效果二、本地持久化存储效果三、element Plus国际化 vue3项目国际化实现步骤第一步、安装i18n第二步、配置i18n的en和zh第三步:使用 vue-i18n 库来实现…...
1.阿里云快速部署Dify智能应用
一、宝塔面板 宝塔面板是一款功能强大且易于使用的服务器管理软件,支持Linux和Windows系统,通过web端可视化操作,优化了建站流程,提供安全管理、计划任务、文件管理以及软件管理等功能。 1.1 宝塔面板的特点与优势 易用性 宝塔面…...
Ubuntu与windows时间同步
由于ubuntu每次重启后时间老是不对,所以使用ntp服务,让ubuntu作为客户端,去同步windows时间。 一、windows服务端配置 1、启用ntp服务 # 启动W32Time服务(若未启动) net start w32time # 配置服务为NTP模式 w32tm /…...
在pycharm配置虚拟环境和jupyter,解决jupyter运行失败问题
记录自己pycharm环境配置和解决问题的流程。 解决pycharm无法运行jupyter代码,仅运行import板块显示运行失败,但是控制台不输出任何错误信息,令人困惑。 遇到的问题是:运行代码左下角显示运行失败但是有没有任何的输出错误信息。 …...
Vue 技术解析:从核心概念到实战应用
Vue.js 是一款流行的渐进式前端框架,以其简洁的 API、灵活的组件化结构和高效的响应式数据绑定而受到开发者的广泛欢迎。本文将深入解析 Vue 技术的核心概念、原理和应用场景,帮助开发者更好地理解和使用 Vue.js。 一、Vue 的设计哲学与核心概念 &…...
Series和 DataFrame是 Pandas 库中的两种核心数据结构
Series 和 DataFrame 是 Pandas 库中的两种核心数据结构,它们各有特点和用途。理解它们之间的区别有助于更高效地进行数据分析和处理。以下是 Series 和 DataFrame 的主要区别: 1. 维度 Series:是一维的数组,可以存储任何类型的…...
关于异步消息队列的详细解析,涵盖JMS模式对比、常用组件分析、Spring Boot集成示例及总结
以下是关于异步消息队列的详细解析,涵盖JMS模式对比、常用组件分析、Spring Boot集成示例及总结: 一、异步消息核心概念与JMS模式对比 1. 异步消息核心组件 组件作用生产者发送消息到消息代理(如RabbitMQ、Kafka)。消息代理中间…...
利用 Python 进行股票数据可视化分析
在金融市场中,股票数据的可视化分析对于投资者和分析师来说至关重要。通过可视化,我们可以更直观地观察股票价格的走势、交易量的变化以及不同股票之间的相关性等。 Python 作为一种功能强大的编程语言,拥有丰富的数据处理和可视化库…...
【Docker】离线安装Docker
背景 离线安装Docker的必要性,第一,在目前数据安全升级的情况下,很多外网已经基本不好访问了。第二,如果公司有对外部署的需求,那么难免会存在对方只有内网的情况,那么我们就要做到学会离线安装。 下载安…...
kubectl命令补全以及oc命令补全
kubectl命令补全 1.安装bash-completion 如果你用的是Bash(默认情况下是),先安装补全功能支持包 sudo apt update sudo apt install bash-completion -y2.为kubectl 启用补全功能 会话中临时: source <(kubectl completion bash)持久化配置&#x…...
《 C++ 点滴漫谈: 三十三 》当函数成为参数:解密 C++ 回调函数的全部姿势
一、前言 在现代软件开发中,“解耦” 与 “可扩展性” 已成为衡量一个系统架构优劣的重要标准。而在众多实现解耦机制的技术手段中,“回调函数” 无疑是一种高效且广泛使用的模式。你是否曾经在编写排序算法时,希望允许用户自定义排序规则&a…...
极简cnn-based手写数字识别程序
1.先看看识别效果: 这个程序识别的是0~9的一组手写数字,这是最终的识别效果,为1,代表识别成功,0为失败。 然后数据源是: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指针:%p!\n", this);}void funcA() {printf("A:funcA()的this指针:%p!\n", this);} };class B { public:int b;B() {prin…...
vue3 history路由模式刷新页面报错问题解决
在使用history路由模式时刷新网页提示404错误,这是改怎么办呢。 官方解决办法 https://router.vuejs.org/zh/guide/essentials/history-mode.html...
