找回密码
 立即注册

QQ登录

只需一步,快速开始

点击进入授权页面

只需一步,快速开始

  • QQ空间
  • 回复
  • 收藏

参加活动: 0

组织活动: 0

  • TA的每日心情
    奋斗
    2015-8-12 10:36
  • 签到天数: 1 天

    [LV.1]初来乍到

    osler 新手上路 2015-8-12 10:35 楼主
    本帖最后由 osler 于 2015-8-12 10:55 编辑

        接触Arduino不久,做一个小项目,需要接收一个外部触发,然后发出两个触发信号。两个触发信号间可以按需要调整延迟间隔。精度是微秒级us。
        结果在做的时候发现Arduino输出的脉冲(方波)信号不稳定,通过示波器可以观察到出现无明显规律的左右抖动,抖动时间有长有短,最大可以达到5-6us。各方想办法还是无法解决,到此向各位先辈和大神求教,请指点!

        软件附在下面。
        外部硬件很简单,就是信号发生器的脉冲信号直连Arduino的外部中断口,管脚输出直连示波器。通道一是监控的脉冲信号,通道二是Arduino发出的没有延时的信号,示波器以通道一触发。相隔5us左右。抖动情况如下图



    [Bash shell] 纯文本查看 复制代码
    /*
      Trigger delay and output.
      Get a trigger from int.1(DP3),then output a delay from DP5 and itself from DP4
      delay time is time_delay;
      ------------------------------------------------------
      edit by xx 2015-07-31
     */
    
    #include "arduino2.h"  //快速IO的一个库,重新定义了一些函数,如:pinMode2、digitalWrite2
     
    
    const int trigger_delay = 5;  
    const int trigger = 4;
                            int time_delay = 10;  //time for delay,us
    
    // the setup routine runs once when you press reset:
    void setup() {                
      // initialize the digital pin as an output.
      pinMode2(trigger_delay, OUTPUT);    
      pinMode2(trigger, OUTPUT); 
      attachInterrupt(1, blink, RISING);//trigger by TTL rising.
    }
    
    // the loop routine runs over and over again forever:
    void loop() {
     //   digitalWrite2(trigger_delay, LOW);    // turn the triggers off by making the voltage LOW
     // digitalWrite2(trigger,LOW);
    }
    
    void blink()
    {
    
      digitalWrite2(trigger,HIGH);            // output input trigger
      delayMicroseconds(time_delay);               // delay
      digitalWrite2(trigger_delay, HIGH);   // output delay trigger
      delayMicroseconds(100);               // High TTL level triggers last for 100us
      digitalWrite2(trigger_delay, LOW);    // turn the triggers off by making the voltage LOW
      digitalWrite2(trigger,LOW);
      
    }


    做过的尝试如下:
        1,更换信号源,现象仍然存在。
        2,更改信号源频率,发现只要频率超过40Hz,都会出现
    个人认为与信号源没有关系
        3,将示波器接到Arduino的两个输出上,发现二者基本是同步抖动。
    所以与示波器无关,是Arduino的软件或者硬件问题
        4,修改程序,不使用中断,使用查询高电平的方法,发现抖动还是有,但是没之前频繁
    所以有一点点怀疑是软件问题,但是不太确信,以为如下5
        5,怀疑是中断时候,状态保存的时间不一致造成的问题。但是,中断现场保存,应该不会超过20个指令吧?那怎么也不会是抖动到5us呀

    最后,我不知道是什么原因了,难道是晶振周期和外部触发周期的误差积累?可是这样会造成5us级的抖动么?

    请各位大神指点分析呀{:soso_e183:}


    方波出现抖动时

    方波出现抖动时

    无抖动时

    无抖动时
    请把头文件分享一下
    发新帖
    发表评论
    高级模式  
    您需要登录后才可以回帖 登录 | 立即注册  
    关闭

    推荐主题 上一条 /2 下一条