一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 3012|回复: 4

[其他综合] 有关转速测量的精度

[复制链接]
发表于 2012-4-13 19:17 | 显示全部楼层 |阅读模式
想弄个转速测量的东东,问下如何利用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显示的转速值会不正常,很大
一直查不到原因,有哪位大侠能指导下,谢谢
发表于 2012-4-13 20:26 | 显示全部楼层
calculate_zhuansu();

这函数在哪?里头计算会不会溢出
回复

使用道具 举报

 楼主| 发表于 2012-4-13 21:17 | 显示全部楼层
本帖最后由 liuchengliaaa 于 2012-4-13 21:19 编辑

回复 2# 阳光999


   这个函数是10ms定时器定时执行的,应该不会溢出吧?
   这里因为要用到双路的pwm,所以用的是11位的快速pwm,top为1024
回复

使用道具 举报

 楼主| 发表于 2012-4-13 21:26 | 显示全部楼层
怎么没有人解答呢?有没有谁弄过等精度测量车速的方法呀?给个算法。
实在是不晓得如何弄了
回复

使用道具 举报

发表于 2012-4-13 21:32 | 显示全部楼层
我是说变量溢出

你要人家解答得把完整代码发上来呀,老是靠猜测很难有结果的
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-11-4 20:01 , Processed in 0.031110 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表