makowu 发表于 2006-6-4 16:24:13

T0工作在计数方式计算外部脉冲数

各位,下午好。

我现在想应用T0来计算从T0脚进来的脉冲数,是用PROTUES来仿真光电编码器输进单片机的脉冲,从而



计算出电机转速的(光电编码器测速度)



思路是: 时钟由T0 引脚输入,下降沿触发;设定1秒钟,读取脉冲数,根据在这1秒钟内数到的脉冲数确定转速



问题是:1、我现在是可以起动T0计数器,但是怎样设定那1秒钟呢?要用内部定时吗?



      2、T0是不断地从0到255,中断一次,再循环;而我是要不断的读取每1秒钟的脉冲数,应该怎样读取呢?



我以下的程序,不知可否实现我的功能要求呢?



那1秒钟只是个假设,我最终目的是某一段固定的时间内数出不同的脉冲数来



谢谢各位啦





//ICC-AVR application builder : 4/6/2006 11:08:37

// Target : M16

// Crystal: 4.0000Mhz



int Timer_Count = 0;





void timer0_init(void)

{

   

TCCR0 = 0x00; //stop

TCNT0 = 0x19; //set count是这里设定的吗? 仿真好像不是

//啊,TCNT0是不断从0到255循环啊



// OCR0= 0x3E;//set compare

TCCR0 = 0x06; //start timer

//TCCR0 |= (1<<CS02)|(1<<CS01);



   

   

TIMSK|=1<<TOIE0;





}





#pragma interrupt_handler timer0_ovf_isr:10

void timer0_ovf_isr(void)

{

      

         Timer_Count++;

       if (Timer_Count = 5)

       {   

         

      for(i=0;i<5;i++)

                            {

                               PORTA ^= (1<<PA4);

               

               PORTA |= (1<<PA4);   

            

                     }   

       }

   TCNT0 = 0x19; //reload counter value

}



//call this routine to initialize all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

timer0_init;



MCUCR = 0x00;

GICR= 0x00;

TIMSK|=1<<TOIE0;

SEI(); //re-enable interrupts

//all peripherals are now initialized

}



void main(void)

{

init_devices();

   

while(1)

   {;;}

}

hzd530 发表于 2006-6-4 18:21:06

T0已用作外部脉冲数计数方式了,就不能再用来定时,定时只能用另外的定时器了

莫小苏 发表于 2013-7-19 10:15:23

可以考虑用TIME3,个人觉得那个用的少!!
页: [1]
查看完整版本: T0工作在计数方式计算外部脉冲数