TQ2440定时器之PWM

时间:2022-02-12 23:28:38

本节主要涉及到S3C2440的定时器

概述:S3C2440有5个定时器,其中定时器0、1、2、3具有脉冲宽度调制(PWM),定时器4无输出引脚,定时器0具备死区输出功能。定时器0、1共用一个8位的预分频定时(0~255,是通过PCLK来分频的),定时器2、3、4共用另一个定时器,每个定时器都有5种分频器(1/2、1/4、1/8、1/16、TCLK)。

寄存器的配置:

TCNTBn(定时计数缓冲寄存器0~5)功能:定时器递减之后的初始值,我这样理解的,这个寄存器就是一个中断的周期时间

TCMPBn(定时比较缓冲寄存器0~5)  功能:这个寄存器是占空比的宽度值,通过它可以改变脉宽比

TCNTOn(定时器计数监视寄存器0~5) 功能:这个寄存器可以监视当前定时器的计数值,可以这样理解,TCNTBn被加载递减为0时之间,可以通过TCNTn查看。自动重载和双缓冲的过程中就可以通过TCNTn这个寄存器查看。

TCFG0 (定时器配置寄存器0)    功能:决定两个八位预分频器的值

TCFG1 (定时器配置寄存器1)    功能:决定5种定时器和DMA(功能实现不了解,以后学习。。。)的分频器值

TCON (定时器控制寄存器)  功能:定时器的自动重载开启和关闭,定时器的手动更新,定时器的启动和停止,定时器的变相开启和关闭(定时器0不具备,因 为定时器0没有 输出管脚)

 

寄存器如下图

TQ2440定时器之PWM

       

 

本程序通过改变脉宽比来设置蜂鸣器的频率

电路图如下

TQ2440定时器之PWM        TQ2440定时器之PWM

源码如下:

void My_Pwm_Test(void)
{
 char c;
 int value = 800;
 Uart_Printf("\nMy PWM Test Begin\n"); 
 /*GPIO Pin initial*/
 rGPBCON |= (1 << 1); //GPB0 CONFIGURE PWM OUTPUT
 rGPBUP |= 0X01;  //CONFIGURE PULL-UP REGISTER
 
 /*timer initial*/
 rTCFG0 &= ~0XFF; //ALL PRESCALER SET IS 256
 rTCFG1 |= 0X0001; //1\4 DEVIDE PRESCALER

 // rTCNTB0 = (PCLK>>7)/freq;
 rTCNTB0 = ((PCLK >> 7)/value);
 rTCMPB0 = rTCNTB0>>1; // 50%
 rTCON &= ~0x1f;
 rTCON |= 0xb;   //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
 rTCON &= ~2;

 while (1)
 {
  c = Uart_Getch();
  if (c == '+')
  {  
   value += 50;
   if (value > 3000)
    value = 3000;
   Uart_Printf("\n value +: %d\n", value); 
   rTCNTB0 = (PCLK>>7)/value;
   rTCMPB0 = rTCNTB0>>1; // 50%
  }
  else if (c == '-')
  { 
   value -= 50;
   if (value < 50)
    value = 0;
   Uart_Printf("\n value -: %d\n", value); 
   rTCNTB0 = (PCLK>>7)/value;
   rTCMPB0 = rTCNTB0>>1; // 50%
  }
  else if (c == 's')
  {
   break;
  }
 }

}

 

输出的打印结果如下:

TQ2440定时器之PWM