我必须通过轮询 5 个不同的引脚来读取高达 20KHz 的 5 个不同频率(方波)。我只使用一个定时器中断,每 1 毫秒。引脚的轮询将在 ISR 中完成。
到目前为止我想到的算法是:1.Count HIGH 2.Count LOW 3.检查 HIGH+LOW 的总和是否=时间段。这个算法看起来很慢,不实用。
是否有任何过滤器函数可用于检查 pin 处的频率,以便我所要做的就是调用该函数?用于频率检测的任何其他算法都会很好。
我的代码中仅限于 1 个中断(定时器中断)
我必须通过轮询 5 个不同的引脚来读取高达 20KHz 的 5 个不同频率(方波)。我只使用一个定时器中断,每 1 毫秒。引脚的轮询将在 ISR 中完成。
到目前为止我想到的算法是:1.Count HIGH 2.Count LOW 3.检查 HIGH+LOW 的总和是否=时间段。这个算法看起来很慢,不实用。
是否有任何过滤器函数可用于检查 pin 处的频率,以便我所要做的就是调用该函数?用于频率检测的任何其他算法都会很好。
我的代码中仅限于 1 个中断(定时器中断)
你需要记住输入信号的属性是什么
速度
我会像这样使用您的约束对其进行编码(它只是不使用您的平台的 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
如果需要[笔记]