新闻  |   论坛  |   博客  |   在线研讨会
PWM控制蜂鸣器
mayer | 2009-05-23 13:59:56    阅读:1936   发布文章


//***************************************************
//目的:掌握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() ;         //停止
           }

     }

}

/*这里是整个工程文件压缩包rar

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客