一、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;
}