我必须通过查询5个不同的引脚来读取高达20KHz的5种不同频率(方波)。 我只使用一个定时器中断,每1毫秒。 引脚的轮询将在ISR中完成。
到目前为止我想到的算法是: 1. HIGH的数量 2. LOW的数量 3.检查HIGH + LOW的总和=时间段。 这个算法似乎很慢,不实用。
是否有任何滤波器功能可用于检查引脚的频率,以便我所要做的就是调用该功能? 用于频率检测的任何其他算法都会很好。
我的代码中仅限于1个中断(定时器中断)
答案 0 :(得分:0)
您需要记住输入信号属性是什么
<强>速度强>
我会用这样的约束来编码它(它只是不使用你的平台的C ++伪代码):
const int n=5;
volatile int T[n],t[n],s[n],r[n]; // T last measured period,t counter,s what edge is waitng for?
int T0[n]={?,?,?,...?}; // periods to compare with
void main() // main process
{
int i;
for (i=0;i<n;i++) { T[i]=0; t[i]=0; s[i]=0; r[i]=0; }
// config pins
// config and start timer
for (;;) // inf loop
{
for (i=0;i<n;i++) // test all pins
if (r[i]>=2) // ignore not fully measured pins
{
r[i]=2;
if (abs(T[i]-T[0])>1) // compare +/- 1T of timer can use even bigger number then 1
// frequency of pin(i) is not as it should be
}
}
}
void ISR_timer() // timer interrupt
{
// test_out_pin=H
int i;
bool p;
for (i=0;i<n;i++)
{
p=get_pin_state(i); // just read pin as true/false H/L
t[i]++; // inc period counter
if (s[i]==0){ if ( p) s[i]=1; } // edge L->H
else { if (!p) s[i]=0; T[i]=t[i]; t=0; r[i]++; } // edge H->L
}
// test_out_pin=L
}
s[]
p0=p1; p1=get_pin_state(i); if ((p1)&&(p0!=p1)) { T[i]=t[i]; t[i]=0; }
如果没有您的奇怪限制,我该怎么做?
s
或Hz
[注释]