ARM的PWM定时器应用
arthur0561 发表于 2009-7-20 6:07:00

2440516位的定时器,0123PWM功能,0有一个deadzone,用于大电流设备。01公用一个8位预分频器,另外的公用另一个8位预分频器。每个定时器都有一个时钟分频器,他能够产生5种不同的分频(1/2,1/4,1/8,1/16TCLK

寄存器

1.定时器配置寄存器TCFG0TCFG1

TCFG02316 Dead zone长度设置

        158 Prescaler1值设定

        7 0 Prescaler0 值设定

TCFG12320 选择DMA请求通道(可以选择一个定时器定时产生DMA请求)

0000 = No select (all interrupt) 0001 = Timer0

0010 = Timer1 0011 = Timer2

0100 = Timer3 0101 = Timer4

0110 = Reserved

      1916 选择对于PWM定时器4MUX

0000 = 1/2 0001 = 1/4 0010 = 1/8

0011 = 1/16 01xx = External TCLK1

2.TCON 定时器控制寄存器

对每一通道进行启动重载,开启关闭等功能的设定

3TCNTBn 定时器n的计数缓冲寄存器

4.TCMPBn 定时器n的计数比较缓冲寄存器(用于PWM功能)

5.TCNTOn 定时器n的当前计数值寄存器

定时器0输出PWM程序段:

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;//16*8等于右移7(PCLK>>7)为一秒的数值

       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

}

定时器1设置为中断

void(*Timer1Callbackf)()=NULL;//定时回调函数指针

uint G_timers=0;//定时记录

static void __irq Timer1_ISR(void)//中断响应

{

       static uint timers=0;

       timers++;

       if((timers>G_timers)&&(Timer1Callbackf!=NULL))//到达时间则调运回调函数

       {

              Timer1Callbackf();

              timers=0;

       }

       ClearPending(BIT_TIMER1);

}

void IntTimer(unsigned int us,void(*Callbackf)())//初始化

{

       if(Callbackf!=NULL)

       Timer1Callbackf=Callbackf;//记录回调函数指针

       G_timers=us;//记录定时时间

       rTCFG0 &= ~0xff;

       rTCFG0 |= 15;                     //prescaler = 15+1

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

       rTCFG1 |= (0x2<<4);                  //mux = 1/8

      

       rTCNTB1 =(PCLK>>7)/1000;//设置初始值,1us位单位

       rTCON &= ~0x0f00;

       rTCON |= 0xb<<8;               //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0

       rTCON &= ~0x200;                    //clear manual update bit

       ClearPending(BIT_TIMER1);

       pISR_TIMER1= (U32)Timer1_ISR;

       EnableIrq(BIT_TIMER1);    

}



郑重声明:资讯 【ARM的PWM定时器应用】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——