fengz41 发表于 2015-9-22 21:21:56

求老鸟帮忙 脉冲都去哪里了.

Arduino mini pro 板从D9输出脉冲,用PC871光耦隔离从D11接收做计数,去掉光耦情况同样.理想情况应该是每秒1000个脉冲实际结果是953到954.

求教大家怎么会漏掉这么多.

代码如下.

#include <Wire.h>

unsigned long aa=0;
unsigned long bb=0;
unsigned long dd=0;
unsigned int ee=0;

void setup()
{
pinMode(9, OUTPUT);
pinMode(11, INPUT);
pinMode(13, OUTPUT);
Wire.begin();
Serial.begin(115200);
}

void loop()
{
        if(dd==0){
          dd=micros();
        }
        if(micros()-dd>=500){
          if(digitalRead(9)){
          digitalWrite(9,LOW);
        }else{
                digitalWrite(9, HIGH);
        }
        dd=micros();
        }
       
        if(aa==0){
          aa=millis();
        }

if(millis()-aa>=1000){
      Serial.println(ee);
      aa=millis();
      ee=0;
}
if(digitalRead(11)==LOW){
      bb++;
}else if(bb>0){
        ee++;
        bb=0;
}
digitalWrite(13,!digitalRead(11));
}

Super169 发表于 2015-9-23 10:45:10

由於你要求的精確度去到 microseconds, 但每個指令執行都需要一點時間, 結果可能會出現輕微的差距.
每 500us 一次轉變, 只要變成 525us 左右, 就已失去了一定的脉冲.

我嘗試簡化了你的程序, 你看看 ee 顯示出來會是多少?



unsigned long aa=0;
unsigned long bb=0;
unsigned long dd=0;
unsigned int ee=0;

void setup()
{
Serial.begin(115200);
aa = millis();
dd = micros();
}

void loop()
{
if(micros()-dd>=500){
   ee++;
   dd=micros();
}

if(millis()-aa>=1000){
      Serial.println(ee);
      aa = millis();
      ee=0;
}

}



這裡已抽去了大部份 IO 指令, 單純的數, 我用 UNO 去執行, 也只可以得到 1977 左右, 當中已比理想的少了 23 次.

雖然, 你是希望每 500us 執行一次, 但 (micro() - dd >= 500) 只是做到最少 500us 才執行一次, 而非絕對地每 500us 執行一次.
結果有可能用了大約 525us 吧.

eddiewwm 发表于 2015-9-23 10:48:27

按分析,輸出應是每秒 906~907。 原因是除了原有的延遲外,還有運行的時間,並且在現行的程序中,運行時間也不是固定的。用示波器看看波形就可更明暸了 。努力!

swjtutl 发表于 2015-9-23 10:53:25

你试试用AVR编程,基本上延时不会超过1us的。

fengz41 发表于 2015-9-23 17:18:02

Super169 发表于 2015-9-23 10:45 static/image/common/back.gif
由於你要求的精確度去到 microseconds, 但每個指令執行都需要一點時間, 結果可能會出現輕微的差距.
每 500 ...

感谢解答,我明白了。。其实我只须要计算从传感器过来的脉冲。如果每秒250个以内的脉冲用中断方式计数会有多大误差呢?或者有没有什么办法可以产生一个准确的脉冲数。

linhongbin 发表于 2015-9-23 17:38:09

sdfsdfsdfsdfs

lkc8210 发表于 2015-9-23 19:35:23

本帖最后由 lkc8210 于 2015-9-23 19:37 编辑

fengz41 发表于 2015-9-23 17:18 static/image/common/back.gif
感谢解答,我明白了。。其实我只须要计算从传感器过来的脉冲。如果每秒250个以内的脉冲用中断方式计数会有 ...

用两块Arduino吧~一收一发
或者用555来产生脉冲

fengz41 发表于 2015-9-23 22:23:24

lkc8210 发表于 2015-9-23 19:35 static/image/common/back.gif
用两块Arduino吧~一收一发
或者用555来产生脉冲

十分感谢各们的解答.这个实验主要是测试PC817能否用于脉冲信号的隔离.第二是计数精度.目的已经达到了.
页: [1]
查看完整版本: 求老鸟帮忙 脉冲都去哪里了.