mini2440 test之蜂鳴器

 

2蜂鳴器(BEEP)
void Buzzer_Freq_Set( U32 freq )
{
    rGPBCON &= ~3;                //set GPB0 as tout0, pwm output
    rGPBCON |= 2;
        
    rTCFG0 &= ~0xff;
    rTCFG0 |= 15;                 //prescaler = 15+1
    rTCFG1 &= ~0xf;
    rTCFG1 |= 2;             //mux = 1/8
    rTCNTB0 = (PCLK>>7)/freq;
    rTCMPB0 = rTCNTB0>>1;  // 50%
    rTCON &= ~0x1f;
    rTCON |= 0xb;                //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
    rTCON &= ~2;                //clear manual update bit
}

void Buzzer_Stop( void )
{
    rGPBCON &= ~3;                //set GPB0 as output
    rGPBCON |= 1;
    rGPBDAT &= ~1;
}

//***************************[ BOARD BEEP ]*******************************
void Beep(U32 freq, U32 ms)
{
    Buzzer_Freq_Set( freq ) ;
    Delay( ms ) ;
    Buzzer_Stop() ;
}

/****************************************************************************
【功能說明】蜂鳴器PWM測試
****************************************************************************/
void BUZZER_PWM_Test( void )
{
    U16 freq = 1000 ;
    
    Uart_Printf( "/nBUZZER TEST ( PWM Control )/n" );
       Uart_Printf( "Press +/- to increase/reduce the frequency of BUZZER !/n" ) ;
    Uart_Printf( "Press 'ESC' key to Exit this program !/n/n" );
    
    Buzzer_Freq_Set( freq ) ;

    while( 1 )
    {
         U8 key = Uart_Getch();

         if( key == '+' )
         {
               if( freq < 20000 )
                     freq += 10 ;
                    
               Buzzer_Freq_Set( freq ) ;
         }

         if( key == '-' )
         {
               if( freq > 11 )
                     freq -= 10 ;
                    
               Buzzer_Freq_Set( freq ) ;
         }
        
         Uart_Printf( "/tFreq = %d/n", freq ) ;
         if( key == ESC_KEY )
         {
               Buzzer_Stop() ;
               return ;
         }

    }

}
有四個函數
蜂鳴器頻率的設定:void Buzzer_Freq_Set( U32 freq )
蜂鳴器停止:void Buzzer_Stop( void )
板上蜂鳴器測試:void Beep(U32 freq, U32 ms)
蜂鳴器PWM測試:void BUZZER_PWM_Test( void )
1)          蜂鳴器頻率的設定:
void Buzzer_Freq_Set( U32 freq )
{
    rGPBCON &= ~3;                //set GPB0 as tout0, pwm output
    rGPBCON |= 2;
        
    rTCFG0 &= ~0xff;
    rTCFG0 |= 15;                 //prescaler = 15+1
    rTCFG1 &= ~0xf;
    rTCFG1 |= 2;             //mux = 1/8
    rTCNTB0 = (PCLK>>7)/freq;
    rTCMPB0 = rTCNTB0>>1;  // 50%
    rTCON &= ~0x1f;
    rTCON |= 0xb;                //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
    rTCON &= ~2;                //clear manual update bit
}
首先設置端口GPB0爲TOUT0功能
rGPBCON &= ~3;              //set GPB0 as tout0, pwm output
rGPBCON |= 2;
然後設置預分頻和分割值,計數器的輸入時鐘(CCLK)頻率:PCLK/(預分頻+1)/分割值 。預分頻值和分割值分別由TCFG0,TCFG1來確定。
rTCFG0 &= ~0xff;
    rTCFG0 |= 15;                 //prescaler = 15+1
    rTCFG1 &= ~0xf;
    rTCFG1 |= 2;             //mux = 1/8
   接着設定初始值TCMPB3和TCNTB3
rTCNTB0 = (PCLK>>7)/freq;
    rTCMPB0 = rTCNTB0>>1;  // 50%
由於計數器的輸入時鐘爲PCLK/16/8;而rTCNTB0 = (PCLK>>7)/freq;並且計數計到最大值的一半時發生翻轉。因爲計數的基值是 由rTCMPB0 = rTCNTB0>>1;   // 50%
設定爲最大計數值的50%。
最後是定時控制器的設定  rTCON
    rTCON &= ~0x1f;
    rTCON |= 0xb;                //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
    rTCON &= ~2;                //clear manual update bit

這樣TOUT0就產生了頻率是rTCNTB0 ,佔空比是50%的方波。

2)蜂鳴器停止:void Buzzer_Stop( void )
void Buzzer_Stop( void )
{
    rGPBCON &= ~3;                //set GPB0 as output
    rGPBCON |= 1;
    rGPBDAT &= ~1;
}
通過設定GPB0爲輸出功能,並輸出低電平,使蜂鳴器停止。
2)          板上蜂鳴器測試:void Beep(U32 freq, U32 ms)
void Beep(U32 freq, U32 ms)
{
    Buzzer_Freq_Set( freq ) ;
    Delay( ms ) ;
    Buzzer_Stop() ;
}
輸入的是蜂鳴器的頻率和蜂鳴器響的時間,通過
Buzzer_Freq_Set( freq ) ;
    Delay( ms ) ;
來實現蜂鳴器按照feq的頻率響ms的時間。(ms=1,時間爲0.32ms)
3)          蜂鳴器PWM測試:void BUZZER_PWM_Test( void )
void BUZZER_PWM_Test( void )
{
    U16 freq = 1000 ;
    
    Uart_Printf( "/nBUZZER TEST ( PWM Control )/n" );
       Uart_Printf( "Press +/- to increase/reduce the frequency of BUZZER !/n" ) ;
    Uart_Printf( "Press 'ESC' key to Exit this program !/n/n" );
    
    Buzzer_Freq_Set( freq ) ;

    while( 1 )
    {
         U8 key = Uart_Getch();

         if( key == '+' )
         {
               if( freq < 20000 )
                     freq += 10 ;
                    
               Buzzer_Freq_Set( freq ) ;
         }

         if( key == '-' )
         {
               if( freq > 11 )
                     freq -= 10 ;
                    
               Buzzer_Freq_Set( freq ) ;
         }
        
         Uart_Printf( "/tFreq = %d/n", freq ) ;
         if( key == ESC_KEY )
         {
               Buzzer_Stop() ;
               return ;
         }

    }

}
首先接收按鍵的值U8 key = Uart_Getch();
如果是‘+’,並小於頻率的上限,則增加頻率10,如果是‘-’,並且大於頻率的下限,則減少頻率10。如果按下‘esc’則蜂鳴器停止,程序返回。
發佈了31 篇原創文章 · 獲贊 4 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章