脉宽调制器

1.  pwm脉宽调制器

脉宽调制器:   一种硬件设备, 用于 动态调制  方波 的 一些属性, 方波的周期,频率,占空比 

占空比? :     有效电平占 整个周期的比值  

可以使用PWM 控制功率, 控制频率 用于 开关电源 或 逆变器 

1.1 原理

PWM原理: 如图所示

本质就是一个定时器:  

由原理可知: 

输出波形的 频率 = 总线时钟 / (分频值+1) / 重载值 ;

输出波形的 占空比 = 比较值 / 重载值 

1.2 pwm标准时钟的频率

100Mhz

2. 实验:使用pwm驱动蜂鸣器 以500hz 占空比50% 发出声响

输出定时器信号的 频率 =  总线时钟 /固定分频/ (分频值+1) / 重载值 ;

占空比 = 比较寄存器/重载值

实现功能  输出一个 500hz 方波  占空比  50%

500hz  = 100M / (分频值+1) / 重载值 ;   //这里不固定分频

500hz  = 100M / (99+1) / 重载值 ;

500hz  = 1M / 重载值 ;

重载值 = 2K

0.5    = 比较值 / 重载值 ;

比较直 = 1K

2.1 看原理图

1292页

我们走红色线路

1. 硬件 : 蜂鸣器 

2. 电路图    

芯片管脚  PD0_0  ----  XpwmTOUT0  PWM输出

3. pwm控制器   芯片手册  

5个 pwm  

0-3  有 PWM 输出 

0 pwm 有 死区控制 

4 pwm 没有输出 

死区控制:  主要用于控制 半H桥电路  或 全H桥电路 有用 

控制器 结构框图   1292 页  

2.2 配置寄存器

TCFG0  两路预分频

TCFG0 :  两路预分频  死区配置 

[7:0]  = 预分频 

TCFG1 5路固定分频

TCFG1 :  5路 固定分频 配置 

[3:0]  =  0-4   分别对应 1/1 1/2 1/4 1/8 1/16

TCNTB0:  PWM0 重载寄存器     32bit  0 - 2^32-1

TCMPB0:  PWM0 比较寄存器 

TCNTO0:  PWM0 计数寄存器  只读

TCON  :  总控 

TCON  :  总控 

[4] = 0  不使能死区 

[3] = 0  单次模式   1 自动重装 

[2] = 1  打开输出  

[1] = 1  装载   重载寄存器   比较寄存器

[0] = 1  启动pwm0 

2.3 写代码

pwm_test----main.c

#include"exynos_4412.h"
#include"uart.h"
//使用pwm驱动蜂鸣器 以500hz 占空比50% 发出声响
//pwm 初始化
void pwm_init(){

    //配置GPD0_0 为pwm功能
    GPD0.CON = (GPD0.CON & ~(0xf<<0)) | (2<<0);

    //配置pwm控制器,五路固定分频 TCFG1 [3:0] = 0  这里蛇蛇不固定分频
    PWM.TCFG1 &= ~(0xf);
    //两路预分频 TCFG0 [7:0] = 99  100M/(99+1) = 1M
    PWM.TCFG0 = (PWM.TCFG0 & ~(0xff<<0)) | (99<<0);
    //重载值
    PWM.TCNTB0 = 2000;
    //比较寄存器
    PWM.TCMPB0 = 1000;

    //配置总控
    //不使能死区
    PWM.TCON &= ~(1<<4);
    //自动重装
    PWM.TCON |= 1<<3;
    //打开输出
    PWM.TCON |= 1<<2;
    //装载TCNTB0  TCMPB0
    PWM.TCON |= 1<<1;
    //关闭装载
    PWM.TCON &= ~(1<<1);
    //启动pwm
    PWM.TCON |= 1;


}

int main()
{
    int a = 100;
    uart_init();
    printf("hello!a=%d\r\n",a);

    pwm_init();

    while(1);
    return 0;
}


3. 使用蜂鸣器调出音律

这里我们调制 高音即可

输出定时器信号的 频率 =  总线时钟 /固定分频/ (分频值+1) / 重载值 ;

占空比 = 比较寄存器/重载值

pwm_muisc-----main.c

#include"exynos_4412.h"
#include"uart.h"

//pwm 模拟音律播放

volatile unsigned int count = 0;//毫秒级变量

//延时  ms
void delay(unsigned short ms){

    unsigned int tmp = count;//存放刚进入delay函数时 count 的数值

    // while(count <= tmp+ms);//这种算法没有规避溢出问题

    while(count-tmp < ms);//这种算法规避了溢出问题,不必纠结算法,用就完事了

}


//中断初始化
exit_init(){

    //GIC 面向中断源
    //开启总中断
    ICDDCR = 1;

    //配置端口中断使能
    //中断模式:  wdt中断 id 75
    //75/32=2   75%32=11
    ICDISER.ICDISER2 |= 1<<11;

    //配置端口优先级 优先级设置为5
    //75/4= 18    75%4=3  ----  [15:8]
    ICDIPR.ICDIPR18 = (ICDIPR.ICDIPR18 & ~(0xff<<24)) | (5<<24);

    //配置中断源送去哪个cpu处理 0x1表示直送cpu0
    //寄存器分步格局 与ICDIPR 完全一样 
    ICDIPTR.ICDIPTR18 = (ICDIPTR.ICDIPTR18 & ~(0xff<<24)) | (0x1<<24);
    
    //GIC 面向cpu
    //cpu响应中断使能  =1 使能  =0 不使能
    CPU0.ICCICR = 1;

    //配置cpu过滤优先级
    CPU0.ICCPMR = 255;

}

//中断响应,c语言入口函数,在汇编汇总调用,当irq异常触发时
void do_irq(){
    //获取中断号
    int id = CPU0.ICCIAR;

    //根据中断id来处理对应的事件
    switch(id){
        case 75:

        count++;

        //先清除中断 源头的挂起 看门狗的中断
        //写入任何值清除
        WDT.WTCLRINT = 8;

        //在清除GIC分配器层中断挂起 与ICDISER_CPU 结构一样 id:57
        //置为1  清除
        ICDICPR.ICDICPR2 |= 1<<11;

        break;

    }

    //最后清除cpu中断挂起
    //写入中断id清除对应中断挂起
    CPU0.ICCEOIR = id;

}

//看门狗初始化
void dog_init(){
    //预分频
    WDT.WTCON = (WDT.WTCON &~(0xff<<8)) | (24<<8);
    //固定分频
    WDT.WTCON = (WDT.WTCON &~(0x3<<3)) | (0<<3);
    //触发中断信号  [2] 时间到,是否触发中断信号  = 1 触发中断 
    WDT.WTCON |= 1<<2;

    //重载寄存器
    WDT.WTDAT = 250;
    //计数寄存器
    WDT.WTCNT =250;

    //开启看门狗
    WDT.WTCON |= 1<<5;
}

//pwm 初始化
void pwm_init(){

    //配置GPD0_0 为pwm功能
    GPD0.CON = (GPD0.CON & ~(0xf<<0)) | (2<<0);

    //配置pwm控制器,五路固定分频 TCFG1 [3:0] = 0  这里设不固定分频
    PWM.TCFG1 &= ~(0xf);

    //频率 =  总线时钟 /固定分频/ (分频值+1) / 重载值 ;
    //两路预分频 TCFG0 [7:0] = 99  100M/(99+1) = 1M
    PWM.TCFG0 = (PWM.TCFG0 & ~(0xff<<0)) | (99<<0);

    //重载值
    PWM.TCNTB0 = 2000;
    //比较寄存器  占空比 = 比较寄存器/重载值
    PWM.TCMPB0 = 1000;

    //配置总控
    //不使能死区
    PWM.TCON &= ~(1<<4);
    //自动重装
    PWM.TCON |= 1<<3;
    //打开输出
    PWM.TCON |= 1<<2;
    //装载TCNTB0  TCMPB0
    PWM.TCON |= 1<<1;
    //关闭装载
    PWM.TCON &= ~(1<<1);

}

//启动pwm
void pwm_start(){
    //启动pwm
    PWM.TCON |= 1;
}

//关闭pwm
void pwm_stop(){
    //启动pwm
    PWM.TCON &= ~1;
}

//改变音色
void chanage_pinlv(unsigned int hz){

    //重载值
    PWM.TCNTB0 = 1000000/hz;
    //比较寄存器 //占空比我们设为50%
    PWM.TCMPB0 = 1000000/hz/2;

    //装载TCNTB0  TCMPB0
    PWM.TCON |= 1<<1;
    //关闭装载
    PWM.TCON &= ~(1<<1);
    //打开pwm
    pwm_start(); //因为我们在播放音律函数时 停止了pwm 所以每次改变音色 都要重新开启pwm
}

//定义音符频率
#define H1  1046
#define H2  1175
#define H3  1318
#define H4  1397
#define H5  1568
#define H6  1760
#define H7  1976
#define ST  0

//播放音律
void play(){
    
    chanage_pinlv(H1);
    delay(1000);//响一秒
    pwm_stop();
    delay(500);//停一秒
    chanage_pinlv(H2);
    delay(1000);//响一秒
    pwm_stop();
    delay(500);//停一秒
    chanage_pinlv(H3);
    delay(1000);//响一秒
    pwm_stop();
    delay(500);//停一秒
    chanage_pinlv(H4);
    delay(1000);//响一秒
    pwm_stop();
    delay(500);//停一秒
    chanage_pinlv(H5);
    delay(1000);//响一秒
    pwm_stop();
    delay(500);//停一秒
    chanage_pinlv(H6);
    delay(1000);//响一秒
    pwm_stop();
    delay(500);//停一秒
    chanage_pinlv(H7);
    delay(1000);//响一秒
    pwm_stop();
    delay(500);//停一秒
}

int main()
{
    uart_init();
    printf("music!!!\r\n");
    //看门狗初始化
    dog_init();
    //中断初始化
    exit_init();
    //pwm初始化
    pwm_init();
    //开启pwm
    pwm_start();

    int i=0;

    while(1){
        play();
        delay(2000);//所有音律播放完成总体停2秒
    }

    return 0;
}

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

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

相关文章

游戏开发丨基于Pygame的AI版贪吃蛇小游戏

文章目录 写在前面需求分析程序设计程序分析运行结果系列文章写在后面 写在前面 本期内容 基于pygame的AI版贪吃蛇小游戏 所需环境 pythonpycharm或anacondapygame 下载地址 https://download.csdn.net/download/m0_68111267/88789665 需求分析 本游戏使用Pygame模块开…

FL Studio21.2.2中文学生版免费下载(支持简体中文,支持苹果M1/M2处理器)

今天小编给大家带来的是一款功能非常强大的音乐创作编辑软件它就是(水果软件)。使用FL Studio21中文版可以轻松帮我们制作自己的音乐唱片&#xff0c;拥有强大且专业的创作工具&#xff0c;COCO玛奇朵为您提供FL Studio(水果软件)2024免费下载&#xff0c; FL Studio 21 Win-安…

ASCP电气防火限流式保护器功能以及应用场景

功能&#xff1a; ASCP200型电气防火限流式保护器可有效克服传统断路器、空气开关和监控设备存在的短路电流大、切断短路电流时间长、短路时产生的电弧火花大&#xff0c;以及使用寿命短等弊端&#xff0c;发生短路故障时&#xff0c;能以微秒级速度快速限制短路电流以实现灭弧…

C++:异常体系

异常体系 异常1.C语言传统的处理错误的方式2.C异常概念3.异常的使用3.1异常的抛出和捕获3.2 异常的重新抛出3.3异常安全3.4 异常规范 4.C标准库的异常体系5.异常的优缺点 异常 1.C语言传统的处理错误的方式 终止程序&#xff0c;如assert&#xff0c;缺陷&#xff1a;用户难以…

深度视频恢复软件推荐,轻松恢复视频文件!

“我在电脑上保存了一些视频&#xff0c;但在清理时却不小心将这些视频删除了&#xff0c;有什么方法可以恢复删除的视频吗&#xff1f;希望大家给我推荐一些好用的方法。” 随着科技的飞速发展&#xff0c;数字媒体已经成为了我们生活中不可或缺的一部分。然而&#xff0c;数字…

17K star!开源免费的离线OCR工具

平时工作中,总会遇到想对图片内文字进行处理的情况,我们就来介绍一款开源、免费的离线OCR工具,它就是:Umi-OCR。 关于 Umi-OCR Umi-OCR是开源、免费的离线OCR软件。支持截屏/粘贴/批量导入图片,段落排版/排除水印,扫描/生成二维码。项目内置多国语言库,方便切换。 Umi-…

【Python时序预测系列】基于LSTM实现单变量时间序列预测(源码)

一、引言 前文回顾&#xff1a; 【Python时序预测系列】基于Holt-Winters方法实现单变量时间序列预测&#xff08;源码&#xff09; 【Python时序预测系列】基于ARIMA法实现单变量时间序列预测&#xff08;源码&#xff09; 【Python时序预测系列】基于SARIMA实现单变量时间…

超声波清洗机买哪款比较好?四款公认好用超声波清洗机

超声波清洗机好用吗&#xff1f;好多人都说是普通的清洁工具买回家就是浪费钱&#xff0c;真心不建议购买&#xff0c;但其实&#xff0c;手动清洗眼镜的话会比较容易损坏镜片&#xff0c;一副眼镜比较普通的也要上几百了&#xff0c;而且眼镜是我们日常生活中经常会使用的&…

介绍TCP/IP

TCP/IP&#xff08;传输控制协议/互联网协议&#xff09;是一种用于数据通信的基本通信协议&#xff0c;它是互联网的基础。TCP/IP指的是一组规则和过程&#xff0c;它规定了如何在网络上发送和接收数据。这个协议族由两个主要部分组成&#xff1a;传输控制协议&#xff08;TCP…

C#实现多种图片格式转换(例如转换成图标图像ICO)

1,目的: 实现多种图片格式的相互转换&#xff0c;图片大小可自定义等。 2&#xff0c;知识点: 转换成图标图像(ico)时&#xff0c;需要获取图像句柄&#xff0c;然后根据句柄生成Ico图像&#xff0c;否则生成的图像不能作为应用的图标使用。 IntPtr hwd bitmap.GetHicon();…

MongoDB之概述、命令

基础知识 是什么 概念 分布式文件存储数据库&#xff0c;提供高可用、可扩展、易部署的数据存储解决方案。 结构 BSON存储类型 类似JSON的一种二进制存储格式。相比于JSON&#xff0c;提供更丰富的类型支持。 优点是灵活&#xff0c;缺点是空间利用率不佳。 类型说明解释…

python爬虫demo——爬取历史平均房价

简单爬取历史房价 需求 爬取的网站汇聚数据的城市房价 https://fangjia.gotohui.com/ 功能 选择城市 https://fangjia.gotohui.com/fjdata-3 需要爬取年份的数据&#xff0c;等等 https://fangjia.gotohui.com/years/3/2018/ 使用bs4模块 使用bs4模块快速定义需要爬取的…

基于springboot+微信小程序+vue实现的校园二手商城项目源码

介绍 校园二手商城&#xff0c;架构&#xff1a;springboot微信小程序vue 软件架构 软件架构说明 系统截图 技术选型 技术版本说明Spring Boot2.1.6MVC核心框架Spring Security oauth22.1.5认证和授权框架MyBatis3.5.0ORM框架MyBatisPlus3.1.0基于mybatis&#xff0c;使用…

生成对抗网络

目录 1.GAN的网络组成 2.损失函数解释说明 2.1 BCEloss 2.2整体代码 1.GAN的网络组成 2.损失函数解释说明 2.1 BCEloss 损失函数 import torch from torch import autogradinput autograd.Variable(torch.tensor([[1.9072,1.1079,1.4906],[-0.6584,-0.0512,0.7608],[-0.0…

【嵌入式移植】5、U-Boot源码分析2—make nanopi_neo2_defconfig

U-Boot源码分析2—make nanopi_neo2_defconfig 1 概述2 nanopi_neo2_defconfig3 编译过程分析3.1 编译目标3.2 scripts_basic3.2.1 prefix src定义3.2.2 PHONY3.2.3 __build3.2.4 fixdep3.3 objscripts/kconfig 1 概述 上一章中&#xff0c;对Makefile相关源码进行了初步分析&…

Vue-cli脚手架将组件挂载到全局

局部引用组件,直接将组件引入,注册组件即可,这篇文章讲组件挂载到全局的方法! main.js文件 将组件引入main.js文件中,并且注册 使用方法 在需要的地方使用组件即可 BaoGit.Vue代码 <template><div><a href"https://gitee.com/ah-ah-bao"><img …

【机器学习】正则化

正则化是防止模型过拟合的方法&#xff0c;它通过对模型的权重进行约束来控制模型的复杂度。 正则化在损失函数中引入模型复杂度指标&#xff0c;利用给W加权值&#xff0c;弱化了数据的噪声&#xff0c;一般不正则化b。 loss(y^,y)&#xff1a;模型中所有参数的损失函数&…

PID校正

一、Introduction to PID Control PID控制是一种应用非常广泛的控制算法。小到控制一个元件的温度&#xff0c;大到控制无人机的飞行姿态和飞行速度等等&#xff0c;都可以使用PID控制。PID(proportion integration differentiation)其实就是指比例&#xff0c;积分&#xff0…

Python tkinter (10) ——Combobox控件

本文主要是Python tkinter Combobox下拉控件介绍及使用示例。 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 Python tkinte…

Springboot入门教程详解

Springboot入门教程详解 博客主页&#xff1a;划水的阿瞒的博客主页 欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ 系列专栏&#xff1a;Springboot入门教程详解首发时间&#xff1a;&#x1f39e;2024年1月29日&#x1f3a0; 如果觉得博主的文章还不错的话&#xff0c…