PWM实验

蜂鸣器工作原理

有源蜂鸣器

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

无源蜂鸣器

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

PWM实验_第1张图片

GPIO控制

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

PWM实验_第2张图片

PWM控制

PWM

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

PWM实验_第3张图片

PWM参数

周期

PWM实验_第4张图片

占空比

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

PWM实验_第5张图片

PWM 概述

PWM实验_第6张图片

PWM实验小例子:

PWM实验_第7张图片
在这里插入图片描述
PWM实验_第8张图片
GPD0CON[0]寄存器:设置成XpwmTOUT_O功能,PWM0输出功能
PWM实验_第9张图片TCFG0寄存器:设置一级分频器
PWM实验_第10张图片

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

PWM实验_第11张图片
将PWM0设置成能够连续产生脉冲信号
PWM实验_第12张图片

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

PWM实验_第13张图片
设置PWM0的占空比:高电平的占比

PWM实验_第14张图片
将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;
}

你可能感兴趣的:(arm开发)