FL2440无操作系统应用程序编写测试004——PWM_TIMER

Subject:FL2440无操作系统应用程序编写测试004——PWM_TIMER

Date:   8-Nov-2011

By:       [email protected]

 

1.硬件原理图

FL2440无操作系统应用程序编写测试004——PWM_TIMER_第1张图片 

 

2. Buzzer寄存器设置

static void Buzzer_Port_Init(void)

        //设置GPB0为PWM output

       rGPBCON &= ~(0x3);

       rGPBCON |= 0x2;         //GPB0=TOUT0

       FL2440无操作系统应用程序编写测试004——PWM_TIMER_第2张图片 

 

        //设置GPB0 Pull up function disabled

       rGPBUP |= 0x1;            //Pull up function disabled

}

 

3.TIMER0 控制框图

FL2440无操作系统应用程序编写测试004——PWM_TIMER_第3张图片

 

4.TIMER0寄存器设置

static void TIMER0_Port_Init(void){

        //设置预分频器

       rTCFG0 &= ~(0xff<<0);

       rTCFG0 |= (0x3<<0);    //prescaler 3+1

      FL2440无操作系统应用程序编写测试004——PWM_TIMER_第4张图片

 

       //设置分频比

       rTCFG1 &= ~(0xf<<0);

       rTCFG1 |= (0<<0);       //mux = 1/2

       FL2440无操作系统应用程序编写测试004——PWM_TIMER_第5张图片

 

        //设置控制方式:Disable dead zone、Auto reload、Inverter off、Update TCNTB0 & TCMPB0、Stop

       rTCON &=(0x1f<<0) ;

       rTCON |= (0xa<<0);     //01010

       FL2440无操作系统应用程序编写测试004——PWM_TIMER_第6张图片

}

 

5.Auto-reload方式分析

当计数器TCNT减为0时,Auto-reload自动将计数缓冲器TCNTBn的数值拷贝到计数器TCNTn中。如果Auto-reload功能未使能,当TCNTn减为0时,TCNTn将停止计数。

FL2440无操作系统应用程序编写测试004——PWM_TIMER_第7张图片

 

6.代码分析 TIMER.c

#include "2440addr.h"

#include "option.h"         //PCLK

#include "UART.h"          //UART0_Printf()

 

//Buzzer寄存器设置

static void Buzzer_Port_Init(void){

       rGPBCON &= ~(0x3);

       rGPBCON |= 0x2;         //GPB0=TOUT0

       rGPBUP |= 0x1;            //Pull up Function disabled

}

 

//TIMER0寄存器设置

static void TIMER0_Port_Init(void){

       rTCFG0 &= ~(0xff<<0);

       rTCFG0 |= (0x3<<0);    //prescaler 3+1

       rTCFG1 &= ~(0xf<<0);

       rTCFG1 |= (0<<0);       //mux = 1/2

       rTCON &= ~(0x1f<<0);

       rTCON |= (0xa<<0);     //01010

}

        

//PWM输出频率设置

static void Buzzer_Frequency_Set(int Freq){

       //定时时间为  (PCLK>>3)/(Freq)/(PCLK/8) = 1/(Freq)s

        U32 val = (PCLK>>3)/(Freq+1000) - 1;

       rTCNTB0 = val;

      

 

        //PWM占空比

       rTCMPB0 = val>>1; //50%方波输出

     

}

 

//启动TIMER0

static void TIMER0_Start(void){

       rTCON |= (0x1<<0);     //Start Timer0

       rTCON &= ~(2<<0);

      FL2440无操作系统应用程序编写测试004——PWM_TIMER_第8张图片

}

 

//停止TIMER0并关闭Buzzer

static void TIMER0_Stop(void){

       rTCON &=(0xfffe<<0); //Stop Timer0

        //关闭Buzzer

       rGPBCON &= ~(0x3);

       rGPBCON |= 0x1;         //GPB0=OUTPUT

       rGPBDAT &= ~(0x1);   //Shut Buzzer

}

 

void Buzzer_PWM_Test(void)

       U8  TmpChar;

       int TmpFreq=1000;

       Buzzer_Port_Init();        //Buzzer端口寄存器设置

       TIMER0_Port_Init();     //TIMER0端口寄存器设置

 

       Buzzer_Frequency_Set(TmpFreq);              //PWM输出频率设置

       TIMER0_Start();    //启动TIMER0

                     

       UART0_Printf("Press +/- to add/dec Frequency of Buzzer and ESC to exit\n");

       

        //根据按键增大或减小PWM输出频率,或退出

       while((TmpChar=UART0_GetKey())!=ESC_KEY)

       {

               if(TmpChar=='+')

               {

                      if(TmpFreq<=2000)

                             Buzzer_Frequency_Set(TmpFreq+=100);

               }

               else

               {

                      if(TmpChar=='-')

                      {

                             if(TmpFreq>=1000)

                                    Buzzer_Frequency_Set(TmpFreq-=100);

                      }

               }

       }

                     

       TIMER0_Stop();    //停止TIMER0

}

 

7. 测试程序及结果

#include "UART.h"

#include "TIMER.h"

 

int Main(void)

{

       UART0_Port_Init(115200);           //UART0初始化

       Buzzer_PWM_Test();                     //PWM输出驱动蜂鸣器

       while(1){

               ;                   

       }

       return 0;

}

 

FL2440无操作系统应用程序编写测试004——PWM_TIMER_第9张图片

按+/-增大/减小PWM的输出频率,蜂鸣器发出的声音也随之改变。

 

你可能感兴趣的:(timer,function,测试,UP,output,代码分析)