Программный PLL для долговременной синхронизации таймеров. Кажется, изобретаю велосипед. Возможно, что для езды по шпалам. Кратко суть происходящего: девайс получает пакеты с неким периодом, и надо подстроить свой периодический таймер под эти самые принимаемые пакеты, в идеале с точностью до фазы.
В первом варианте, как сейчас и работает, всё просто: к следующему периоду добавляем ошибку. Всё. сдвиг по фазе устраняет идеально. Однако же, если периоды различаются, то получим постоянное отставание или убегание на ошибку в зависимости от знака разницы. Максимальный диапазон подстройки ±полпериода.
1)
Разница ошибок. Если таймер устройства настроен на период, допустим, пусть будет 30 (тактов, единиц, попугаев) и получены последние ошибки
en=-3 и
en-1=-3, то мне вот ясно, что надо ещё и период подкорректировать на эти самые
-3. Как это реализовать в алгоритме? Попытка построить что-то с запоминанием предыдущей ошибки(e
n-1) и учётом разницы между ними (
en и
en-1) пока закончилась неудачей; возможно, что-то не учёл или неправильно делал.
2)
Модификация предыдущего. Может несколько последних ошибок анализировать? Как тогда выбрать, сколько именно? Следует ли их корректировать после внесения изменений в период?
3)
Интегратор-сумматор с порогом. То есть копить ошибки, при выходе модуля суммы за некий порог корректировать не только фазу, но и период таймера. При коррекции периода уменьшать накопленную сумму на скорректированную величину. Пример для порога 10ед.: ошибки -3[-3] -3[-6], -3[-9], -3[-12]=> корректируем на -2 =>[-10], -1[-11] => 0[-10], 0[-10], ...
Первые прикидки в голове дают рабочий вариант, но появляются вопросы. Первый: как выбрать величину порога? Потому что от отношения порога к ошибке и к периоду сильно зависит скорость подстройки. Подстройка фазы тоже не вполне понятно как отработает: при совпадении знака с последней подстройкой даст ошибку для периода, которая потом вызовет постепенное накопление суммы в противоположную сторону до корректировки периода до некорректной величины и так далее. То есть установление совпадающих периодов может затянуться до двух модулей сумматора (пройти от "-" к "+").
На картинке случай 1), как постоянной коррекцией фазы корректируется период. До t
0 всё синхронно, потом период пакетов меняется. Возникает ошибка(красная толстая линия), которая учитывается в следующем периоде(тонкая красная), но она же возникает снова в следующем цикле и так далее.
Подскажите, вдруг кто-нибудь делал подобное или имеет недостающие у меня знания?