L12D21 PWM

一、PWM简介

(一)蜂鸣器工作原理

有源蜂鸣器:高电平响,低电平不响。

无源蜂鸣器:通过电磁感应,内部有线圈,有振膜,电生磁,震动产生20-2万HZ频率之间的脉冲信号,振膜就可以发出声音,频率越高声音越尖。

(二)PWM

 自动产生高低变化的脉冲信号,不需要设置引脚。

(三)PWM参数

占空比:高电平占周期的比例。

二、Exynos4412下的PWM控制器(一)

1、无源蜂鸣器,20HZ人耳能听到的最小HZ,越大越尖。

2、PWM本质是一个定时器。

3、共有五个蜂鸣器,0,1,2,3号蜂鸣器可以通过引脚输出到外面,4号蜂鸣器没有引脚,产生的脉冲波形只能在芯片内部使用。

 4、PWM控制器内部有一级8位分频器,分频倍数0~255,可写共享,0,1共用一个;2,3,4共用一个。

5、二级分频器有5个,固定值可写,每个蜂鸣器私有。

三、Exynos4412下的PWM控制器(二)

(一)信号的产生

占空比 = 109 / 59

1、初始化TCNTB

设置产生信号的周期。

2、初始化TCMPB

用于设置高电平时间,占空比。

3、使能定时器

4、周期被加载到递减计数器

周期被加载到递减计数器,PWM开始工作,控制引脚输出低电平。

5、低电平转高电平

TCNTB开始递减,递减到和TCMPB相同时,开始输出高电平。

6、中断功能,暂时不使用

7、递减计数器减到0

递减计数器减到0,周期重新加载到递减计数器,电平转到低电平,进入新的周期,重复之前的步骤。

8、影响脉冲信号周期的因素

1)TCNTB的值的大小
2)递减计数器的频率大小

PLCK经过一级二级分频之后的频率就是递减计数器频率的大小

9、死驱控制器

保护大功率或大电流信号

10、反向输出功能

PWM默认先输出低电平,反向输出后会先输出高电平

四、PWM寄存器详解

(一)PWM控制器概述

(二)PWM控制器

1、TCFG0

[23:16] 死驱功能

[15:8] 2,3,4一级分频

[7:0] 0,1二级分频

2、TCFG1

 3、TCON

 

 [4:2]和0号蜂鸣器有关

[4]死驱,只有0号有

[3] 0-一次周期,1-连续的周期,无源蜂鸣器只能置1。

[2]反向输出控制,不设置是默认先输出低电平。

[1] 1-第一个周期将TCNTB里面的值就会被复制到计数器中

[0]使能递减计数器,总开关。

4、TCNTB0

 5、TCMPB0

 

6、TCNTO0

只读,递减计数器的值。

五、PWM编程

 例:500HZ

#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;
	/*2.设置PWM0的二级分频	二级分频倍数设置为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控制蜂鸣器产生"嘀嘀"的声音
注: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;

	/*2.设置PWM0的二级分频二级分频倍数设置为递减计数器递减频率 = 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;

}

		

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值