本帖最后由 左岸cpx 于 2016-9-1 16:08 编辑
前言:在MCU中,我们常用定时器边缘捕获的功能来测量方波信号的频率值。在FPGA中,我们经常用“等精度测量的原理”无误差地测量方波的频率。而对于我们的"小电脑"爱迪生,如何去测量方波频率,并尽量减少测量误差呢? 答案是“外部中断+获取时间戳”,两个上升沿或下降沿所在时间戳之差,即方波周期,得到周期那么频率自然就出来了。鉴于爱迪生的超高速(相对MCU来说),测量方波的频率误差也非常小。(但是肯定比不过等精度的测量方法,哈哈。)
另外,为了区别“无频率”或“频率非常小”两种情况,本文的代码设置了超时时间判定,来提高响应速度。
步骤1:直接上代码var mraa = require("mraa"); var back_time = 0; var interval = 0; var freq = 0; var wave_begin = true;
var key = new mraa.Gpio(8); key.dir(mraa.DIR_IN); key.isr(mraa.EDGE_RISING, function(){ if(wave_begin){ var d = new Date(); front_time = d.getTime(); wave_begin = false; }else{ var d = new Date(); back_time = d.getTime(); wave_begin = true; interval = back_time - front_time; } });
//主循环 setInterval(function(){ var d = new Date(); var time_now = d.getTime(); if(time_now - back_time > 1500){ //1.5秒超时,认为无信号,freq = 0 Hz interval = 0; } //计算频率 if(0 == interval){ freq = 0; }else{ freq = 1000/interval; } console.log("The frequency is " + freq + " Hz"); }, 1000);
步骤2:分析代码实验目的:通过外部中断和time时间戳来测量方波频率 原理:方波信号作为外部中断源,第一个上升沿(前沿front_time)到来时,爱迪生记录前沿时间戳;第二个上升沿(后延back_time)到来时,爱迪生记录后延时间戳。两个时间戳之差就是该方波的周期(注意时间戳的单位是毫秒哦!)。 问:什么叫做时间戳? 答:时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数。 在中断服务函数中记录方波前沿和后延对应的时间戳,在主循环中计算方波频率。设置超时时间为1.5秒(所以,测量最低范围是1/1.5 Hz),1秒钟打印一次测量频率。 步骤3:实验现象我这边是通过CPLD输出了频率为100 Hz的方波信号,和爱迪生共地后连接IO8,观察实验现象: |