реклама на сайте
подробности

 
 
> Програмно-аппаратный умножитель частоты на авр, Ищу идеи для оптимального кода.
-=TRO=-
сообщение Nov 16 2014, 16:01
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 24-10-07
Из: zp.ua
Пользователь №: 31 690



Есть плавающая частота близкая к меандру от едениц герц до 2 килогерц.
Мне нужно за каждый полупериод провести около 8 небольших вычислений с равным интервалом времени (не критично, джиттер до 10% не фатален) и выдать результат наружу. 
Есть 2 свободных восьмибитных таймера в ATMEGA128.

Чего с алгоритмом надумал:
Конфигурирую таймеры на счет с разными пределителями, один к одному, и один к восьми.
Более медленным таймером начинаю считать от начала входного полупериода (по прерыванию), и по прерываниям таймера инкриментирую накопительную переменную №1(типа старшие разряды медленного счетчика). Когда входной полупериод заканчивается (по прерыванию) то переписываю значение медленного таймера в быстрый, и значение переменной №1 в переменную №2. Теперь надо запустить быстрый таймер на обратный отсчет, и по его прерываниям отнимать по единичке от переменной №2 пока не дойду до нуля, как только дошли, запускаем счетчик снова и проводим нужные вычисления, и так циклимся до конца входного полупериода.

Вроде идея простая, но с кодом из за недостатка опыта програмирования пока лажа (пока изучаю работу таймеров в симуляторе).
А пока я хотябы хромой код не родил, хочу спросить, может я велосипед изобретаю, и уже есть подобные реализации в коде?
Буду рад ссылкам, идеям и любым пинкам в нужном направлении.

Сообщение отредактировал -=TRO=- - Nov 16 2014, 16:06
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Plain
сообщение Nov 17 2014, 18:15
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 6 776
Регистрация: 5-03-09
Из: Москва
Пользователь №: 45 710



Главное, что надо усвоить с таймерами — никогда им не мешать программой, не тормозить и не запускать их ею — они всегда должны быть свободными, т.е. крутиться по кругу или как-то ещё, но однозначно сами по себе, т.е. аппаратно.

Итак, подключаете сигнал ко входу защёлки (capture) первого таймера. Разность двух значений ICRx (нормализованных, в т.ч. разрядно наращенных), полученных по двум прерываниям от неё — это искомый период сигнала, выраженный в тактах данного счётчика.

Сразу после второго прерывания подключаете ко входу этой же защёлки выход компаратора Вашего второго таймера, в который прописываете на несколько единиц больше его текущего значения, т.е. чтобы сразу получить от него импульс на выходе и, соответственно, третье прерывание от защёлки и третье значение ICRx (здесь можно и не прерывание, а просто стробировать).

Разность между вторым и третьим значением — это фаза (задержка) от фронта входного сигнала до прописанного в предыдущем абзаце значения компаратора второго счётчика, выраженная всё в тех же тактах первого счётчика.

После этого, делите полученные период и фазу на отношение тактов этих двух счётчиков (известное Вам) и получаете период и фазу, выраженные уже в тактах второго счётчика.

Затем, делите полученный период на 16, прибавляете к нему значение нуля фазы и прописываете каждый раз эти последовательные значения в компаратор второго счётчика, который и будет прерывать точно в нужных местах.

При этом фоном повторяете также и вышеописанные процедуры получения вторых и третьих значений защёлки — для поддержания актуальной частоты и фазы.

P.S. Переключение входа защёлки можно сделать, например, одним резистором, подключив исходный сигнал через него, а выход компаратора второго таймера — напрямую, т.е. переключать их, соответственно, битом третьего состояния выхода компаратора.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 17:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01358 секунд с 7
ELECTRONIX ©2004-2016