PWM实验

文章详细介绍了使用EXynos4412平台的GPIO接口和PWM技术来控制有源和无源蜂鸣器的工作原理,包括接线方式、GPIO控制的while循环示例以及PWM参数设置如周期和占空比,展示了通过编程实现不同频率和声音效果的方法。
摘要由CSDN通过智能技术生成

蜂鸣器工作原理

有源蜂鸣器

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

无源蜂鸣器

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

在这里插入图片描述

GPIO控制

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

在这里插入图片描述

PWM控制

PWM

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

在这里插入图片描述

PWM参数

周期

在这里插入图片描述

占空比

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

在这里插入图片描述

PWM 概述

在这里插入图片描述

PWM实验小例子:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
GPD0CON[0]寄存器:设置成XpwmTOUT_O功能,PWM0输出功能
在这里插入图片描述TCFG0寄存器:设置一级分频器
在这里插入图片描述

TCFG1寄存器:设置二级分频器 经过两次的分频器就可以得到递减频率

在这里插入图片描述
将PWM0设置成能够连续产生脉冲信号
在这里插入图片描述

设置PWM0的周期
比如设置PWM0的频率为500HZ,周期 = (1/500HZ) / (1/递减频率)

在这里插入图片描述
设置PWM0的占空比:高电平的占比

在这里插入图片描述
将TCNTB0中的值手动装载到递减计数器(TCMPB0)
在这里插入图片描述
使能PWM0,递减计数器开始递减

实现蜂鸣器一直响
代码:


#include "exynos_4412.h"

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

实验小例子:

实现功能:编程实现通过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);
	/*3. 设置PWM0的二级分频 二级分频倍数设置为1倍 递减计数器频率 = PLCK / (99+1) / 1 = 1M*/
	PWM.TCFG1 = PWM.TCFG1 & (~(0xF));
	/*4. 设置PWM0为自动重装载,使其能够产生连续的脉冲信号*/
	PWM.TCON = PWM.TCON | (1 << 3);
	/*5. 设置PWM0的频率为500HZ (1/1000) / (1/1M) = 1000*/
	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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值