Быстрая версия:
Какой алгоритм я мог бы использовать для определения "разности фаз" между двумя прямоугольными сигналами с различными частотами, если единственной информацией, которую я имею, является время, в которое возникает каждый нарастающий фронт?
Подробная версия:
Я работаю над проектом встроенного программного обеспечения и столкнулся с интересной проблемой. Я собираю данные от двух датчиков скорости Холла , каждый из которых направлен на одно из двух зубчатых колес, как показано на следующей диаграмме:
Примечание:
Как указывало Jaime , сигналы на этой диаграмме фактически имели бы одинаковые частоты Реальное оборудование имеет еще несколько ступеней зацепления между двумя целевыми зубчатыми колесами, некоторые из которых соединены валами вместо зубчатых зацеплений, поэтому я делаю в итоге получаю две прямоугольные волны с разными частотами они все еще постоянны. Я хотел упростить диаграмму, чтобы понять суть вопроса, но, похоже, я слишком упростил ее!
/ примечание
Датчики скорости выдают прямоугольный сигнал, частота которого прямо пропорциональна скорости вращения каждой передачи. Нарастающие (и падающие) кромки прямоугольной волны возникают, когда передние (и задние) кромки одного зуба шестерни проходят мимо датчика.
Я знаю, сколько зубьев на каждой передаче, и на основе этой информации я могу точно измерить скорость вращения каждой передачи на основе частоты прямоугольных сигналов.
Для измерения частот у меня есть сигнал каждого датчика скорости, подключенный к выводу высокоскоростного таймера захвата на встроенном контроллере. Таймеры захвата автоматически обнаруживают нарастающие фронты прямоугольного сигнала, загружают регистр значением, представляющим время, в которое произошел переход, и запускают прерывание. Точки захвата для каждого сигнала обозначены на диаграмме желтым цветом. Процедура обработки прерываний выглядит примерно так:
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, он будет иметь ту же частоту, что и сигнал с более низкой скоростью (красный), а два сигнала будут иметь некоторую измеримую разность фаз, то есть разницу во времени между прерыванием красного сигнала и прерыванием синего сигнала. Я хотел бы вычислить эту же разницу во времени (или что-то эквивалентное) без необходимости записывать сигналы в течение длительного периода времени. Ресурсы ограничены встроенным контроллером, поэтому сохранение больших массивов прошедших переходных периодов не вариант.
Кто-нибудь сталкивался с этим раньше? Фактический проект имеет несколько таких механизмов и датчиков, поэтому я ищу элегантный алгоритм, который я могу использовать повторно. Заранее спасибо!