钻石会员 
 
主题
回帖0
积分10333
阅读权限50
注册时间2012-3-12
最后登录1970-1-1
在线时间 小时
 
 
 
 
 | 
 
想弄个转速测量的东东,问下如何利用atmega16来测量两路转速 
精度能有多少,看了很多的转速测量 
测频,测周,还有等精度 
不知道谁弄过没有,交流下 
单片机是atmega16的 
下面是我的程序 
////liuchengliaaa 20120327  PWM实验 
//内部RC振荡2MHZ  6 CK + 65 ms      CKSEL=0010 SUT=10 
//内部RC振荡8MHZ  6 CK + 65 ms      CKSEL=0100 SUT=10   on used 
#include  <global.h> 
#include  <12232.h> 
//调试器用 
const prog_uchar  my_char_1[]={"转速:     "}; 
const prog_uchar  my_char_2[]={"占空比:    %"}; 
//extern  updata; 
int main(void) 
{ 
   uchar  a;   
   PORTA =0xFF;         //不用的管脚使能内部上拉电阻 
   PORTC =0xFF; 
   DDRB=0XFF;  //输出 
   PORTD =~((1<<PWM_1A)|(1<<PWM_1B));  //低电平,灯灭 
   //timer0_init(); 
   timer1_init(); 
   //timer2_init(); 
   //INT0_init(); 
  lcd12232_init(); 
  Lcd_In_Out=0xff;  
  send_command(0x01); 
  send_command(DDRAM_addr);  //设定地址 
  for(a=0;a<11;a++) 
    { 
   send_data(pgm_read_byte(&my_char_1[a])); 
      delay_ms(5); 
     }  
 send_command(DDRAM_addr+16);  //第二行 
 for(a=0;a<13;a++) 
  {  
   send_data(pgm_read_byte(&my_char_2[a])); 
   delay_ms(5); 
  } 
 
 sei(); 
 
 while (1) 
 { 
  if(updata==1) //注意这里要把updata 设定为voltalie的变量,否则不能在主程序中改变 
   { 
    //cli(); 
    calculate_zhuansu(); 
 //zhuansu=3401/T_zhuansu;  //k=7372800/1024=7200  时钟7.3728m 分频1024 
                            //7200*60/127=3401.57   转子齿数  127 
       //转速最高值 fosc*60/CHI*T_zhuansu*N  @8M  T_zhuansu=1 CHI=127  N=1024 
       //zhuansu=3690.944 
 //zhuansu=468750/(T_zhuansu*127);  //调试  齿数1个齿 
 //if(INT0_T0_count>10)zhuansu=0; 
 //temp=OCR1A*25; 
 //pulse_width=temp/256;     //  1024 为 10位PWM计数TOP值 
    pulse_width=OCR1B*25/256;  //pulse_width  为占空比  100/1024=25/256 
 display_5(3,zhuansu); 
 display_2(6,ICP_flag);  //调试 
 //display_5(3,ICP_count); 
 display_2(20,pulse_width); 
 updata=0; 
 //PORTB^=1<<LED; 
 //sei(); 
   } 
   
 } 
} 
 
//中断函数 
//定时器1捕获中断,外部中断0,定时器1溢出中断,定时器0溢出中断 
SIGNAL(SIG_INPUT_CAPTURE1) //定时器1输入捕获中断 
{ 
 if(calculated_flag==0) 
 { 
  if(ICP_flag==0) 
   { 
    //TIMSK=1<<TOIE1;  //使能定时器1溢出中断  
    //sei();  
    ICP_value=ICR1;  //读取当前捕获值 
    //cycle=ICP_T1_count*TOP+ICP_value-ICP_lastValue; 
    ICP_T1_count=0;  
 ICP_flag=1; 
    //cli(); 
    //TIMSK|=(1<<TICIE1)|(1<<TOIE0)|(1<<TOIE1); 
    //TIFR=1<<ICF1;  //如果要测量脉冲宽度,则要尽快清除标志位 设定为上升沿触发 
    //TCCR1B|=1<<ICES1;//下降沿触发 
   } 
  else 
   { 
    ICP_flag=0; 
    ICP_lastValue=ICR1; 
 ICP_count=ICP_T1_count; 
 calculated_flag=1;      //没有计算转速 
   }  
 } 
} 
 
 
//最大计时时间8.192ms  如果超过,则计数不准 
//也就是最小转速为   57转/分 
SIGNAL(SIG_OVERFLOW1)  //定时器1溢出中断 
{  
 ICP_T1_count++; 
 time_count10ms++;//8ms 
 updata=1; 
 if(time_count10ms>=100)  //800ms 
  { 
   //updata=1; 
   time_count10ms=0; 
    OCR1B+=1; 
    OCR1A+=10; 
   if(OCR1B>1023)OCR1B=1; 
   if(OCR1A>1000)OCR1A=1; 
  }  
 if(ICP_T1_count>=63) 
  { 
   ICP_T1_count=0;  //量程设定 
   ICP_flag=0;      //超出范围重新计数 
   zhuansu=0;      //如果转速小于最小值,回零 
  } 
} 
 
在这个程序中 
有时12232显示的转速值会不正常,很大 
一直查不到原因,有哪位大侠能指导下,谢谢 |   
 
 
 
 |