LV.12 D21 PWM实验 学习笔记

一、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.mzph.cn/news/188872.shtml

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

相关文章

Python中用于机器学习的Lazy Predict库

Python是一种多功能语言&#xff0c;你可以用它来做任何事情。Python的一个伟大之处在于&#xff0c;有这么多的库使它变得更加强大。Lazy Predict就是其中一个库。它是机器学习和数据科学的一个很好的工具。在本文中&#xff0c;我们将了解它是什么&#xff0c;它做什么&#…

matlab 无迹卡尔曼滤波

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

LeetCode Hot100 31.下一个排列

题目&#xff1a; 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的下一个字典序更大的排列…

刷题笔记12.01 贪心策略

P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 说最大不超过.不用高精度,好说 #include <bits/stdc.h> using namespace std; int n,n2,a; long long a1[10004],a2[10004],sum; int main() {ios::sync_…

【话题】程序员养生指南(AI生成)

目录 程序猿可能出现的职业病有哪些&#xff1f; 如何预防和对付这些职业病&#xff1f; 一、颈椎病的预防 二、神经衰弱的调适 三、肩周炎的防护 四、视力下降的保护 五、饮食与运动的重要性 六、消化系统职业病的预防 程序员养生心得&#xff1a;呵护健康&#xff0c…

百元挂耳式蓝牙耳机推荐,几款性价比高的开放式蓝牙耳机

在百元价位段&#xff0c;挂耳式蓝牙耳机是备受消费者追捧&#xff0c;提供了出色的音质、便携性和无拘束的使用体验&#xff0c;无论您是追求音乐品质&#xff0c;还是需要在办公或运动中保持通讯畅通&#xff0c;基本上都是离不开耳机的身影&#xff0c;今天小编为大家推荐几…

Burp Suite序列之目录扫描

如果你是一名渗透测试爱好者或者专业人士&#xff0c;你一定知道目录扫描是渗透测试中非常重要的一步。通过目录扫描&#xff0c;我们可以发现网站的敏感信息&#xff0c;隐藏的功能&#xff0c;甚至是后台入口。目录扫描可以帮助我们更好地了解目标网站的结构和漏洞。 但是&a…

卡码网15 .链表的基本操作III

链表的基础操作III 时间限制&#xff1a;1.000S 空间限制&#xff1a;128MB 题目描述 请编写一个程序&#xff0c;实现以下链表操作&#xff1a;构建一个单向链表&#xff0c;链表中包含一组整数数据。 1. 实现在链表的第 n 个位置插入一个元素&#xff0c;输出整个链表的…

软著项目推荐 深度学习实现语义分割算法系统 - 机器视觉

文章目录 1 前言2 概念介绍2.1 什么是图像语义分割 3 条件随机场的深度学习模型3\. 1 多尺度特征融合 4 语义分割开发过程4.1 建立4.2 下载CamVid数据集4.3 加载CamVid图像4.4 加载CamVid像素标签图像 5 PyTorch 实现语义分割5.1 数据集准备5.2 训练基准模型5.3 损失函数5.4 归…

计算机软件的分类

以功能进行分类&#xff0c;计算机软件通常可以分为系统软件和应用软件两大类。 系统软件&#xff1a;系统软件是计算机运行和管理的基本软件&#xff0c;包括操作系统、驱动程序、系统工具和服务程序等。操作系统是系统软件的核心&#xff0c;负责管理计算机的硬件资源、提供用…

python之pyqt专栏10-键盘事件

需求 通过按键盘的上下左右&#xff0c;移动button的位置。 UI界面设计 代码 # 导入sys模块 import sysfrom PyQt6.QtCore import Qt # PyQt6.QtWidgets模块中导入QApplication, QWidget from PyQt6.QtWidgets import QApplication, QWidget# untitled模块中导入Ui_Form类 f…

跨越鸿沟-颠覆性产品营销指南笔记

跨越鸿沟-颠覆性产品营销指南笔记 一、发现鸿沟 一、技术采用生命周期 技术采用生命周期 如果采用一个新产品&#xff0c;我们就得改变一贯的行为模式&#xff0c;或者改变我们依赖的其他产品或服务&#xff0c;那么&#xff0c;我们对技术采用的态度就变得很重要&#xff0c…

shell编程系列(8)-使用sed处理文本

文章目录 引言sed用法详解在文本中定位打印文本替换文本删除文本新增文本 结语 引言 在日常工作学习中我们都会遇到要编辑文本的场景&#xff0c;例如我们要用vim或者nano等命令去编辑代码&#xff0c;处理文本文件等&#xff0c;这些命令的特点都是需要我们进行交互式的实时处…

使用visual Studio MFC 平台实现对灰度图添加椒盐噪声,并进行均值滤波与中值滤波

平滑处理–滤波 本文使用visual Studio MFC 平台实现对灰度图添加椒盐噪声&#xff0c;并进行均值滤波与中值滤波 关于其他MFC单文档工程可参考 01-Visual Studio 使用MFC 单文档工程绘制单一颜色直线和绘制渐变颜色的直线 02-visual Studio MFC 绘制单一颜色三角形、渐变颜色边…

Visual Studio通过ClaudiaIDE插件设置背景图片

首先&#xff0c;在VS菜单栏上选择扩展-管理扩展&#xff0c;搜索插件为 ClaudiaIDE&#xff0c; 下载完成之后&#xff0c;关闭VS&#xff0c;点击Modify按钮安装&#xff1a; 等待安装完成&#xff0c;进入 VS , 打开 工具----选项---- ClauDiaIDE 界面 这个是背景色调 我选的…

2023-12-01 AndroidR 系统在root目录下新建文件夹和创建链接,编译的时候需要修改sepolicy权限

一、想在android 系统的根目录下新建一个tmp 文件夹&#xff0c;建立一个链接usr链接到data目录。 二、在system/core/rootdir/Android.mk里面的LOCAL_POST_INSTALL_CMD 增加 dev proc sys system data data_mirror odm oem acct config storage mnt apex debug_ramdisk tmp …

共享单车停放(简单的struct结构运用)

本来不想写这题的&#xff0c;但是想想最近沉迷玩雨世界&#xff0c;班长又问我这题&#xff0c;就草草写了一下 代码如下&#xff1a; #include<stdio.h> #include<math.h> struct parking{int distance;int remain;int speed;int time;int jud; }parking[50]; …

2021年11月10日 Go生态洞察:Twelve Years of Go

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

前端:实现div的隐藏与显示

效果 完整代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-widt…

2021年12月14日 Go生态洞察:Go 1.18 Beta 1 发布与泛型的引入

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…