Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Програмно-аппаратный умножитель частоты на авр
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
-=TRO=-
Есть плавающая частота близкая к меандру от едениц герц до 2 килогерц.
Мне нужно за каждый полупериод провести около 8 небольших вычислений с равным интервалом времени (не критично, джиттер до 10% не фатален) и выдать результат наружу. 
Есть 2 свободных восьмибитных таймера в ATMEGA128.

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

Вроде идея простая, но с кодом из за недостатка опыта програмирования пока лажа (пока изучаю работу таймеров в симуляторе).
А пока я хотябы хромой код не родил, хочу спросить, может я велосипед изобретаю, и уже есть подобные реализации в коде?
Буду рад ссылкам, идеям и любым пинкам в нужном направлении.
Plain
Цитата(-=TRO=- @ Nov 16 2014, 19:01) *
Есть 2 свободных восьмибитных таймера в ATMEGA128

Прежде, чем настолько усложнять задачу, не помешает прояснить, куда сгинули 16-разрядные таймеры, с их защёлками и компараторами, на которых она решается нескольким строками.
-=TRO=-
Цитата(Plain @ Nov 16 2014, 21:30) *
Прежде, чем настолько усложнять задачу, не помешает прояснить, куда сгинули 16-разрядные таймеры, с их защёлками и компараторами, на которых она решается нескольким строками.

Они заняты пятиканальным ШИМом в восьмибитном режиме, так что приходится довольствоватся остатками. Я же не виноват что многоканальные выходы ШИМ завязаны в камне на 16 битные таймеры.
Plain
Ну а защёлка свободна, ведь так?
-=TRO=-
Цитата(Plain @ Nov 17 2014, 17:48) *
Ну а защёлка свободна, ведь так?

Защелка?
Простите мой дилетантизм, работу с таймерами я только осваиваю, можно немножечко подробнее что вы имели ввиду и к чему клоните. Попробуйте спустится до человека который осваивает таймеры чуть ли не первый раз, и донести суть понятным делетанту языком, пожалуйста. Почитал тем временем про "блок захвата", пака не очень понимаю как он мне поможет...

Кстати напомнило анекдот:
Молодая жена жалуется маме что муж нехочет есть гречку. Мама советует -Расскажи как ты старалась, когда варила гречку... А доча такая с круглыми глазками -Варила? 05.gif cranky.gif
Plain
Главное, что надо усвоить с таймерами — никогда им не мешать программой, не тормозить и не запускать их ею — они всегда должны быть свободными, т.е. крутиться по кругу или как-то ещё, но однозначно сами по себе, т.е. аппаратно.

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

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

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

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

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

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

P.S. Переключение входа защёлки можно сделать, например, одним резистором, подключив исходный сигнал через него, а выход компаратора второго таймера — напрямую, т.е. переключать их, соответственно, битом третьего состояния выхода компаратора.
-=TRO=-
Спасибо за настолько развернутый ответ.
Я конечно не все понял,... да че там, пока больше половины еще не понял, настолько не понял что даже вопросов пока нет, особенно туплю там где звучит слово "фаза", но я всего три раза только прочитал.

Однако общую суть использования защелки вроде уловил. Оно так надежно по сравнению с перезаписью и перезапусками таймера.

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

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

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

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

Насчёт фазы — это просто доля периода, т.е. от нуля до единицы — тот же Кзап ШИМ, если так понятнее. Сперва Вы получаете ненулевое её значение — это сдвиг от фронта входного сигнала до некоего значения таймера, и затем отматываете её вычитанием назад, получая значение таймера, которое он имел точно на момент этого фронта.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.