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

 
 
 
Reply to this topicStart new topic
> Фазовый сдвиг..., Генерация сигналов с фазовым сдвигом.
Andy_F
сообщение Oct 8 2006, 19:57
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148



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

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

Спасибо.
Go to the top of the page
 
+Quote Post
Леонид Иванович
сообщение Oct 8 2006, 20:55
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 318
Регистрация: 21-07-06
Из: Минск
Пользователь №: 18 986



А частотой этих меандров управлять надо? Если нет, то достаточно перегружать OCR1x регистры, настроив выходы OC1A, OC1B в режим toggle.


--------------------
Go to the top of the page
 
+Quote Post
exSSerge
сообщение Oct 8 2006, 21:56
Сообщение #3


Частый гость
**

Группа: Новичок
Сообщений: 136
Регистрация: 18-08-06
Из: Novosibirsk
Пользователь №: 19 655



Цитата(Andy_F @ Oct 9 2006, 02:57) *
Возник следующий вопрос: как сгенерить два меандра с заданным фазовым сдвигом между ними, при чём этот сдвиг должен достаточно часто программно меняться ?

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

Спасибо.

Фазу в любом случае придётся пересчитывать во время, точнее такты таймера.
А зачем таймер-то останавливать? Почитайте внимательно - во многих случаях можно писать на ходу, регистры OCRxx у Меги имеют двойную буферизацию, только не во всех режимах она используется.
Go to the top of the page
 
+Quote Post
Andy_F
сообщение Oct 8 2006, 21:59
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148



Цитата(Леонид Иванович @ Oct 9 2006, 00:55) *
А частотой этих меандров управлять надо? Если нет, то достаточно перегружать OCR1x регистры, настроив выходы OC1A, OC1B в режим toggle.


Частотой управлять не надо. Но с перегрузкой "на ходу" (без остановки таймера) есть опасение, что могут происходить срабатывания в процессе перегрузки (т.е., один регистр успели переписать, другой не успели, и получилось чёрти что).
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 8 2006, 22:18
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Andy_F @ Oct 9 2006, 05:59) *
Цитата(Леонид Иванович @ Oct 9 2006, 00:55) *

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


--------------------
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 8 2006, 22:58
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(prottoss @ Oct 9 2006, 01:18) *
Можно перезагружать в прерывании по совпадению, тогда всегда будет известно, что срабатывание-переключение произошло. А для прерывания сделать флаг, по которому оно будет решать, что делать (изменять-не-изменять длительность)


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

Раньше использовал бы таймер 8254. Один канал настроил бы на шим. А два других как управляемый одновибратор. И, (что здесь придётся делать аппаратно) соединил бы выход первого со входами двух других. smile.gif Вот этот шим и определял бы фазу.
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Oct 9 2006, 06:22
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



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

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

Спасибо.

Посмотрите сдесь
http://electronix.ru/forum/index.php?showtopic=14401
Go to the top of the page
 
+Quote Post
Nanobyte
сообщение Oct 9 2006, 06:45
Сообщение #8


За битами по регистрам гоняюсь
***

Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446



А какие требуются частота, диапазон сдвига и шаг фазы?


--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
Go to the top of the page
 
+Quote Post
Andy_F
сообщение Oct 9 2006, 08:58
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148



Частота - около 8 кГц (при кварце 16 МГц), шаг сдвига фазы - несколько сотых градуса, диапазон, видимо, 0..180 градусов. Но это всё не принципиально, интересует только алгоритм изменения фазового сдвига между выходами, остальное очевидно...

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

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

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

В целом, видимо, более простого (изящного) пути нет... sad.gif
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 9 2006, 10:14
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



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


--------------------
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Oct 9 2006, 14:47
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(Andy_F @ Oct 9 2006, 11:58) *
С прерываниями связываться не хочется - контроллер будет загружен "тяжёлыми" задачами, вероятно, с другими прерываниями, если ещё и прерывание от генератора будет "под ногами путаться", будет совсем тяжко. Одно дело иногда (при необходимости) задавать новое значение сдвига, и совсем другое отвлекаться на каждый перепад выходного напряжения.

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

У него был детектор, и нужно было сдвигом фазы свести выходной сигнал до минимума. А то что я выкладывал с кнопками, это как раз Ваш вариант, вроде бы.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Oct 9 2006, 15:07
Сообщение #12


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



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

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

Спасибо.

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


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Andy_F
сообщение Oct 9 2006, 20:11
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148



Общее направление понятно, теперь надо обдумать, поэкспериментировать...
Спасибо всем ответившим.
Go to the top of the page
 
+Quote Post

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

 


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


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