lv11 嵌入式开发 PWM 18

目录

1 PWM简介

1.1 蜂鸣器工作原理

1.2 GPIO控制

1.3  PWM控制

2  Exynos4412下的 PWM控制器

2.1 总览

2.2 设置步骤 

2.3 功能框图

2.4 特征 

3 寄存器介绍 

3.1 总览

3.2 TCFG0 一级分频寄存器

 3.3 TCFG1 二级分频寄存器

3.4 TCON控制寄存器

3.5 TCNTB TCMPB TCNTO 

4 PWM编程 

4.1 原理图

5 练习


1 PWM简介

1.1 蜂鸣器工作原理

有源蜂鸣器    

有源蜂鸣器只要接上额定电源就可以发出声音

无源蜂鸣器

无源蜂鸣器利用电磁感应原理,为音圈接入交变电流后形成的电磁铁与永磁铁相吸或相斥而推动振膜发声

1.2 GPIO控制

可以实现pwm的波形,但是占用cpu 

1.3  PWM控制

PWM(Pulse Width Modulation)即脉冲宽度调制,通过对脉冲的宽度进行调制,来获得所需要波形

其实就是定时器

2  Exynos4412下的 PWM控制器

2.1 总览

Exynos 4412 SCP拥有五个32位脉冲宽度调制(PWM)定时器。这些定时器会为ARM子系统生成内部中断。此外,定时器0、1、2和3包括可驱动外部I/O信号的PWM功能。定时器0的PWM具有可选的死区生成器功能,以支持大电流设备。定时器4是一个内部定时器,没有输出引脚。

这些定时器使用APB-PCLK作为时钟源。定时器0和1共享可编程8位预分频器,用于对PCLK进行第一级分频。定时器2、3和4共享另一个8位预分频器。每个定时器都有自己的专用时钟分频器,提供第二级时钟分频(预分频器除以2、4、8或16)。

每个定时器都有自己的32位递减计数器;定时器时钟驱动该计数器。定时器计数缓冲寄存器(TCNTBn)加载递减计数器的初始值。如果递减计数器达到零,它会生成定时器中断请求,通知CPU定时器操作已完成。如果定时器递减计数器达到零,则相应的TCNTBn的值会自动重新加载到递减计数器中,开始下一个循环。但是,如果定时器停止运行,例如在定时器运行模式下清除TCONn的定时器使能位,TCNTBn的值不会重新加载到计数器中。

PWM功能使用TCMPBn寄存器的值。如果递减计数器的值与定时器控制逻辑中的比较寄存器的值匹配,定时器控制逻辑会改变输出电平。因此,比较寄存器确定PWM输出的开启时间或关闭时间。

每个定时器都是双缓冲结构,具有TCNTBn和TCMPBn寄存器,允许在周期中更新定时器参数。新值直到当前定时器周期完成后才会生效。

2.2 设置步骤 

 使用PWM作为脉冲发生器的步骤如下:

  1. 使用159(50 + 109)初始化TCNTBn寄存器,使用109初始化TCMPBn寄存器。
  2. 启动定时器:设置启动位,并手动将该位更新为关闭状态。
  3. 将TCNTBn值159加载到递减计数器中,然后将输出TOUTn设置为低电平。
  4. 如果递减计数器从TCNTBn计数到TCMPBn寄存器中的109,则输出从低电平变为高电平。
  5. 如果递减计数器达到0,则会生成一个中断请求。
  6. 递减计数器会自动重新加载TCNTBn。这将重新启动循环。

2.3 功能框图

2.4 特征 

PWM的特性包括:

  • 五个32位定时器。
  • 两个8位时钟预分频器,用于对PCLK进行第一级分频。五个时钟分频器和多路复用器,用于对预分频器时钟进行第二级分频。
  • 可编程时钟选择逻辑,用于每个PWM通道的独立控制。
  • 四个独立的PWM通道,具有可编程的占空比控制和极性。
  • 静态配置:停止PWM。
  • 动态配置:PWM正在运行。
  • 自动重载和单次脉冲模式。
  • 两个PWM输出上的死区生成器。
  • 等级中断生成。

PWM有两种操作模式,它们是:

  • 自动重载模式:在该模式下,根据编程的占空比和极性生成连续的PWM脉冲。
  • 单次脉冲模式:在该模式下,根据编程的占空比和极性仅生成一个PWM脉冲。

为了控制PWM的功能,提供了18个特殊功能寄存器。PWM是一个AMBA从属模块,具有可编程输出和时钟输入,并且PWM连接到高级外设总线(APB)。可以通过APB事务访问PWM内的这18个特殊功能寄存器。

其余信息略

3 寄存器介绍 

3.1 总览

3.2 TCFG0 一级分频寄存器

用于配置两个8位预分频器和死区或者死区长度。一级分频

 

 3.3 TCFG1 二级分频寄存器

控制五个多路选择位的定时器配置寄存器,二级分频

3.4 TCON控制寄存器

 

 

3.5 TCNTB TCMPB TCNTO 

TCNTB定时器计数寄存器

TCMPB定时器比较寄存器

TCNTO定时器计数值读取寄存器(只读)

 

4 PWM编程 

人的听力范围20Hz-20000hz,实现一个500hz的蜂鸣器

4.1 原理图

GPD0_0驱动蜂鸣器

对应PWM0通道


#include "exynos_4412.h"

void Delay(unsigned int Time)
{
	while(Time --);
}

int main()
{
	/*1.将GPD0_0引脚设置成PWM0的输出引脚*/
	GPD0.CON = GPD0.CON & (~(0xF)) | (0x2);
	/*2.设置PWM0的一级分频	一级分频倍数设置为100倍*/
	PWM.TCFG0 = PWM.TCFG0 & (~(0xFF)) | 99;
	/*2.设置PWM0的二级分频	二级分频倍数设置为1倍  递减计数器递减频率 = PLCK / (99 + 1) / 1 = 1M*/
	PWM.TCFG1 = PWM.TCFG1 & (~(0xF));
	/*4.设置PWM0为自动重装载,使其能够产生连续的脉冲信号*/
	PWM.TCON = PWM.TCON | (1 << 3);
	/*5.设置PWM0的频率为500HZ*/
	PWM.TCNTB0 = 2000;
	/*6.设置PWM0的占空比为50%*/
	PWM.TCMPB0 = 1000;
	/*7.将TCNTB0中的值手动装载到递减计数器*/
	PWM.TCON = PWM.TCON | (1 << 1);
	/*8.关闭手动更新*/
	PWM.TCON = PWM.TCON & (~(1 << 1));
	/*9.使能PWM0,递减计数器开始递减*/
	PWM.TCON = PWM.TCON | 1;

	while(1)
	{
		PWM.TCON = PWM.TCON | 1;
		Delay(1000000);
		PWM.TCON = PWM.TCON & (~(1));
		Delay(1000000);		
	}
	return 0;
}

5 练习

编程实现通过PWM控制蜂鸣器产生"嘀嘀"的声音

注:PWM的频率1000HZ,占空比%60


#include "exynos_4412.h"

void Delay(unsigned int Time)
{
	while(Time --);
}

int main()
{
	/*1.将GPD0_0引脚设置成PWM0的输出引脚*/
	GPD0.CON = GPD0.CON & (~(0xF)) | (0x2);
	/*2.设置PWM0的一级分频	一级分频倍数设置为100倍*/
	PWM.TCFG0 = PWM.TCFG0 & (~(0xFF)) | 99;
	/*2.设置PWM0的二级分频	二级分频倍数设置为1倍  递减计数器递减频率 = PLCK / (99 + 1) / 1 = 1M*/
	PWM.TCFG1 = PWM.TCFG1 & (~(0xF));
	/*4.设置PWM0为自动重装载,使其能够产生连续的脉冲信号*/
	PWM.TCON = PWM.TCON | (1 << 3);
	/*5.设置PWM0的频率为1000HZ*/
	PWM.TCNTB0 = 1000;
	/*6.设置PWM0的占空比为60%*/
	PWM.TCMPB0 = 600;
	/*7.将TCNTB0中的值手动装载到递减计数器*/
	PWM.TCON = PWM.TCON | (1 << 1);
	/*8.关闭手动更新*/
	PWM.TCON = PWM.TCON & (~(1 << 1));
	/*9.使能PWM0,递减计数器开始递减*/
	PWM.TCON = PWM.TCON | 1;

	while(1)
	{
		PWM.TCON = PWM.TCON | 1;
		Delay(1000000);
		PWM.TCON = PWM.TCON & (~(1));
		Delay(1000000);		
	}
	return 0;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

lv12 系统移植导学 1

1 导学 Kernel学习主要包括三块内容&#xff0c;ARM&#xff08;汇编、协议&#xff09;、系统移植、驱动移植 lv12主要时安装系统linux linux主要帮我们实现了5大功能 1 进程、线程管理 2 内存管理 3 网络协议栈管理 4 文件系统管理 5 设备管理 2 移植的目的 不同架构…

Integer和int相比较

Integer和int相比较 一、 Integer类 在Java中&#xff0c;”万物皆对象“&#xff0c;但是八种基本数据类型是个例外&#xff0c;出于性能等方面的考虑&#xff0c;八种基本数据类型没有类和对象的概念&#xff0c;相应的变量值直接在栈内存中存放。但这带来了一些问题&#…

个人博客搭建保姆级教程-发布篇

发布方式 可以使用gitee或者github托管博客内容&#xff0c;然后直接在服务端nginx目录进行拉取。或者将内容压缩&#xff0c;拷贝到对应目录后再进行解压。 发布位置 前面我们已经部署了nginx服务器。这里我们需要将对应的html文件拉取或拷贝到对应的文件夹&#xff0c;即n…

使用linux CentOS本地部署SQL Server数据库

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 安装sql server二. 局域网测试连接三. 安装cpolar内网穿透四. 将sqlserver映射…

IDEA远程调试与JDWP调试端口RCE漏洞

文章目录 前言Docker远程调试Java调试原理远程调试实践 JDWP端口RCE调试端口探测调试端口利用 总结 前言 在对一些 Java CVE 漏洞的调试分析过程中&#xff0c;少不了需要搭建漏洞环境的场景&#xff0c;但是本地 IDEA 搭建的话既麻烦&#xff08;通过 pom.xml 导入各种漏洞组…

[ 蓝桥杯Web真题 ]-布局切换

目录 介绍 准备 目标 规定 思路 解法参考 介绍 经常用手机购物的同学或许见过这种功能&#xff0c;在浏览商品列表的时候&#xff0c;我们通过点击一个小小的按钮图标&#xff0c;就能快速将数据列表在大图&#xff08;通常是两列&#xff09;和列表两种布局间来回切换。…

任何错误都不是单一的原因造成的,你的电脑没有正确启动的错误也不例外

当你的电脑无法启动到Windows时&#xff0c;你可能会看到“你的电脑没有正确启动”的错误。此错误表示启动过程中断&#xff0c;可能需要你注意&#xff0c;也可能不需要你注意。有时你可以通过重新启动计算机来解决这个问题&#xff0c;但如果不起作用&#xff0c;还有其他几种…

STM32——继电器

继电器工作原理 单片机供电 VCC GND 接单片机&#xff0c; VCC 需要接 3.3V &#xff0c; 5V 不行&#xff01; 最大负载电路交流 250V/10A &#xff0c;直流 30V/10A 引脚 IN 接收到 低电平 时&#xff0c;开关闭合。

Spring Boot 3.0 : 集成flyway数据库版本控制工具

目录 Spring Boot 3.0 : 集成flyway数据库版本控制工具flyway是什么为什么使用flyway主要特性支持的数据库&#xff1a; flyway如何使用spring boot 集成实现引入依赖配置sql版本控制约定3种版本类型 运行SpringFlyway 8.2.1及以后版本不再支持MySQL&#xff1f; 个人主页: 【⭐…

【算法Hot100系列】两数之和

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

《深入理解计算机系统》学习笔记 - 第四课 - 浮点数

Floating Point 浮点数 文章目录 Floating Point 浮点数分数二进制示例能代表的数浮点数的表示方式浮点数编码规格化值规格化值编码示例 非规格化的值特殊值 示例IEEE 编码的一些特殊属性四舍五入&#xff0c;相加&#xff0c;相乘四舍五入四舍五入的模式二进制数的四舍五入 浮…

Terminator的layout设置(一个新的一键启动思路)

首先你得有terminator&#xff1a; sudo apt install terminator然后就能使用了&#xff0c;我一般喜欢修改它原本的水平和垂直分割&#xff1a;用ctrlshifta和ctrlshifts 把屏幕先分成多块&#xff1a; 比如是这样的&#xff0c;接下来 右键->点击Preference 弹框中上方标…

C++:this指针

目录 前言 成员函数返回this指向的对象本身时&#xff0c;为什是返回引用类型&#xff1f; 成员函数返回this对象本身时&#xff0c;内部通常会通过拷贝构造函数来创建一个临时对象&#xff1f; 总结 前言 c通过提供特殊的对象指针&#xff0c;this指针 指向被调用的成员函…

Ubuntu下安装SDL

源码下载地址&#xff08;SDL version 2.0.14&#xff09;&#xff1a;https://www.libsdl.org/release/SDL2-2.0.14.tar.gz 将源码包拷贝到系统里 使用命令解压 tar -zxvf SDL2-2.0.14.tar.gz 解压得到文件夹 SDL2-2.0.14 进入文件夹 执行命令 ./configure 执行命令 make…

Linux环境下socket本地通信

最近项目有用到了socket本地通信&#xff0c;故复习一下。之前都是基于本地虚拟机的ip地址通信的&#xff0c;现在项目&#xff0c;Linux单板上面有2个进程需要通信&#xff0c;故用到了本地socket通信&#xff0c;主要其实就是用了sockfd,文件描述符&#xff0c;也叫句柄。 服…

Android系统中使用Cunit测试C/C++接口

Android系统中使用Cunit测试C/C接口 Cunit是C/C语言的单元测试框架&#xff0c;但常用于Windows和Linux开发中。 Android系统中经常有jni、so库、hal service等都是C/C实现&#xff0c;本文讲解如何将Cunit嵌入Android中&#xff0c;用于测试一些C/C api。 Cunit简介 Cunit是很…

什么是CDN?用了CDN一定会更快吗?

文章目录 前言CDN是什么?CDN的工作原理为什么要加个CNAME那么麻烦&#xff1f;怎么知道哪个服务器IP里调用方最近&#xff1f; 回源是什么回源是什么&#xff1f;那还有哪些情况会发生回源呢&#xff1f; 怎么判断是否发生回源用了CDN一定比不用的更快吗&#xff1f;什么情况下…

C语言笔试例题_指针专练30题(附答案解析)

C语言笔试例题_指针专练30题(附答案解析) 指针一直是C语言的灵魂所在&#xff0c;是掌握C语言的必经之路&#xff0c;收集30道C语言指针题目分享给大家&#xff0c;测试环境位64位ubuntu18.04环境&#xff0c;如有错误&#xff0c;恳请指出&#xff0c;文明讨论&#xff01;&am…

【git】关于git二三事

文章目录 前言一、创建版本库1.通过命令 git init 把这个目录变成git可以管理的仓库2.将修改的内容添加到版本库2.1 git add .2.2 git commit -m "Xxxx"2.3 git status 2.4 git diff readme.txt3.版本回退3.1 git log3.2 git reset --hard HEAD^ 二、理解工作区与暂存…

面试 Redis 八股文十问十答第一期

面试 Redis 八股文十问十答第一期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1.Redis数据类型有哪些? String&#xff08;字符串&#xff09;&#xff1a;是…