目录
一、PWM简介
蜂鸣器工作原理
蜂鸣器
-
有源蜂鸣器只要接上额定电源就可以发出声音 (GPIO控制)
-
无源蜂鸣器利用电磁感应原理,为音圈接入交变电流后形成的电磁铁与永磁铁相吸或相斥而推动振膜(20-20000HZ可被人耳接收)发声(PWM控制)
无源蜂鸣器的控制方式:
1.GPIO控制
CPU会陷入到Delay中,浪费CPU资源,方法不好用
while(1)
{
GPX2.DAT=GPX2.DAT | (1 << 7);
Delay(1000000);
GPX2.DAT=GPX2.DAT & (~(1 << 7)); c
Delay(1000000);
}
2.PWM控制
PWM 即脉冲宽度调制,通过对脉冲的宽度进行调制,来获得所需要波形
2.1PWM参数
1.周期
2.占空比
二、Exynos4412下的PWM控制器
4412芯片手册中的PWM控制
5个PWM控制器,前4个能产出连续的PWM控制 外部设备,最后一个没有引脚与外部有连接,只能用于芯片内部,本质还是一个递减计数器和看门狗差不多;PWM0可用于大电流设备;
使用PCLK时钟,一级分频器8位分频器可编程(1-256倍分频);time0和time1共用一个分频器;每个定时器都有各自的二级分频器,2/4/8/16倍
举例说明PWM原理
产生一个低电平50,高电平109,周期就是159 占空比:109/159
- 初始化TCNTBn寄存器设置周期159, 初始化TCMPBn寄存器初始化设置高电平所占时间109
- 使能定时器
- TCNTBn的值加载到递减计数器中,然后在引脚上输出低,如果递减后的值到和TCMPBn值一样时开始输出高电平
- TCNTBn的值当减到0时,PWM会产生中断(这个实验没用到)
- 递减计数器为0后会自动加载TCNTBn,再重新一个周期
- 周期不仅和TCNTBn大小有关还和递减计数器的频率(PCLK时钟源分频后)有关
PWM控制器逻辑框图
反向输出功能
默认是先输出低电平再高电平,反向输出时,先输入高再低
默认是先50低电平,后109高电平,开启反转后就是先159-109高电平,159-0低电平
三、PWM寄存器详解
TCFG0 一级分频;设置死区宽度保护大功率大电流 设备
TCFG1 二级分频
1.TCFG0:一级分频;设置死区宽度保护大功率大电流 设备
2.TCFG1:二级分频
3.TCON 使能控制器
4.TCNTB0寄存器:控制time0的周期
TCMPB0:控制time0的高电平时间,需要注意的是TCMPB一定比TCNTB小
四、PWM编程
实验目的:
#include "exynos_4412.h"
void Delay (unsigned int Time)
{
while (Time-- );
}
int main()
{
//1.将GPD0_0设置成PWM的输出引脚
GPD0.CON = GPD0.CON & (~(0xF )) | (0x2);
//2.设置PWM的一级分频
PWM.TCFG0 = PWM.TCFG0 & (~(0xFF)) | 99;
//3,设置二级分频,二级分频为1倍,递减计数器递减频率为
//= PLCK/(99+1)/1=1M/S
PWM.TCFG1 = PWM.TCFG1 & (~(0xFF));
//4.设置PWM0 为自动重装载,使其能够产生连续的脉冲信号
PWM.TCON = PWM.TCON | (1 << 3);
//5.设置pwm的频率500hz
PWM.TCNTB0 = 2000;
//6.设置PWM的占空比为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;
}