//***************************************************
//manymany-2440裸机篇之5 PWM控制蜂鸣器
//***************************************************
//目的:掌握PWM的使用,更好的利用PWM
//***************************************************
//功能:PWM控制蜂鸣器
//接口:GPG0 -> KEY1
// GPG3 -> KEY2
// GPG5 -> KEY3
// GPB0 -> 蜂鸣器
//********************************************************
//PWM工作原理:
//1,启动PWM定时器:
// 启动完毕后,TCNTn开始倒计数,当TCNTn具有与TCMPn相
// 同值时,TOUTn的逻辑电平有低到高,当TCNTn到达0时,
// 将产生定时器中断请求 ,通知CPU定时器操作以完成,此
// 时自动重载控制位使能,TCNTBn的值会自动载入到TCNTn
// 寄存器中,并开始下一轮的操作周期
//2,调制PWM:
// 系统中PWM脉冲频率由TCNTBn决定,PWM脉冲宽度则
// 由TCMPBn的值来决定,而占空比即为TCMPn/TCNTn。
//********************************************************
//Designed by: http://blog.ednchina.com/Manymany/
//2009-05-19
//********************************************************
#include "2440addr.h"
#include "2440lib.h"
#include "def.h"
void Freq_Set( U32 freq );
void Stop( void );
void PWM_Test( void );
void xmain(void) //主函数
{
ChangeClockDivider(3,1); //1:3:6
ChangeMPllValue(127,2,1); //405MHZ
Port_Init(); //端口初始化
Isr_Init(); //中断初始化
PWM_Test(); //PWM测试函数
}
//*******************************************************
//一般PWM定时器的启动步骤如下:
//1,将初始值写入到TCNTBn和TCMPBn中。
//2,设置对应定时器的自动重载位。
//3,设置对应定时器的手动更新位,反向器设置为off状态。
//4,设置对应定时器的启动位来启动定时器,同时清除手动更新位。
//*******************************************************
//定时器0频率设置函数
void Freq_Set( U32 freq )
{
rGPBCON &= ~3; //GPBCON0为10,为特殊功能,设置为定时器0
rGPBCON |= 2; //注意不是普通输出!!
rTCFG0 &= ~0xff; //TCFG0定时器配置寄存器0
rTCFG0 |= 15; //设置定时器0的预分频值为15
//TCFG1定时器配置寄存器1 //设置定时器0的MUX输入为1/8
rTCFG1 &= ~0xf;
rTCFG1 |= 2;
rTCNTB0 = (PCLK>>7)/freq; // 将初始值写入到TCNTBn和TCMPBn中
rTCMPB0 = rTCNTB0>>1; // 50%
rTCON &= ~0x1f; //TCON定时器控制寄存器,0b11101011,
//定时器死区操作停止,
rTCON |= 0xb; //定时器0自动加载开,定时器0输出反向器关,手动更新
rTCON &= ~2; //启动定时器0,同时清除手动更新位。
}
//************************************************************
//关闭定时器1中断函数
void Stop( void )
{
rGPBCON &= ~3; //设置GPB0为01,普通输出
rGPBCON |= 1;
rGPBDAT &= ~1;
}
//PWM测试函数
void PWM_Test( void )
{
U16 freq = 1000 ;
Freq_Set( freq ) ; //频率设置函数
while( 1 )
{
U8 key;
key="rGPGDAT"; //读取按键
if(!(key & (1<<0))) //判断是否是按键1
{
if( freq < 20000 ) //假如是则频率加
freq += 30 ;
Freq_Set( freq ) ;
}
if(!(key & (1<<3))) //判断是否是按键2
{
if( freq > 150 ) //假如是则频率减
freq -= 30 ;
Freq_Set( freq ) ;
}
if(!(key & (1<<5))) //判断是否是按键3
{
Stop() ; //停止
}
}
}
/*这里是整个工程文件压缩包考虑到很多场合要用到直流电机,而且直流电机更能清晰的表现PWM的功能,manymany会迟点推出manymany-2440裸机篇之 PWM控制直流电机,对PWM补充完整点吧。请大家多多关注。*/
用户1445499 2011-7-22 17:11
用户1614106 2010-9-10 20:42
用户578360 2009-9-1 16:25