LV.12 D21 PWM实验 学习笔记

news2025/1/4 19:15:54

一、PWD简介

1.1 蜂鸣器工作原理

有源蜂鸣器    

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

无源蜂鸣器    

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

1.2 使用GPIO控制 

while(1)
{   
    GPX2.DAT=GPX2.DAT | (1 << 7); 
    Delay(1000000);
    GPX2.DAT=GPX2.DAT & (~(1 << 7));                                                               
    Delay(1000000);
}   

 

这样虽然可以控制,但是太浪费CPU资源了。

1.3PWM控制

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

 

1.4 PWM参数

周期

占空比

        一个周期中高电平时间与整个周期的比例称为占空比

二、Exynos4412下的PWM控制器 

 

        有五个PWM定时器。可以产生中断。0-3可以通过引脚把信号传送到CPU之外,第0个有死区可以支持大电流.。4是内部定时器没有输出引脚(4412的PWM定时器和看门狗都是递减的)

        PWM使用PCLK(100MHz)作为时钟源,timer 0和1共用一个8位的一级预分频器(1-256倍)。timer2,3,4共用另外一个8位一级分频器  然后每个timer都有一个自己的二级分频器(2,4,8,16倍)

举例:

5、把周期也就是这个159写进TCNTB,把109写进TCMTB,用于设置占空比

6、给计数器使能,需要手动关闭

7、TCNTB把159写进递减计数器,对外的输出引脚开始输出低电平(以前可能输出的是高电平,只要PWM开始工作,就输出低电平)

8、递减计数器减到109,就开始输出高电平

9、如果递减计数器到0,则会产生中断请求

10、递减计数器自动重加载,也就是递减计数器的值会重新编程159,然后一直循环

脉冲信号的周期除了跟TCNTB里的值有关,还跟递减计数器的频率有关。

PWM内部框架图:

 

 反向输出功能:

 三、PWM寄存器详解

TCFG0:用于设置8位的预分频器和死区的宽度的(死区的功能时是保护大功率的设备)

TCFG1:用于设置二级分频

TCON:控制寄存器,用于控制PWM的一些细节功能

TCNTB0、1、2、3、4:用于设置PWM寄存器产生的脉冲信号的周期

TCMPB0、1、2、3、4:用于设置一个周期脉冲信号中高电平的时间的,即设置PWM信号的占空比

TCNTO0、1、2、3、4:用于存储递减计数器中的值(只读)

(0、1、2、3、4表示分别用于设置不同的PWM寄存器)

TCFG0:[23:16]用于设置死区宽度(本次实验不使用)

PWM2、3、4公用一个分频器,通过[15:8]设置分频

PWM0、1公用一个分频器,通过[7:0]设置分频

 TCFG1:二级分频器,每个PWM寄存器都有一个私有的二级分频器

(本次实验实验PWM0,所以只需要设置[3:0]就可以了)

 

 

TCON寄存器可以管理PWM0、1、2、3、4的功能,本次实验使用PWM0,所以只看PWM0相关的

[4]用于设置死区功能的开和关。(本次实验不使用)

[3]用于设置PWM0的自动重装载功能的开和关,如果设置成0,只能产生一次脉冲信号。(本实验设置成1)

[2]用于设置反向功能的开和关,0是关闭,1是打开。

[1]用于设置手动更新,写1会自动把TCNTB的值赋值到递减计数器(先设置TCNTB的值,再把这位置1)

[0]用于设置整个PWM0寄存器的开和关

 用于设置PWM0寄存器产生的脉冲信号的周期(必须比TCMPB0的值大)

 用于设置一个周期脉冲信号中高电平的时间的,即设置PWM0信号的占空比

 用于存储递减计数器中的值(只读)

四、PWM编程

我们把本次实验蜂鸣器配置频率为500Hz

我们首先需要配置引脚GPD0_0,在[3:0]写0x2,配置成PWM TOUT_0功能

#include "exynos_4412.h"

int main()
{
	/*1.将GPD0_0引脚设置成PWM0的输出引脚*/
	GPD0.CON = GPD0.CON & (~(0xF)) | (0x2);
	/*2.设置PWM的一级分频,一级分频倍数为100倍*/
	PWM.TCFG0 = PWM.TCFG0 & (~(0xFF)) | 99;
	/*3.设置PWM的二级分频,二级分频倍数为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)
	{
	}

	return 0;
}

我们还可以让他间断响

#include "exynos_4412.h"

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

int main()
{
	/*1.将GPD0_0引脚设置成PWM0的输出引脚*/
	GPD0.CON = GPD0.CON & (~(0xF)) | (0x2);
	/*2.设置PWM的一级分频,一级分频倍数为100倍*/
	PWM.TCFG0 = PWM.TCFG0 & (~(0xFF)) | 99;
	/*3.设置PWM的二级分频,二级分频倍数为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;
}

五、作业

调成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.设置PWM的一级分频,一级分频倍数为100倍*/
	PWM.TCFG0 = PWM.TCFG0 & (~(0xFF)) | 99;
	/*3.设置PWM的二级分频,二级分频倍数为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;
}

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

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

相关文章

基于SSM实现的图书管理系统

一、系统架构 前端&#xff1a;jsp | js | css | jquery | layui 后端&#xff1a;spring | springmvc | mybatis 环境&#xff1a;jdk1.7 | mysql | maven | tomcat 二、代码及数据库 三、功能介绍 01. 登录页 02. 首页 03. 借阅管理 04. 图书管理 05. 读者管理 06. 类型管理…

数据库-MySQL之数据库必知必会17-21章

第17章 组 合 查 询 创建组合查询 可用UNION操作符来组合数条SQL查询。利用UNION&#xff0c;可给出多条SELECT语句&#xff0c;将它们的结果组合成单个结果集。 **例子&#xff1a;**假如需要价格小于等于5的所有物品的一个列表&#xff0c;而且还想包括供应商1001和1002生产…

树莓派系列教程:单总线控制DS18B20

DS18B20是一个比较常用的温度传感器&#xff0c;采用单总线控制&#xff0c;以前用单片机编程控制时严格按照单总线的时序控制&#xff0c;今天来看看在linux系统下如何控制DS18B20,体验一下在linux世界&#xff0c;一切都是文件。 一、修改配置文件 1sudo vi /boot/config.tx…

JavaScript WebAPI(三)(详解)

这次介绍一下webAPI中的一些知识&#xff1a; 回调函数 回调函数是指 如果将函数A做为参数传递给函数B时&#xff0c;我们称函数A为回调函数 例如&#xff1a; // 立即执行函数中传递的函数是一个回调函数 (function(){ console.log("我是回调函数") })(); // …

CSS技巧:从高度0过渡到自动高度

本文翻译自 CSS trick: transition from height 0 to auto!&#xff0c;作者&#xff1a;Francesco Vetere&#xff0c; 略有删改。 如果你在CSS上花了足够长的时间&#xff0c;很可能你曾尝试过从height:0到auto的平滑过渡。。。却发现它不起作用&#xff01;&#x1f622; ️…

USB Type-C的基本原理

1 USB Type-C的基本原理 1.1 基本特性 Figure 1-1 USB Type-C接头外形 USB Type-C&#xff08;简称USB-C&#xff09;的基本特性&#xff1a; 1. 接口插座的尺寸与原来的Micro-USB规格一样小&#xff0c;约为8.3mm X 2.5mm 2. 可承受1万次反复插拔 3. 支持正反均可插入的“正反…

力扣6.N字形变换

题目描述 思路 模拟轨迹&#xff0c;每当行数i到最顶&#xff08;0&#xff09;&#xff0c;或者最底&#xff08;numRows&#xff09;的时候&#xff0c;就会反方向走。 用flag来标记方向&#xff0c;在题解里看到&#xff0c;真的很巧妙5555&#xff01; 代码 class Solu…

Tomcat-安装与基础配置

Tomcat-安装与基础配置 下载 下载Tomcat9 选择适合自己系统位数的版本下载 Tomcat-目录 bin: 存放启动与关闭Tomcat的脚本文件conf: 存放Tomcat的各种配置文件,其中最主要的配置文件就是server.xml【如果端口冲突,就可以将 8080 端口修改】lib: 存放Tomcat运行时所需的j…

2023-12-01 AIGC-自动生成ppt的AI工具

摘要: 2023-12-01 AIGC-自动生成ppt-记录 自动生成ppt: BoardMix boardmix 一键生成ppt boardmix是一款基于云的ai设计软件&#xff0c;允许创建用于各种目的的自定义演示文稿、ai绘画&#xff0c;ai生成思维导图等。以下是它的一些功能&#xff1a; 可定制的模板 - 它有一个…

基于Web邮箱的邮件系统

题目: 基于web的邮件收发系统设计与实现 摘 要 计算机的应用已经越来越广泛&#xff0c;它从产生到完善已经差不多有50年左右的历史&#xff0c;更新换代速度非常快&#xff0c;在人们生活、工作中都发挥了不可替代的作用&#xff0c;几乎所有行业都离不开它&#xff0c;已经成…

校招笔试-Windows开发工程师客观题合集解析

360公司-2019校招笔试-Windows开发工程师客观题合集 API无法实现进程间数据的相互传递是PostMessage 2.以下代码执行后&#xff0c;it的数据为&#xff08;异常&#xff09; std::list<int> temp; std::list<int>::iterator it temp.begin(); it --it; 3.API…

matlab 无迹卡尔曼滤波

1、内容简介 略 26-可以交流、咨询、答疑 2、内容说明 无迹卡尔曼滤波 无迹卡尔曼滤波 无迹卡尔曼滤波 3、仿真分析 %该文件用于编写无迹卡尔曼滤波算法及其测试 %注解&#xff1a;主要子程序包括&#xff1a;轨迹发生器、系统方程 % 测量方程、UKF滤波器 %----…

微机原理——定时器学习1

目录 定时类型 8253内部结构框图 8253命令字 六种工作方式及输出波形 计数初值的计算与装入 8253的初始化 定时类型 可编程定时器8253&#xff1a;&#xff08;内部采用的是16位 减法计数器&#xff09; 8253内部结构框图 8253命令字 8253有三个命令字&#xff1a;方式命…

39.从0到上线三天搭建个人网站(第三天)

点赞收藏加关注&#xff0c;你也能住大别墅&#xff01; 一、第三天主要工作 1.完成detail页面的开发 2.将所有数据以及部分静态资源存在uniCloud&#xff0c;为以后做管理后台做准备 3.创建云对象getData&#xff0c;在beforecreate&#xff08;&#xff09;中获取数据 4.…

Linux 常用命令集

1、根据端口查询进程号&#xff1a; netstat -nlp | grep 10050 或者使用 lsof -i:10050 2、查询所有服务进程号&#xff1a;top 3、根据进程号查询服务路径 ll /proc/28145/cwd 4、同步网络时间 yum install -y ntpdate ntpdate ntp.aliyun.com 设置定时任务 更新时间 * * * *…

ansible模块

目录 一、ansible的command模块 1.ad-hoc 2.playbook 3.command模块 二、ansible的shell模块 1.shell模块帮助 2.shell模块支持的参数和解释 3.简单试验 4.批量远程执行脚本 三、script模块 1.script模块帮助 2.shell模块支持的参数和解释 3.实践 四、ansible文件…

ESP32-Web-Server编程- 通过滑动条向 Web 提交数据

ESP32-Web-Server编程- 通过滑动条向 Web 提交数据 概述 上一节我们讲述了通过文本框向 ESP32 发送字符串、数字。有时&#xff0c;我们需要向 ESP32 发送连续的值&#xff0c;这种需求可以通过在网页端实现滑动条来实现。 需求及功能解析 本节演示如何在 ESP32 上部署一个…

P4 链表的节点数统计与链表数据查找替换

目录 前言 01 链表的节点数统计 02 链表数据查找替换 2.1 残疾的数据查找 2.2 数据查找优化 前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C 》✨✨✨ &#x1f525; 推荐专栏2: 《 Linux C应用编程&#xff08;概念类&#xff09;》✨…

这几款 idea 插件让效率起飞!

作者&#xff1a;苍何&#xff0c;前大厂高级 Java 工程师&#xff0c;阿里云专家博主&#xff0c;CSDN 2023 年 实力新星&#xff0c;土木转码&#xff0c;现任部门技术 leader&#xff0c;专注于互联网技术分享&#xff0c;职场经验分享。 &#x1f525;热门文章推荐&#xf…

MySQL 教程 1.4

MySQL 连接 使用mysql二进制方式连接 您可以使用MySQL二进制方式进入到mysql命令提示符下来连接MySQL数据库。 实例 以下是从命令行中连接mysql服务器的简单实例&#xff1a; [roothost]# mysql -u root -p Enter password:****** 在登录成功后会出现 mysql> 命令提示窗…