本帖最后由 左岸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,观察实验现象:
可以看到在控制台打印出了 方波频率!