极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15219|回复: 7

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

[复制链接]
发表于 2015-9-22 21:21:56 | 显示全部楼层 |阅读模式
Arduino mini pro 板从D9输出脉冲,用PC871光耦隔离从D11接收做计数,去掉光耦情况同样.理想情况应该是每秒1000个脉冲实际结果是953到954.

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

代码如下.

  1. #include <Wire.h>

  2. unsigned long aa=0;
  3. unsigned long bb=0;
  4. unsigned long dd=0;
  5. unsigned int ee=0;

  6. void setup()
  7. {
  8.   pinMode(9, OUTPUT);
  9.   pinMode(11, INPUT);
  10.   pinMode(13, OUTPUT);
  11.   Wire.begin();
  12.   Serial.begin(115200);
  13. }

  14. void loop()
  15. {
  16.         if(dd==0){
  17.             dd=micros();
  18.         }
  19.         if(micros()-dd>=500){
  20.             if(digitalRead(9)){
  21.             digitalWrite(9,LOW);
  22.         }else{
  23.                 digitalWrite(9, HIGH);
  24.         }
  25.         dd=micros();
  26.         }
  27.        
  28.         if(aa==0){
  29.             aa=millis();  
  30.         }

  31.   if(millis()-aa>=1000){
  32.       Serial.println(ee);
  33.       aa=millis();
  34.       ee=0;
  35.   }
  36.   if(digitalRead(11)==LOW){
  37.       bb++;
  38.   }else if(bb>0){
  39.         ee++;
  40.           bb=0;
  41.   }
  42.   digitalWrite(13,!digitalRead(11));
  43. }
复制代码
回复

使用道具 举报

发表于 2015-9-23 10:45:10 | 显示全部楼层
由於你要求的精確度去到 microseconds, 但每個指令執行都需要一點時間, 結果可能會出現輕微的差距.
每 500us 一次轉變, 只要變成 525us 左右, 就已失去了一定的脉冲.

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



  1. unsigned long aa=0;
  2. unsigned long bb=0;
  3. unsigned long dd=0;
  4. unsigned int ee=0;

  5. void setup()
  6. {
  7.   Serial.begin(115200);
  8.   aa = millis();
  9.   dd = micros();
  10. }

  11. void loop()
  12. {
  13.   if(micros()-dd>=500){
  14.      ee++;
  15.      dd=micros();
  16.   }

  17.   if(millis()-aa>=1000){
  18.       Serial.println(ee);
  19.       aa = millis();
  20.       ee=0;
  21.   }

  22. }
复制代码



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

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

使用道具 举报

发表于 2015-9-23 10:48:27 | 显示全部楼层
按分析,輸出應是每秒 906~907。 原因是除了原有的延遲外,還有運行的時間,並且在現行的程序中,運行時間也不是固定的。用示波器看看波形就可更明暸了 。努力!
回复 支持 反对

使用道具 举报

发表于 2015-9-23 10:53:25 | 显示全部楼层
你试试用AVR编程,基本上延时不会超过1us的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-23 17:18:02 | 显示全部楼层
Super169 发表于 2015-9-23 10:45
由於你要求的精確度去到 microseconds, 但每個指令執行都需要一點時間, 結果可能會出現輕微的差距.
每 500 ...

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

使用道具 举报

发表于 2015-9-23 17:38:09 | 显示全部楼层
sdfsdfsdfsdfs
回复 支持 反对

使用道具 举报

发表于 2015-9-23 19:35:23 | 显示全部楼层
本帖最后由 lkc8210 于 2015-9-23 19:37 编辑
fengz41 发表于 2015-9-23 17:18
感谢解答,我明白了。。其实我只须要计算从传感器过来的脉冲。如果每秒250个以内的脉冲用中断方式计数会有 ...


用两块Arduino吧~一收一发
或者用555来产生脉冲
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-23 22:23:24 | 显示全部楼层
lkc8210 发表于 2015-9-23 19:35
用两块Arduino吧~一收一发
或者用555来产生脉冲

十分感谢各们的解答.这个实验主要是测试PC817能否用于脉冲信号的隔离.第二是计数精度.目的已经达到了.
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 16:05 , Processed in 0.062906 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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