Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Фазовый сдвиг...
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Andy_F
Возник следующий вопрос: как сгенерить два меандра с заданным фазовым сдвигом между ними, при чём этот сдвиг должен достаточно часто программно меняться ?

Видимо, это можно реализовать на 16 bit Timer/Counter1 (для Меги). Как бы организовать поизящнее задание значения фазового сдвига? А то пока видится громоздкий алгоритм с остановкой таймера, записью в регистр одного из каналов требуемого фазового сдвига, сбросом прескалера, запуском таймера... blink.gif

Спасибо.
Леонид Иванович
А частотой этих меандров управлять надо? Если нет, то достаточно перегружать OCR1x регистры, настроив выходы OC1A, OC1B в режим toggle.
exSSerge
Цитата(Andy_F @ Oct 9 2006, 02:57) *
Возник следующий вопрос: как сгенерить два меандра с заданным фазовым сдвигом между ними, при чём этот сдвиг должен достаточно часто программно меняться ?

Видимо, это можно реализовать на 16 bit Timer/Counter1 (для Меги). Как бы организовать поизящнее задание значения фазового сдвига? А то пока видится громоздкий алгоритм с остановкой таймера, записью в регистр одного из каналов требуемого фазового сдвига, сбросом прескалера, запуском таймера... blink.gif

Спасибо.

Фазу в любом случае придётся пересчитывать во время, точнее такты таймера.
А зачем таймер-то останавливать? Почитайте внимательно - во многих случаях можно писать на ходу, регистры OCRxx у Меги имеют двойную буферизацию, только не во всех режимах она используется.
Andy_F
Цитата(Леонид Иванович @ Oct 9 2006, 00:55) *
А частотой этих меандров управлять надо? Если нет, то достаточно перегружать OCR1x регистры, настроив выходы OC1A, OC1B в режим toggle.


Частотой управлять не надо. Но с перегрузкой "на ходу" (без остановки таймера) есть опасение, что могут происходить срабатывания в процессе перегрузки (т.е., один регистр успели переписать, другой не успели, и получилось чёрти что).
prottoss
Цитата(Andy_F @ Oct 9 2006, 05:59) *
Цитата(Леонид Иванович @ Oct 9 2006, 00:55) *

А частотой этих меандров управлять надо? Если нет, то достаточно перегружать OCR1x регистры, настроив выходы OC1A, OC1B в режим toggle.
Частотой управлять не надо. Но с перегрузкой "на ходу" (без остановки таймера) есть опасение, что могут происходить срабатывания в процессе перегрузки (т.е., один регистр успели переписать, другой не успели, и получилось чёрти что).
Можно перезагружать в прерывании по совпадению, тогда всегда будет известно, что срабатывание-переключение произошло. А для прерывания сделать флаг, по которому оно будет решать, что делать (изменять-не-изменять длительность)
SasaVitebsk
Цитата(prottoss @ Oct 9 2006, 01:18) *
Можно перезагружать в прерывании по совпадению, тогда всегда будет известно, что срабатывание-переключение произошло. А для прерывания сделать флаг, по которому оно будет решать, что делать (изменять-не-изменять длительность)


Это то что напрашивается само сабой.

Раньше использовал бы таймер 8254. Один канал настроил бы на шим. А два других как управляемый одновибратор. И, (что здесь придётся делать аппаратно) соединил бы выход первого со входами двух других. smile.gif Вот этот шим и определял бы фазу.
andrvisht
Цитата(Andy_F @ Oct 8 2006, 22:57) *
Возник следующий вопрос: как сгенерить два меандра с заданным фазовым сдвигом между ними, при чём этот сдвиг должен достаточно часто программно меняться ?

Видимо, это можно реализовать на 16 bit Timer/Counter1 (для Меги). Как бы организовать поизящнее задание значения фазового сдвига? А то пока видится громоздкий алгоритм с остановкой таймера, записью в регистр одного из каналов требуемого фазового сдвига, сбросом прескалера, запуском таймера... blink.gif

Спасибо.

Посмотрите сдесь
http://electronix.ru/forum/index.php?showtopic=14401
Nanobyte
А какие требуются частота, диапазон сдвига и шаг фазы?
Andy_F
Частота - около 8 кГц (при кварце 16 МГц), шаг сдвига фазы - несколько сотых градуса, диапазон, видимо, 0..180 градусов. Но это всё не принципиально, интересует только алгоритм изменения фазового сдвига между выходами, остальное очевидно...

С прерываниями связываться не хочется - контроллер будет загружен "тяжёлыми" задачами, вероятно, с другими прерываниями, если ещё и прерывание от генератора будет "под ногами путаться", будет совсем тяжко. Одно дело иногда (при необходимости) задавать новое значение сдвига, и совсем другое отвлекаться на каждый перепад выходного напряжения.

Двойная буферизация в данном случае только усложняет дело - при записи новых значений в регистры OCRx обновление произойдёт не одновременно, а каждый канал "досчитает" старое значение и в разные моменты времени каналы стартуют с новыми значениями. Поэтому я и предполагаю, что надо выдавать reset на прескалер, вроде бы при этом происходит безусловное обновление значений OCRx. А чтобы не попасть на момент переключения, надо, видимо, и таймер останавливать.

За ссылку (http://electronix.ru/forum/index.php?showtopic=14401) спасибо, действительно, задача похожая (и для похожих целей), только вопрошающий в той ветке как то сам не чётко понимает, что ему нужно. Соответственно, и ответы несколько "не в ту степь".

В целом, видимо, более простого (изящного) пути нет... sad.gif
prottoss
Цитата(Andy_F @ Oct 9 2006, 16:58) *
Частота - около 8 кГц (при кварце 16 МГц), шаг сдвига фазы - несколько сотых градуса, диапазон, видимо, 0..180 градусов. Но это всё не принципиально, интересует только алгоритм изменения фазового сдвига между выходами, остальное очевидно...
С прерываниями связываться не хочется - контроллер будет загружен "тяжёлыми" задачами, вероятно, с другими прерываниями, если ещё и прерывание от генератора будет "под ногами путаться", будет совсем тяжко. Одно дело иногда (при необходимости) задавать новое значение сдвига, и совсем другое отвлекаться на каждый перепад выходного напряжения.
Вообще то при такой относительно небольшой частоте прерывания самое то... ИМХО самое что ни на есть изящное решение... Всего то 25..35 тактов... А что значит "... будет загружен "тяжёлыми" задачами ..." ? Критические по времени? Тогда может эту задачу возложить на внешний аппаратный девайс(возможно мелконогий МК), как намекалось выше?
Цитата(Andy_F @ Oct 9 2006, 16:58) *
В целом, видимо, более простого (изящного) пути нет... sad.gif
Пути есть всегда, вопрос, видим ли мы их, и есть ли на это у нас время...
andrvisht
Цитата(Andy_F @ Oct 9 2006, 11:58) *
С прерываниями связываться не хочется - контроллер будет загружен "тяжёлыми" задачами, вероятно, с другими прерываниями, если ещё и прерывание от генератора будет "под ногами путаться", будет совсем тяжко. Одно дело иногда (при необходимости) задавать новое значение сдвига, и совсем другое отвлекаться на каждый перепад выходного напряжения.

Да и не надо прерывания, пусть работает "на фоне". Там прерывания нужны были только для того чтобы при изменении фазы от кнопки не происходило заглатыввание периода, а если это делается 1 раз в пару секунд то можно прерывания включать только для этого дела, а потом снова отключать, там же в прерывании.
Цитата
За ссылку (http://electronix.ru/forum/index.php?showtopic=14401) спасибо, действительно, задача похожая (и для похожих целей), только вопрошающий в той ветке как то сам не чётко понимает, что ему нужно. Соответственно, и ответы несколько "не в ту степь".

У него был детектор, и нужно было сдвигом фазы свести выходной сигнал до минимума. А то что я выкладывал с кнопками, это как раз Ваш вариант, вроде бы.
=GM=
Цитата(Andy_F @ Oct 8 2006, 18:57) *
Возник следующий вопрос: как сгенерить два меандра с заданным фазовым сдвигом между ними, при чём этот сдвиг должен достаточно часто программно меняться ?

Видимо, это можно реализовать на 16 bit Timer/Counter1 (для Меги). Как бы организовать поизящнее задание значения фазового сдвига? А то пока видится громоздкий алгоритм с остановкой таймера, записью в регистр одного из каналов требуемого фазового сдвига, сбросом прескалера, запуском таймера... blink.gif

Спасибо.

Самое простое решение (на примере атмеги16) видится в генерации 8-кГц меандра, назовем его опорный канал, с помощью таймера0. А сдвинутый по фазе меандр получить комбинацией выходных сигналов двух каналов по совпадению ОС1А, ОС1В таймера1. Опорный канал вообще не трогать, а смена содержимого регистров OCR1A, OCR1B будет происходить одновременно, следовательно, фаза канала может меняться произвольно в пределах 180 градусов.
Andy_F
Общее направление понятно, теперь надо обдумать, поэкспериментировать...
Спасибо всем ответившим.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.