极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11874|回复: 5

霍尔传感器测速

[复制链接]
发表于 2015-2-5 12:34:45 | 显示全部楼层 |阅读模式
int pin=2;
int i=0;
int val=0;
int a;
int dis=0;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(pin,INPUT);
  attachInterrupt(0,hello,FALLING);
}

void loop() {
  if(val==LOW)
  {
    hello();
  }
}

void hello()  {
  i++;
  a=2.026*i;
  dis=a;
  Serial.print(dis);
  Serial.println("KM");
}

用霍尔传感器测里程为什么显示出来不对呢?求教
回复

使用道具 举报

发表于 2015-2-5 15:13:50 | 显示全部楼层
loop里面的东西全部删除即可。
回复 支持 反对

使用道具 举报

发表于 2015-2-6 15:33:01 | 显示全部楼层
林定祥 发表于 2015-2-5 15:13
loop里面的东西全部删除即可。

你已经打开了中断程序,不管loop里面在干什么,中断来了就会进入中断处理相应的程序,处理完了会推出中断,继续原来的程序.从你的程序看有重叠了,loop中同样去了中断程序.
回复 支持 反对

使用道具 举报

发表于 2015-2-6 20:26:00 | 显示全部楼层
你现在开了中断,这样用也可以。但是,你用loop里的跳转也可以,但是你少乐端口变化的检测,只有端口发生时才能跳到处理的子程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-11 16:08:49 | 显示全部楼层
林定祥 发表于 2015-2-6 20:26
你现在开了中断,这样用也可以。但是,你用loop里的跳转也可以,但是你少乐端口变化的检测,只有端口发生时 ...

boolean ledstate=false;
int i=0;
int pin=2;
float spd1=0.0;
float cad1=0.0;
float dis1=0.0;
float avg1=0.0;
float starttime=0.00000;
float endtime=0.000000;

void setup()
{
  Serial.begin(9600);
  pinMode(pin,INPUT);
}

void loop() {
  starttime=millis();
  if (!digitalRead(pin))
          {
               SPD();
               DIS();
          }
}
void SPD(){
  endtime=millis();
  spd1=(2.026/(endtime-starttime))/360000000;
  float cad1;
  cad1=spd1/(0.06)/2.026/2;
}

void DIS()  {
  i++;
  dis1=(2.026*i)/1000;
  avg1=dis1/(millis()/360000000);
}
像这样我不用中断计算有什么问题吗?
回复 支持 反对

使用道具 举报

发表于 2015-2-12 08:34:48 | 显示全部楼层
你可以实践一下,从程序逻辑上没有什么问题.但是,你现在检测的是低电平,如果低电平周期是一个ms,那么在这个周期的任何点上都可能被检测到,因此会有一定的误差范围,同时如果loop里事干多了,错过了一次低电平的检测,那么也会造成误差.
像这种有事件明显变化的情况,建议使用边沿变化检测的中断.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-8 09:02 , Processed in 0.035536 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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