ARM嵌入式学习--第八天(PWM)
PWM
-PWM介绍
PWM(pulse Width Modulation)简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在测量,通信,工控等方面
PWM的频率
是指在1秒钟内,信号从高电平到低电平在回到高电平的次数,也就是说1秒钟PWM有多少个周期,单位HZ
PWM的周期
T=1/f,T是周期,f是频率,即如果频率为50HZ,也就是说一个周期是20ms,那么1秒钟就有50个PWM周期
占空比
是一个脉冲周期内,高电平的时间与整个周期时间的比例(0%~100%)
总结
1.脉冲周期(T),单位是时间,比如纳秒(ns),微秒(us),毫秒(ms)等
2.脉冲频率(f),单位是HZ,KHZ等,与脉冲周期成倒数关系,f=1/T
3.脉冲宽度(W),简称“脉宽”,是脉冲高电平持续的时间,单位是时间
4.占空比(D),脉宽除以脉冲周期的值,百分比表示,比如50%,也常有小数或分数表示的,比如0.5或1/2
以上之间的关系如图所列的公式:
-PWM的工作原理分析(IMX6ull)
脉宽调制(PWM)有一个16位计数器,经过优化,可以从存储的样本音频图像中生成声音,还可以生成音调,它使用16位分辨率(指的就是16位计数器)4 x 16数据FIF0[缓存]
工作原理
PWM的输出是一个切换信号,其频率和占空比可以通过编程相应的寄存器来调制,它有一个16位向上计数器,从0x0000开始计数,直到计数器值等于PWM_PR+1,匹配发生后,计数器重置为0x0000(PWM_PR是周期寄存器)
在计数周期的开始,PWM0引脚设置为1(默认),计数器从0x0000开始向上计数,采样值在采样FIF0中,它的值在每个时钟周期和计数器的值比较,当采样值和计数器匹配时,PWM0信号被清除为0(默认),计数器继续计数,直到周期匹配发生,随后另一个周期开始
当PWM被启用时,计数器开始运行,并使用周期和采样寄存器中的重置值生成输出,建议在启用PWM之前完成这些寄存器的编程
硬件复位导致所有PWM计数和采样寄存器被清除,FIF0被刷新,控制寄存器显示FIF0为空,可以写入,PWM被禁用,软件复位具有相同的结果,但是控制寄存器中DBGEN,STOPEN,DOZEN和WAITEN位的状态不受影响,只有PWM处于禁用状态,才可以进行软件复位
FIF0
数字采样值可以作为16位字加载到脉冲调制器中,可以使用控制器的BCTR和HCTR位来改变字节序,4字(16位)FIF0最大限度地减少了中断开销。当数据字的数量低于控制寄存器的FWM字段设置的水位时,会产生可屏蔽中断。
如果FIF0未满,对PWM_SAR采样寄存器的写入会导致该值被存储到FIF0中,FIF0已满时的写入会设置状态寄存器中的FWE(FIF0写入错误)位,并且FIF0内容保持不变,FIF0可以随时写入,但只有在启用PWM时,才能读取,PWM_SR[FIF0AV]字段显示FIF0中当前包含多少数据字以及是否可以写入
-PWM重点寄存器介绍
PWM Control Register (PWMx_PWMCR)
PWM Counter Register (PWMx_PWMCNR)
只读脉冲宽度调制器计数器寄存器(PWM_PWMCNR)包含当前计数值,可以随时读取而不会干扰计数器
PWM Period Register(PWMx_PWMPR)
PWM周期寄存器(PWM_PWMPR)确定PWM输出信号的周期,计时器值匹配PERIOD+1后,计数器复位以开始另一个周期(PWMO[Hz] = PLCK[Hz]/period+2)
(由于写入PWM_PWMPR导致的周期值的变化会导致计数器重置为零并开始新的计数周期)
PWM Sample Register(PWMx_PWMSAR)
PWM采样寄存器(PWM_PWMSAR)是FIF0的输入,16位字被加载带FIF0的输入。FIF0可以随时写入,但只有启用PWM时才能读取
-PWM驱动蜂鸣器
原理图分析
原理图通过GPIO_9这个IO来控制蜂鸣器,当GPIO_9输出低电平的时蜂鸣器发声。设置GPIO1_9的MUX mod为PWM的工作模式,不同的占宽比让蜂鸣器发出的响声不一样
编程思路
1.使能GPIO和PWM时钟信号
2.管脚设置为PWM功能模式
3.复位PWM控制器
4.选择时钟信号确定PWM的输入时钟信号
5.设置PWM周期值和采样值
6.开启PWM,然后延时一段时间,最后关闭PWM
示例代码
pwm.c
#include "pwm.h"void pwm_gpio_init(){//开启时钟CCM_CCGR1 |= (0x3 << 26);// 设置复用器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO09 &=~(0xf<<0);//设置方向GPIO1->GDIR |= (0x1<<9);
}//pwm的初始化
void pwm_init(){//开启时钟CCM->CCGR4 |= (0x3 << 18);//禁用PWMPWM2->PWMCR &= ~(0x1 <<0);//软件复位PWM2->PWMCR |= (0x1<<3);while (PWM2->PWMCR & (0x1 << 3)){}//选择时钟源PWM2->PWMCR &= ~(0x3<<16);PWM2->PWMCR |= (0x1 << 16);// 设置pwm的时钟分频器PWM2->PWMCR &= ~(0xfff << 4);PWM2->PWMCR |= (0x41 << 4);//设置周期PWM2->PWMPR = PERIOD - 2;
}//打开PWM
void pwm_on(){// 使能pwmPWM2->PWMCR |= (0x1 << 0);
}//关闭PWM
void pwm_off(){// 关闭pwmPWM2->PWMCR &= ~(0x1 << 0);
}// 设置采样值
void pwm_set_sample_val(int val){PWM2->PWMSAR = val;
}//测试
void pwm_test(){pwm_gpio_init();pwm_init();pwm_on();int i=0;for(;i<=10;i++){pwm_set_sample_val(i*100);gpt_delay_mseconds(500);}pwm_off();
}
pwm.h
#ifndef __PWM_HEAD_
#define __PWM_HEAD_#include "../../include/imx6ull.h"
#include "../driver/gpt/gpt.h"
#include <stdio.h> #define PERIOD 1000extern void pwm_test();
#endif
相关文章:

ARM嵌入式学习--第八天(PWM)
PWM -PWM介绍 PWM(pulse Width Modulation)简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在测量,通信,工控等方面 PWM的频率 是指在1秒钟内,信号从…...

遇到“REMOTE HOST IDENTIFICATION HAS CHANGED!”(远程主机识别已更改)的警告
连接虚拟机时提示报错: [insocoperhq-soc-cap-raw3 ~]$ ssh root10.99.141.104WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-midd…...

vue3前端组件库的搭建与发布(一)
前言: 最近在做公司项目中,有这么一件事情,很是头疼,就是同一套代码,不同项目,要改相同bug,改好多遍,改的都想吐,于是就想做一个组件库,这样更新一下就全都可…...

COMSOL快捷键及内置函数
文章目录 COMSOL快捷键使用COMSOL算子求最大值和最小值COMSOL内置函数3.1 解析函数3.2 插值函数3.3 分段函数3.4 高斯脉冲函数3.5 斜坡函数3.6 矩形函数3.7 波形函数3.8 随机函数3.9 Matlab函数3.10 SWITCH函数 COMSOL快捷键 Ctrl+/ 可快速打开预定义的物理量列表。…...

HUAWEI-eNSP交换机链路聚合(手动负载分担模式)
配置思路:HUAWEI交换机链路聚合有LACP模式跟手动负载分担模式,本文主打手动负载分担模式:首先交换机-PC之间划分基本vlan,交换机-交换机之间创建链路聚合组,划分端口至链路聚合分组(缺省模式为手动负载分担模式)。结果验证要求同vlan可以ping通,关闭某个聚合端口后仍可…...

番外篇 | Hyper-YOLO:超图计算与YOLO架构相结合成为目标检测新的SOTA !
前言:Hello大家好,我是小哥谈。Hyper-YOLO,该方法融合了超图计算以捕捉视觉特征之间复杂的高阶关联。传统的YOLO模型虽然功能强大,但其颈部设计存在局限性,限制了跨层特征的融合以及高阶特征关系的利用。Hyper-YOLO在骨干和颈部的联合增强下,成为一个突破性的架构。在COC…...

【MATLAB第109期】基于MATLAB的带置信区间的RSA区域敏感性分析方法,无目标函数
【MATLAB第108期】基于MATLAB的带置信区间的RSA区域敏感性分析方法,无目标函数 参考第64期文章【MATLAB第64期】【保姆级教程】基于MATLAB的SOBOL全局敏感性分析模型运用(含无目标函数,考虑代理模型) 创新点: 1、采…...
Bootstrap 表格
Bootstrap 表格 引言 Bootstrap 是一个流行的前端框架,它提供了一套丰富的工具和组件,用于快速开发响应式和移动设备优先的网页。在本文中,我们将重点讨论 Bootstrap 中的表格组件,包括其基本结构、样式以及如何使用 Bootstrap …...

【论文阅读】Computing the Testing Error without a Testing Set
https://blog.csdn.net/qq_40021158/article/details/109485216 可以使用测试集来估计训练集和测试集之间的性能差距,但是要避免过度拟合测试数据几乎是不可能的。 使用隔离的测试集可能会解决此问题,但这需要不断更新数据集,这是一项非常昂贵…...
Visio——同一个工程导出的PDF文件大小不一样的原因分析
现象 在不同电脑,导出来的PDF文件大小不一样。 原因分析 文件小的未将字体嵌入,文件大的已经将字体嵌入了。...

【ETCD】ETCD 架构揭秘:内部各组件概览
ETCD 的主要组件及它们之间的关联关系如下: 目录 1. Client(客户端)2. gRPC 接口3. Etcd Server Main Loop(ETCD 主循环)4. Raft(共识模块)5. Peer Etcd Nodes(ETCD 集群节点&#x…...

Qt WORD/PDF(四)使用 QAxObject 对 Word 替换(QWidget)
关于QT Widget 其它文章请点击这里: QT Widget 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 姊妹篇: Qt WORD/PDF(一)使用 QtPdfium库实现 PDF 操作 Qt WORD/PDF(二…...
音视频学习(二十四):hls协议
基本原理 HLS协议通过将视频文件切分成多个小的媒体段(通常是10秒左右的.ts文件),并通过HTTP传输给客户端。视频播放过程中,客户端按顺序请求这些小段文件来逐步播放整个视频流。HLS还支持多种码率,以便适应不同网络条…...
UniDepth 学习笔记
摘要 准确的单目度量深度估计(MMDE)是解决三维感知和建模中下游任务的关键。然而,最近的MMDE方法的显著准确性仅限于其训练领域。这些方法存在适度的域间隙,也不能推广到看不见的域,这阻碍了它们的实际适用性。本文提出…...

PVE——OpenWRT 硬盘 size单位的调整
问题:初始状态为120MB 还需要进行计算,如果通过图形界面添加磁盘会出现单位不变的情况。 进入命令行前记得给你的虚拟机拍照,防止误操作 通过ssh 进入PVE命令行 按需添加容量即可 不到1G 会显示M 超过1G 不是G整数均为M单位。 …...
Android-ImagesPickers 拍照崩溃优化
Android-ImagesPickers 作为老牌图片选择器,帮助了很多牛马宝宝,刚好最近用到了多相册选择以及拍照,可能是高版本机型问题,导致拍照后就闪退 原作者文章以及git Android实用视图动画及工具系列之九:漂亮的图片选择器…...
Linux dd 命令详解:工作原理与实用指南(C/C++代码实现)
这段代码是一个模仿 Linux dd 命令的工具,它用于在不同文件之间复制数据。dd 是一个非常强大的命令行工具,可以用于数据备份、转换和复制。下面我将详细解释这段代码的原理、实现方式以及如何运行和测试。 Linux dd 命令的工作原理 dd 命令是 Unix 和 …...

Golang学习历程【第一篇 入门】
Golang学习历程【第一篇 入门Hello World】 1. 学习文档2. Window 本地安装Go2.1 安装2.2 验证 3. 开发环境——VsCode3.1 VsCode 安装3.2 安装插件3.2.1 language 语言汉化插件安装3.2.2 Go插件安装 4. Hello World 入门4.1 建工程4.2 创建项目文件4.3 编写Hello World程序4.4…...
青少年编程与数学 02-004 Go语言Web编程 01课题、Web应用程序
青少年编程与数学 02-004 Go语言Web编程 01课题、Web应用程序 课题摘要:一、Web应用程序二、Web服务器(一)什么是Web服务器(二)Web服务器配置1. 选择服务器软件2. 安装服务器软件3. 配置服务器4. 安全设置5. 部署网站内容6. 测试服…...
【mysql】如何解决主从架构从库延迟问题
目录 1. 说明2.优化主库的写入性能3. 优化网络性能4. 增强从库的硬件性能5. 调整从库的配置6. 主从架构优化7. 监控和调优8.使用 GTID 和 Group Replication 1. 说明 1.在 MySQL 数据库中,从库延迟(replication lag)是指主库和从库之间的数据…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...

归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...