Быстрая версия:Алгоритм определения эффективной «разности фаз» между двумя сигналами с разными частотами?
Какого алгоритма я мог бы использовать, чтобы определить «разность фаз» между двумя квадратными волновыми сигналами с различных частотами, если только информация, что у меня есть время, когда каждый нарастающий фронт имеет место?
подробная версия:
Я работаю на встроенном программном проекте, и я перебежать интересную проблему. Я сбор данных от двух hall-effect speed sensors, каждый из которых, направленной на одном из двух зацеплении зубчатых колес, как показано на следующей схеме:
meshed gears and pulse signals http://img291.imageshack.us/img291/4905/gears.png
примечание:
Как Jaime указывалось, сигналы в этом диаграмма будет иметь одинаковые частоты. В реальном оборудовании есть еще несколько ступеней зацепления между двумя целевыми передачами, некоторые из которых соединены валами вместо сложенных зубьев, поэтому I do заканчиваются двумя квадратными волнами, которые имеют разные частоты, а соотношение между ними по-прежнему является постоянная. Я хотел упростить диаграмму, чтобы добраться до мяса, но похоже, что я слишком упростил ее!
/примечание
Датчики скорости выходного сигнала прямоугольной волны, частота которого прямо пропорциональна скорости вращения каждой шестерни. Восходящие (и падающие) края прямоугольной волны возникают, когда передний (и задний) края зубчатой шестерни проходят через датчик.
Я знаю, сколько зубов на каждой передаче, и на основе этой информации я могу точно измерить скорость вращения каждой передачи в зависимости от частоты сигналов прямоугольной волны.
Для измерения частот у меня есть каждый сигнал датчика скорости, подключенный к высокоскоростному таймеру таймера захвата на встроенном контроллере. Таймеры захвата автоматически определяют нарастающие фронты сигнала квадратной волны, загружают регистр со значением, представляющим время, в которое произошел переход, и запускают прерывание. Точки захвата для каждого сигнала обозначены желтым на диаграмме. Процедура обслуживания прерывания выглядит примерно так:
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;
}
То, что я хотел бы сделать:
Я хотел бы быть в состоянии обнаружить небольшие различия в относительной времени этих двух меандра сигналы. Я называю это «разностью фаз» из-за отсутствия лучшего термина. Если бы оба сигнала имели одинаковую частоту, это было бы просто, и phase difference был бы правильным термином для использования.
Вот что я получаю: если бы я записывал два сигнала в течение длительного периода времени, а затем искусственно замедлял (или «растягивал») высокоскоростной (синий) сигнал в 16/9, он имел бы ту же частоту, что и сигнал с меньшей скоростью (красный), и два сигнала имели бы некоторую измеримую разность фаз, т. Е. Разницу во времени между прерыванием красного сигнала и прерыванием синего сигнала.Я хотел бы вычислить эту разницу во времени (или что-то подобное) без необходимости записи сигналов в течение длительного периода времени. Ресурсы ограничены встроенным контроллером, поэтому хранение больших массивов прошлых периодов перехода не является вариантом.
Кто-нибудь сталкивался с этим раньше? Фактический проект имеет несколько таких механизмов передачи и датчиков, поэтому я ищу элегантный алгоритм, который я могу повторно использовать. Заранее спасибо!
, поскольку 2 зубца соединены друг с другом. Как бы вы предположили, что они могут работать «не в фазе»? – Toad
Напряжение на деталях, износ зубьев шестерни, небольшие эффекты реального мира. Это (конечно) упрощенный пример. Реальная система может иметь другие ступени передачи между двумя, на которых установлены датчики. Все небольшие допуски между наборами зубов могут привести к довольному количеству игры. Вы правы в том, что шестерни не могут получить * по существу * «не в фазе» без серьезного нарушения физической системы. То, что я пытаюсь измерить, - небольшие отклонения от нормы. –
Если вы «растягиваете» один сигнал, вам нужно начало (t = 0). Это произвольно, но этот выбор определит вашу разность фаз. Следовательно, даже если вы создадите «истинную» разность фаз таким образом, ее значение будет произвольным из-за вашего выбора t = 0 – MSalters