Полная версия этой страницы:
Синхронизируем таймеры. Идеи.
Всем доброго времени суток. Никак не могу додумать алгоритм синхронизации с резервированием. Подкиньте идеек по реализации)
Как сделал я: есть два таймера, тикающие с частотами 4кГц и 12.8кГц... На ногу мк получаю импульс раз в секунду в качестве внешней синхронизации... От этого импульса тактирую третий таймер, он генерит триггер и сбрасывает два вышеуказанных таймера что обеспечивает их одновременный старт... Грубо говоря, действия начинаются в момент прихода синхросигнала(в нулевой момент времени) => последний тик таймеров 4 и 12.8кГц должен быть (n-1)'й, где n - 4к и 12.8к соответственно... А при отсутствии синхронизации n'й тик этих таймеров является нулевым для следующей секунды и т.д.
А теперь о проблемах:
Сделал то что выше указал, но из-за того что синхросигнал внешний, кварцы разные, таймеры 4 и 12.8кГц могут успеть добежать до n'го тика раньше чем придет синхросигнал и их сбросит. Можно сделать остановку таймеров после (n-1)'го тика, а синхросигналом их запускать, но тогда система будет зависть очень сильно от синхросигнала, а нужно чтобы и с синхросигналом работало и без него... Подкиньте идеек, как все это провернуть и можно ли вообще ?
п.с. надеюсь смог объяснить хоть как-то, извиняюсь, начинающий... мк: stm32f4vgt6....
Я правильно понял, что нужно "умножить" внешнюю частоту 1 Гц до 4 кГц и 12,8 кГц? Привязка по фазе нужна? Или фазе можно плыть? В каких пределах может плыть фаза (или частота)?
Я бы измерял третьим таймером период синхроимпульсов и вычислял бы, на сколько надо скорректировать период таймеров 4 и 12,8 кГц. Если это делать аккуратно, можно и фазу держать.
Цитата(scifi @ Mar 22 2016, 10:09)

Я правильно понял, что нужно "умножить" внешнюю частоту 1 Гц до 4 кГц и 12,8 кГц? Привязка по фазе нужна? Или фазе можно плыть? В каких пределах может плыть фаза (или частота)?
Я бы измерял третьим таймером период синхроимпульсов и вычислял бы, на сколько надо скорректировать период таймеров 4 и 12,8 кГц. Если это делать аккуратно, можно и фазу держать.
Можно и так сказать, но при потере синхроимпульсов система должна продолжать работать... Фаза +- 1мкС может плавать... А если синхросигнал придет на 1 такт позже, то получу лишнее срабатывание ведь ?
Shamil
Mar 22 2016, 11:13
Цитата(Fobes @ Mar 22 2016, 16:43)

Можно и так сказать, но при потере синхроимпульсов система должна продолжать работать... Фаза +- 1мкС может плавать... А если синхросигнал придет на 1 такт позже, то получу лишнее срабатывание ведь ?
Лучше, наверное, не сбрасывать таймеры по синхроимпульсу,
а фиксировать значения таймеров во время прихода синхроимпульсов,
и по отклонению этих значений от требуемых, подстраиваить частоту таймеров.
Т.е. сделать ФАПЧ.
Цитата(Fobes @ Mar 22 2016, 13:43)

А если синхросигнал придет на 1 такт позже, то получу лишнее срабатывание ведь ?
Вы, наверное, совсем не поняли, что я имел в виду. Ну да ладно. Кстати, а имел в виду именно ФАПЧ, как написал Shamil.
Tarbal
Mar 22 2016, 12:58
Две идеи
1.
Как-то делал систему, которая должна была измерять время от одного источника частоты, но он мог пропадать и тогда в таких интервалах необходимо было подхватывать менее стабильным на часовом кварце.
Я придумал неплохое рещение без проскальзывания.
Основной источник дает временной интервал с некоторым опережением по сравнению со вторичным. По достижению первичным источником конца временного интервала вторичный источник обнулялся и все начиналось сначала. Если вторичный источник пропадал, то с неболшим сдвигом подхватывал вторичный источник.
Скажем так:
Счетчик первичного сигнала считает миллисекунды до 1000 начиная с нуля, а вторичного начиная с минус двух. При достижении значения 1000 первичный счетчик перезаписывает в себя ноль, а во вторичный -2. Если до 1000 досчитал вторичный счетчик, то он себя обнулил и все. Секундные сигналы генерируются по достижению 1000 любым из счетчиков.
2.
Как синхронизироваться по фазе к синусу.
Самое нетривиальное -- измерить фазу синуса.
Сунус в однобитном представлении позволит определить фазу с точностью до 180 градусов.
Удваиваем точность:
Синус и косинус позволяют определить фазу с точностью до 90 градусов:
первый квадрант 11, второй 10, третий 00 и четвертый 01
Синус из косинуса получается диференцированием, а проще говоря, вычитанием каждого последующего значения из каждого предыдущего.
Учетверяем точность:
квадрат синуса без постоянной составляющей дает функцию удвоенной частоты, плюс ее производная. Добавляем еще один бит.
И так далее. Мне хватило точности в 90 градусов.
Итак расписываем последовательно числа, соответствующие фазам исходного сигнала. Строим машину состояний:
Каждой фазе отдельное состояние. Переходы из любого состояния возможны:
остаться в текущем состоянии
перейти в следующее состояние
перескочить через одно состояние вперед.
Машина состояний получается достаточно консервативной, чтобы устоять перед некоторыми помехами.
Ну в общем понятно.
Всем большое спасибо за варианты) Хотел сделать что-то на вроде фапч, но подумал может есть что-то аппаратное, о чем я не знаю просто ^_^
Tarbal
Mar 23 2016, 17:59
Цитата(Fobes @ Mar 23 2016, 20:04)

Всем большое спасибо за варианты) Хотел сделать что-то на вроде фапч, но подумал может есть что-то аппаратное, о чем я не знаю просто ^_^
В ФАПЧ всегда за скобками остается частотная подстройка на случай если частоты разные. Лучшая схема, что я знаю это сформировать короткие импульсы из фронтов опорной и настраиваемой частот и подавать их на входа RS-триггера. Выходное напряжение триггера фильтруется и за сцчет обратной связи ФАПЧ подсраивается до половины напряжения единицы.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.