搜索
bottom↓
回复: 16

用霍尔测小车速度,程序中,计算两次外部中断的时间怎么写,用固定时间计算圈数貌似误差挺

[复制链接]

出0入0汤圆

发表于 2011-8-5 09:24:20 | 显示全部楼层 |阅读模式
rt

出0入0汤圆

发表于 2011-8-5 09:31:14 | 显示全部楼层
小车速度不快,测量周期就好了。用捕获功能

出0入0汤圆

发表于 2011-8-5 09:52:14 | 显示全部楼层
做一个Xms的定时器,中断的时候计数清零,下次中断的时候看看记了多少个数不就行了?

出0入0汤圆

发表于 2011-8-5 10:01:44 | 显示全部楼层
如果不用捕获功能的话,可以这么做!

但是要有个额外的定时器

大致代码结构如下:

void main()
{
  系统初始化;
  启动定时器;
}

计数中断
{
   关闭定时器;
   根据定时器的当前计数值、周期和溢出次数计算时间间隔;
   溢出次数=0;
   计数寄存器清零;
   启动定时器;
}

定时器周期中断
{
   溢出次数++;
}

出0入0汤圆

 楼主| 发表于 2011-8-5 11:29:23 | 显示全部楼层
回复【3楼】yisea123  
-----------------------------------------------------------------------

请问溢出次数的作用是??

出0入0汤圆

发表于 2011-8-5 12:31:16 | 显示全部楼层
你用霍尔测速,说明速度肯定不快,那么,用计时算脉冲肯定误差大。不用用捕获,计算脉冲间时间差。

出0入0汤圆

发表于 2011-8-5 13:52:25 | 显示全部楼层
速度慢的时候会出现一个定时器周期完了还没来外部中断。

假设时间间隔为dT,溢出次数为N,计数器值为NC,周期寄存器的值为NT ,而定时器频率为f则

dT=(NT/f)*N + NC/f =(NT*N +NC)/f

出0入0汤圆

 楼主| 发表于 2011-8-5 23:57:09 | 显示全部楼层
回复【6楼】yisea123  
-----------------------------------------------------------------------

有道理,我也是如此操作了,但是显示出来不对,麻烦帮忙看看程序

#include <iom128v.h>
#include <macros.h>
                                
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long

#include"Display.c"

void init(void);


uint count=0;
ulong speed=0;
float time=0;
uint time1=0;
float time2=0;
const uchar temp[]={"speed:   r/s"};
uchar table[6]={0,0,0,0,0,0};

void init(void)
{
         DDRA=0xFF;
         PORTA=0XFF;


         DDRD=0XF0;
         PORTD=0XFF;//带上拉输入
         
         SREG|=BIT(7); //开全局中断

         EIMSK=0x01;   //开外部中断0
         EICRA=0x02;//外部中断0
         
         
         
         
         
         TCCR1B=0x04;//256分频
     TCNT1H=0;
     TCNT1L=0;

}

void main(void)
{
        uint i;
   
        LCD_init();
        LCD_String(0,0,temp);

         init();
         while (1)
         {

         
          Write_Add(3,0);
          Write_Num(table[0]);
          Write_Num(table[1]);
          Write_Num(table[2]);
          Write_Num(table[3]);
          Write_Num(table[4]);
          Write_Num(table[5]);
         
       
         }
}


#pragma interrupt_handler ext_int0_isr:2 //指定外部中断函数
void ext_int0_isr(void)
{
       
         TIMSK=0;//关中断
         time1=(256*TCNT1H+TCNT1L);
         time2=time1*0.000032;
         
         time=2.097*count+time2;
         speed=(1/time);
         table[0]=speed/10000;
         table[1]=speed%10000/1000;
         table[2]=speed%10000/1000;
         table[3]=speed%1000/100;
         table[4]=speed%100/10;
         table[5]=speed%10;
         count=0;
         TCNT1H=0;
     TCNT1L=0;
         TIMSK|=BIT(2);//开中断
         
}



#pragma interrupt_handler BBB:15

void BBB(void)
{
         count++;
}

出0入0汤圆

 楼主| 发表于 2011-8-5 23:58:38 | 显示全部楼层
回复【1楼】xsh2005105326  咖啡糖
-----------------------------------------------------------------------

这是个好方法,请问在捕获中断中的程序改怎么写,求出两次中断的计数时间差吗,然后次数清零,计数清零?

出0入0汤圆

发表于 2011-8-7 19:13:19 | 显示全部楼层
回复【7楼】fangliang425
-----------------------------------------------------------------------

不是在两个外部中断中开关定时器中断,而是在外部中断中开关定时器。

定时器中断是一直打开的。

还有,两个外部中断的优先级要高于定时器中断的优先级

出0入0汤圆

 楼主| 发表于 2011-8-8 09:02:51 | 显示全部楼层
回复【10楼】yisea123  
-----------------------------------------------------------------------

能具体点吗?外部定时器?

出0入0汤圆

发表于 2011-8-8 09:49:03 | 显示全部楼层
回复【11楼】fangliang425
回复【10楼】yisea123   
-----------------------------------------------------------------------
能具体点吗?外部定时器?
-----------------------------------------------------------------------

不好意思打错字了,已经就地更正。

出0入0汤圆

 楼主| 发表于 2011-8-9 08:41:30 | 显示全部楼层
回复【12楼】yisea123  
-----------------------------------------------------------------------

我只用了一个外部中断,还有如何不用开关中断来开关定时器?

出0入0汤圆

发表于 2011-8-9 09:32:37 | 显示全部楼层
回复【13楼】fangliang425
回复【12楼】yisea123   
-----------------------------------------------------------------------
我只用了一个外部中断,还有如何不用开关中断来开关定时器?
-----------------------------------------------------------------------

如果只是测速度不判定方向的话一个外部中断也行。


怎么开关定时器这个要看你芯片手册了。

出0入0汤圆

发表于 2011-12-5 16:58:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-11 20:45:48 | 显示全部楼层
灰机
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-11 01:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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