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

 
 
> Програмно-аппаратный умножитель частоты на авр, Ищу идеи для оптимального кода.
-=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, 23:44
Сообщение #2


Гуру
******

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



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

Полная аналогия с часами — например, защёлкнулось на 2-х и 6-ти часах, делим эти 4 часа на 16 — получаем 15 минут, следовательно, прописываем сейчас в компаратор 6:15, прервалось — прибавляем 0:15 к 6:15 — прописываем 6:30, прервалось — прибавляем 0:15 к 6:30 — прописываем 6:45, и т.д.

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

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

Насчёт фазы — это просто доля периода, т.е. от нуля до единицы — тот же Кзап ШИМ, если так понятнее. Сперва Вы получаете ненулевое её значение — это сдвиг от фронта входного сигнала до некоего значения таймера, и затем отматываете её вычитанием назад, получая значение таймера, которое он имел точно на момент этого фронта.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 11:04
Рейтинг@Mail.ru


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