首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定不同频率信号间有效相位差的算法?

确定不同频率信号间有效相位差的算法?
EN

Stack Overflow用户
提问于 2009-07-21 07:36:09
回答 6查看 3.4K关注 0票数 9

快速版本:

如果我拥有的唯一信息是每个上升边缘发生的时间,我可以用什么算法来确定两个不同频率的方波信号之间的“相位差”?

详细版本:

我正在做一个嵌入式软件项目,我遇到了一个有趣的问题。我正在从两个霍尔效应速度传感器中收集数据,它们分别针对两个网格齿轮中的一个,如下图所示:

注:

正如詹姆所指出的,这个图表中的信号实际上有相同的频率。真正的硬件在两个目标齿轮之间有几个更多的齿轮啮合阶段,其中一些是由轴而不是网状齿连接起来的,所以我最终得到了两个不同频率的方波,它们之间的比率仍然是恒定的。我想简化这张图,以得到问题的实质,但看起来我简化得太多了!

/note

速度传感器输出方波信号,其频率与每个齿轮的转速成正比。当单个齿轮的前缘(和后缘)通过传感器时,方波的上升(和下降)边缘发生。

我知道每个齿轮上有多少齿,根据这些信息,我能够根据方波信号的频率精确地测量每个齿轮的转速。

为了测量频率,我将每个速度传感器信号连接到嵌入式控制器上的高速捕获计时器引脚上。捕获计时器自动检测方波信号的上升边缘,加载一个值表示转换发生时间的寄存器,并触发中断。每个信号的捕获点在图上用黄色表示。中断服务例程如下所示:

代码语言:javascript
复制
struct
{
    long previousTime;
    int frequency;
}
sensors[2];

void CaptureTimer_Interrupt(int channel, long transitionTime)
{
    long timeDifference = transitionTime - sensors[channel].previousTime;
    sensors[channel].frequency = CONVERSION_FACTOR / timeDifference;
    sensors[channel].previousTime = transitionTime;
}

我想做的事:

我希望能够探测到这两个方波信号的相对定时的微小差异。我称之为“相位差”,因为没有一个更好的术语。如果这两个信号具有完全相同的频率,这将是直接的,相位差将是正确的术语使用。

这就是我要做的:如果我在很长一段时间内记录这两个信号,然后人为地减慢(或“伸展”)高速(蓝色)信号的速度是16/9的一倍,它的频率将与低速(红色)信号完全相同,这两个信号将有一些可测量的相位差,即红色信号中断和蓝色信号中断之间的时间差。我想计算同样的时间差(或类似的东西),而不必在很长时间内记录信号。嵌入式控制器上的资源有限,因此存储过去过渡时间的大数组不是一种选择。

以前有人遇到过这种情况吗?实际的项目有几个这样的齿轮和传感器的安排,所以我正在寻找一个优雅的算法,我可以重用。提前感谢!

EN

回答 6

Stack Overflow用户

发布于 2009-07-21 08:14:49

整个信号,即当你把红色和蓝色相加时得到的信号,相位长度是蓝色的16倍,是红色信号的9倍。你可以测量每16个蓝色和每9个红色上升侧翼之间的时间差。

我想你要测量的是齿轮的磨损。我认为,如果没有均匀的牵引,这种测量可能会受到齿轮公差的影响(引入噪声)。

票数 2
EN

Stack Overflow用户

发布于 2009-07-22 19:52:37

既然我们说的是“相位”,那么测量这两种波形相互加强时产生的“拍子”似乎是合理的。

也许是这样的:

代码语言:javascript
复制
void cog_phase_monitor2( int cog, int t )
{
    static int last_a, last_b, last_beat, last_beat_delta = 0;;
    int beat = 0;
    if( cog == 1 ) {
        if( t - last_b < 1 )
            beat = 1;
        last_a = t;
    }
    if( cog == 2 ) {
        if( t - last_a < 1 )
            beat = 1;
        last_b = t;
    }
    if( beat ) {
        printf("**** delta beat %d \n",t-last_beat);
        if( last_beat_delta ) {
            if( last_beat_delta != t-last_beat ) {
                printf("!!!Warning beat just changed !!!\n");
                last_beat_delta = 0;
            }
        } else {
            last_beat_delta = t-last_beat;
        }
        last_beat = t;
    }

}

现在,如果我们把它插入两个齿轮的模拟中,一个是9颗牙齿,另一个是16颗牙齿,它们以每秒10转的速度旋转。

代码语言:javascript
复制
B at 6 msecs
A at 11 msecs
B at 12 msecs
B at 18 msecs
A at 22 msecs
B at 24 msecs
B at 30 msecs
A at 33 msecs
B at 36 msecs
B at 42 msecs
A at 44 msecs
B at 48 msecs
B at 54 msecs
A at 55 msecs
B at 60 msecs
A at 66 msecs
B at 66 msecs
**** delta beat 66
B at 72 msecs
A at 77 msecs
B at 78 msecs
B at 84 msecs
A at 88 msecs
B at 90 msecs
B at 96 msecs
A at 99 msecs
B at 102 msecs
B at 108 msecs
A at 110 msecs
B at 114 msecs
B at 120 msecs
A at 121 msecs
B at 126 msecs
A at 132 msecs
B at 132 msecs
**** delta beat 66
B at 138 msecs
A at 143 msecs
B at 144 msecs
B at 150 msecs
A at 154 msecs
B at 156 msecs
B at 162 msecs
A at 165 msecs
B at 168 msecs
B at 174 msecs
A at 176 msecs
B at 180 msecs
B at 186 msecs
A at 187 msecs
B at 192 msecs
A at 198 msecs
B at 198 msecs
**** delta beat 66

现在,如果我们在其中一个齿轮上加1毫秒的延迟:

代码语言:javascript
复制
B at 6 msecs
A at 11 msecs
B at 12 msecs
B at 18 msecs
A at 22 msecs
B at 24 msecs
B at 30 msecs
A at 33 msecs
B at 36 msecs
B at 42 msecs
A at 44 msecs
B at 48 msecs
B at 54 msecs
A at 55 msecs
B at 60 msecs
A at 66 msecs
B at 66 msecs
**** delta beat 66
B at 72 msecs
A at 77 msecs
B at 78 msecs
B at 84 msecs
A at 88 msecs
B at 90 msecs
B at 96 msecs
A at 99 msecs
B delayed at 102 msecs
B at 103 msecs
B at 109 msecs
A at 110 msecs
B at 115 msecs
A at 121 msecs
B at 121 msecs
**** delta beat 55
!!!Warning beat just changed !!!
B at 127 msecs
A at 132 msecs
B at 133 msecs
B at 139 msecs
A at 143 msecs
B at 145 msecs
B at 151 msecs
A at 154 msecs
B at 157 msecs
B at 163 msecs
A at 165 msecs
B at 169 msecs
B at 175 msecs
A at 176 msecs
B at 181 msecs
A at 187 msecs
B at 187 msecs
**** delta beat 66
B at 193 msecs
A at 198 msecs
B at 199 msecs
B at 205 msecs

这似乎是一个充满希望的开端-)

票数 2
EN

Stack Overflow用户

发布于 2009-07-21 13:57:03

我认为这比这更简单。

每隔16*9次取样(在大齿轮上),车轮就在它们开始时所在的位置。

所以你要做的是:

  • 在大齿轮上取样,及时挑选任何一个点。在你取样小齿轮之前,也要测量一下时间。记住这个价值。
  • 每16*9个大齿轮取样(为什么这听起来可疑?)再次进行相同的度量,并将其与基值进行比较。当时机开始改变时,你就有问题了。

R

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1157749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档