Exynos_4412——PWM实验

news2024/11/26 2:38:50

目录

一、PWM简介

1.1蜂鸣器工作原理

有源蜂鸣器

无源蜂鸣器

1.2使用GPIO控制

1.3PWM控制

1.4PWM参数

 周期​

占空比

二、Exynos_4412下的PWM控制器

三、PWM寄存器详解

四、PWM编程


一、PWM简介

1.1蜂鸣器工作原理

有源蜂鸣器

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

无源蜂鸣器

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

人可以听到20-20000Hz的声音

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.4PWM参数

 周期

占空比

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

二、Exynos_4412下的PWM控制器

 有五个PWM定时器。可以产生中断。0-3支持GPIO,0有死区可以支持大电流.。4是内部定时器没有输出引脚(4412的PWM定时器和看门狗都是递减的)

PWM死区(Dead Zone)的作用和意义_Python-Jack的博客-CSDN博客

 DSP里的PWM死区-电子发烧友网

PWM使用PCLK(100MHz)作为时钟源,timer 0和1共用一个8位的一级预分频器(1-256倍)

timer2,3,4共用另外一个8位一级分频器  然后每个timer都有一个自己的二级分频器(2,4,8,16)

把周期也就是这个159写进TCNTB,把占空比写进TCMTB

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

TCNTB把159写进递减计数器,对外的输出引脚开始输出低电平,以前输出的是高电平

递减计数器减到109开始输出高电平

如果递减计数器到0产生中断

递减计数器自动重加载,然后一直循环

反向输出功能 

三、PWM寄存器详解

这个实验不需要设置死区因为就应该蜂鸣器,然后咱们是定时器0所以设置【7:0】位就行。 

 看一下TCON,我们只需要关注timer0这部分

 

【4】死区的开关

【3】输出一个周期还是连续输出

【2】反向功能的开关

【1】 第一个周期TCNTB里的值不会自动装到递减计数器里,把这位写1就会把这个值装到递减计数器里,后续的会自动重装

【0】写1开启递减计数器,写0关闭

这俩上面讲工作原理时说过了,但是注意周期一定要比高电平这个寄存器里的值大 

如果想知道递减计数器里的值可以读一下这个寄存器

四、PWM编程

为了听起来舒服一些这个实验配置频率为500Hz

还是先解压出来一个工程模板并改下名

 

先配置一下GPIO的引脚 

#include "exynos_4412.h"

int main()
{
    //GPD0_0设置PWM0输出功能
    GPD0.CON = GPD0.CON & (~(0xF)) | (0x2);
    //PWM0一级分频  100倍
    PWM.TCFG0 = PWM.TCFG0 & (~(0xFF)) | (99);
    //PWM0二级分频  1倍  PCLk/(99+1)/(0+1) = 1MHz
    PWM.TCFG1 = PWM.TCFG1 & (~(0xF));
    //设置PWM0自动重装 
    PWM.TCON = PWM.TCON | (1<<3);
    //设置周期 500
    PWM.TCNTB0 = 2000;
    //占空比 50%
    PWM.TCMPB0 = 1000;
    //手动装载
    PWM.TCON = PWM.TCON | (1 << 1);
    //关闭手动装载
    PWM.TCON = PWM.TCON & (~(1 << 1));
    //使能PWM0
    PWM.TCON = PWM.TCON | 1;

    while(1)
    {
        
    }
    
	return 0;
}

 声音还可以,我们还可以让他间断响

#include "exynos_4412.h"

void delay(unsigned int time)
{
	while(time --);
}

int main()
{
    //GPD0_0设置PWM0输出功能
    GPD0.CON = GPD0.CON & (~(0xF)) | (0x2);
    //PWM0一级分频  100倍
    PWM.TCFG0 = PWM.TCFG0 & (~(0xFF)) | (99);
    //PWM0二级分频  1倍  PCLk/(99+1)/(0+1) = 1MHz
    PWM.TCFG1 = PWM.TCFG1 & (~(0xF));
    //设置PWM0自动重装 
    PWM.TCON = PWM.TCON | (1<<3);
    //设置周期 500
    PWM.TCNTB0 = 2000;
    //占空比 50%
    PWM.TCMPB0 = 1000;
    //手动装载
    PWM.TCON = PWM.TCON | (1 << 1);
    //关闭手动装载
    PWM.TCON = PWM.TCON & (~(1 << 1));
    //使能PWM0
    PWM.TCON = PWM.TCON | 1;

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

现在改成频率1000Hz,占空比60%试一试,这次声音有点像以前小灵通

#include "exynos_4412.h"

void delay(unsigned int time)
{
	while(time --);
}

int main()
{
    //GPD0_0设置PWM0输出功能
    GPD0.CON = GPD0.CON & (~(0xF)) | (0x2);
    //PWM0一级分频  100倍
    PWM.TCFG0 = PWM.TCFG0 & (~(0xFF)) | (99);
    //PWM0二级分频  1倍  PCLk/(99+1)/(0+1) = 1MHz
    PWM.TCFG1 = PWM.TCFG1 & (~(0xF));
    //设置PWM0自动重装 
    PWM.TCON = PWM.TCON | (1<<3);
    //设置周期 1000
    PWM.TCNTB0 = 1000;
    //占空比 60%
    PWM.TCMPB0 = 600;
    //手动装载
    PWM.TCON = PWM.TCON | (1 << 1);
    //关闭手动装载
    PWM.TCON = PWM.TCON & (~(1 << 1));
    //使能PWM0
    PWM.TCON = PWM.TCON | 1;

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

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

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

相关文章

主流的4种跨隔离网文件摆渡方式对比介绍

网络上承载了太多企业的业务&#xff0c;其安全性一定要得到保障&#xff0c;所以很多企业和机构都会选择将网络进行隔离划分&#xff0c;比如内外网隔离&#xff0c;办公网、研发网隔离等&#xff0c;也有不少企业会选择用云桌面的形式。 然而网络的建设就是为了互通的&#x…

【学vue跟玩一样】快速搞懂vue渲染

Vue的渲染分为条件渲染和列表渲染&#xff0c;那究竟什么式渲染呢?1.条件渲染1.v-if写法:(1)v-if"表达式"(2)v-else-if"表达式"(3)v-else"表达式"&#xff08;和我们曾经学过的JavaScript里面的if语句几乎一样&#xff09;适用于:切换频率较低的…

React umi中使用sass

umi默认支持less和css&#xff0c;如果想要使用sass&#xff0c;需要安装插件以及配置 一、安装umi的sass插件 yarn add umijs/plugin-sass 二、安装sass依赖 yarn add sass-loader node-sass 三、配置sass 在config/config.js或者 .umirc.ts文件中配置如下&#xff1a; sa…

linux 卸载elasticsearch及安装elasticsearch8.5(rpm)

目录 卸载elasticsearch rpm安装elasticsearch8.5 卸载elasticsearch # 检查elasticsearch服务状态 systemctl status elasticsearch.service; # 停止elasticsearch服务状态 systemctl stop elasticsearch.service; # 剔除elasticsearch服务 systemctl disable elasticsea…

宏任务和微任务JS执行顺序题目+总结

宏任务和微任务 resolve&#xff08;传的参数&#xff09;标记成功&#xff0c;会调用promise.then 练习网站&#xff1a; 关于promise深入理解太长没来及看 博客文章&#xff1a; promise本身是同步的&#xff0c;then/catch的回调函数是异步的 直接做题加深理解 点常见面…

漱玉转债,合力转债上市价格预测

漱玉转债基本信息转债名称&#xff1a;漱玉转债&#xff0c;评级&#xff1a;AA-&#xff0c;发行规模&#xff1a;8.0亿元。正股名称&#xff1a;漱玉平民&#xff0c;今日收盘价&#xff1a;18.1&#xff0c;转股价格&#xff1a;21.27。当前转股价值 转债面值 / 转股价格 *…

2.机器学习问题

2.机器学习问题 监督学习 监督学习&#xff08;supervised learning&#xff09;擅长在“给定输入特征”的情况下预测标签。 每个“特征-标签”对都称为一个_样本_&#xff08;example&#xff09;。 有时&#xff0c;即使标签是未知的&#xff0c;样本也可以指代输入特征。 …

手写RPC框架04-过滤器模块实现

源代码地址&#xff1a;https://github.com/lhj502819/IRpc/tree/v5 系列文章&#xff1a; 注册中心模块实现路由模块实现序列化模块实现过滤器模块实现自定义SPI机制增加框架的扩展性的设计与实现 为什么需要过滤器&#xff1f; 目前整个RPC框架的功能基本已经齐全了&…

ArcGIS基础实验操作100例--实验54 Shapfile与Graphic转换

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验54 Shapfile与Graphic转换 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff…

2022天翼数字科技生态大会 五大亮点看永不落幕的“5G物联生态城”

2022天翼数字科技生态大会&#xff0c;近日于线上隆重开幕。大会首次“云”上绽放&#xff0c;将给我们带来一场怎样的科技盛宴&#xff1f; 本次大会&#xff0c;中国电信天翼物联以“智启物联未来”为主题&#xff0c;运用“元宇宙”VR技术&#xff0c;打造虚拟世界中的“5G物…

Netty 创建高性能聊天室 单聊 群聊 websocket

目录 一、简单实现Netty发送消息的案例 二、websocket连接注册用户 三、实现单聊 四、群聊功能 五、案例代码 一、简单实现Netty发送消息的案例 案例一的依赖有&#xff1a;若没springboot项目有自动对应版本&#xff0c;其他版本可以使用maven仓库的最新版本。 <depe…

img的应用

我的目的是&#xff0c;因为图片足够的大&#xff0c;我想让它在一个小盒子里居中显示&#xff0c;所以我这样做了&#xff1a;<style>.text{width: 375px;height: 100px;} </style> <body><div class"text"><img src"./img/5.png&q…

企业为什么要利用数据中台进行数字化转型?_光点科技

近两年“数字化”已经悄悄的替代了“信息化”。那么什么是“企业的数字化转型”&#xff1f;数字化转型是企业战略层面的概念&#xff0c;它并不是追求眼前效益的机灵战术&#xff0c;其本质&#xff0c;是用数字化技术对业务的重构、流程的重构和组织的重构&#xff0c;目的是…

云呐|什么是固定资产?什么是流动资产

什么是固定资产&#xff1f;什么是流动资产&#xff0c;  1、固定资产  属于产品生产过程中用来改变或者影响劳动对象的劳动资料&#xff0c;是固定资本的实物形态固定资产在生产过程中可以长期发挥作用&#xff0c;长期保持原有的实物形态&#xff0c;但其价值则随着企业生…

自己centos7系统制作iso镜像,并新建虚拟机

一、自己centos7系统制作iso镜像 1. 前置工作 将系统安全配置 SELINUX 改为 disabled&#xff0c;否则制作好的镜像无法登陆&#xff01;&#xff01;&#xff01; vim /etc/selinux/config # 将其从 enforcing 改为 disabled SELINUXdisabled2.安装 mondo rescue cd /etc…

正则表达式的使用

什么是正则表达式 正则表达式&#xff0c;又称规则表达式,&#xff08;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09;&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff09;和特殊字…

使用VC时一些容易犯的错误

本文迁移自本人网易博客&#xff0c;写于2011年1月13日&#xff0c;使用VC时一些容易犯的错误 - lysygyy的日志 - 网易博客 (163.com)1、在调用其他类中的函数时&#xff0c;需要在当前类中声明一个类对象&#xff0c;但是调用的时候&#xff0c;编译会出错。出现很多符号&…

2023年SQL大厂高频实战面试题(详细解析)

大家好&#xff0c;我是宁一。 已经连续四个周没有休息了&#xff0c;最近主业、副业都是忙碌的巅峰期&#xff0c;晚上11点下班回家&#xff0c;再写课写到凌晨两点。 连续一个多月连轴转&#xff0c;每天最大的愿望&#xff0c;就是睡足觉。 这一阶段终于忙完了~继续来更新SQ…

LongAdder源码【原创+图解+视频讲解】

目录 AtomicLong用法 源码分析 问题 解决 LongAdder用法 高并发下效率测试 原理 源码 add(long x) Striped64的longAccumulate 伪共享 总结 视频讲解&#xff1a; AtomicLong用法 public static void main(String[] args) {AtomicLong i new AtomicLong(0); ​S…

SQL UPDATE 语句

UPDATE 语句用于更新表中的记录。 SQL UPDATE 语句 UPDATE 语句用于更新表中已存在的记录。 SQL UPDATE 语法 UPDATE table_name SET column1 value1, column2 value2, ... WHERE condition; 参数说明&#xff1a; table_name&#xff1a;要修改的表名称。column1, colu…