|
|
  |
Фазовый сдвиг..., Генерация сигналов с фазовым сдвигом. |
|
|
|
Oct 8 2006, 19:57
|
Частый гость
 
Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148

|
Возник следующий вопрос: как сгенерить два меандра с заданным фазовым сдвигом между ними, при чём этот сдвиг должен достаточно часто программно меняться ? Видимо, это можно реализовать на 16 bit Timer/Counter1 (для Меги). Как бы организовать поизящнее задание значения фазового сдвига? А то пока видится громоздкий алгоритм с остановкой таймера, записью в регистр одного из каналов требуемого фазового сдвига, сбросом прескалера, запуском таймера... Спасибо.
|
|
|
|
|
Oct 8 2006, 21:56
|
Частый гость
 
Группа: Новичок
Сообщений: 136
Регистрация: 18-08-06
Из: Novosibirsk
Пользователь №: 19 655

|
Цитата(Andy_F @ Oct 9 2006, 02:57)  Возник следующий вопрос: как сгенерить два меандра с заданным фазовым сдвигом между ними, при чём этот сдвиг должен достаточно часто программно меняться ? Видимо, это можно реализовать на 16 bit Timer/Counter1 (для Меги). Как бы организовать поизящнее задание значения фазового сдвига? А то пока видится громоздкий алгоритм с остановкой таймера, записью в регистр одного из каналов требуемого фазового сдвига, сбросом прескалера, запуском таймера... Спасибо. Фазу в любом случае придётся пересчитывать во время, точнее такты таймера. А зачем таймер-то останавливать? Почитайте внимательно - во многих случаях можно писать на ходу, регистры OCRxx у Меги имеют двойную буферизацию, только не во всех режимах она используется.
|
|
|
|
|
Oct 8 2006, 21:59
|
Частый гость
 
Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148

|
Цитата(Леонид Иванович @ Oct 9 2006, 00:55)  А частотой этих меандров управлять надо? Если нет, то достаточно перегружать OCR1x регистры, настроив выходы OC1A, OC1B в режим toggle. Частотой управлять не надо. Но с перегрузкой "на ходу" (без остановки таймера) есть опасение, что могут происходить срабатывания в процессе перегрузки (т.е., один регистр успели переписать, другой не успели, и получилось чёрти что).
|
|
|
|
|
Oct 8 2006, 22:18
|

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

|
Цитата(Andy_F @ Oct 9 2006, 05:59)  Цитата(Леонид Иванович @ Oct 9 2006, 00:55)  А частотой этих меандров управлять надо? Если нет, то достаточно перегружать OCR1x регистры, настроив выходы OC1A, OC1B в режим toggle.
Частотой управлять не надо. Но с перегрузкой "на ходу" (без остановки таймера) есть опасение, что могут происходить срабатывания в процессе перегрузки (т.е., один регистр успели переписать, другой не успели, и получилось чёрти что). Можно перезагружать в прерывании по совпадению, тогда всегда будет известно, что срабатывание-переключение произошло. А для прерывания сделать флаг, по которому оно будет решать, что делать (изменять-не-изменять длительность)
--------------------
|
|
|
|
|
Oct 9 2006, 06:22
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Цитата(Andy_F @ Oct 8 2006, 22:57)  Возник следующий вопрос: как сгенерить два меандра с заданным фазовым сдвигом между ними, при чём этот сдвиг должен достаточно часто программно меняться ? Видимо, это можно реализовать на 16 bit Timer/Counter1 (для Меги). Как бы организовать поизящнее задание значения фазового сдвига? А то пока видится громоздкий алгоритм с остановкой таймера, записью в регистр одного из каналов требуемого фазового сдвига, сбросом прескалера, запуском таймера... Спасибо. Посмотрите сдесь http://electronix.ru/forum/index.php?showtopic=14401
|
|
|
|
|
Oct 9 2006, 08:58
|
Частый гость
 
Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148

|
Частота - около 8 кГц (при кварце 16 МГц), шаг сдвига фазы - несколько сотых градуса, диапазон, видимо, 0..180 градусов. Но это всё не принципиально, интересует только алгоритм изменения фазового сдвига между выходами, остальное очевидно... С прерываниями связываться не хочется - контроллер будет загружен "тяжёлыми" задачами, вероятно, с другими прерываниями, если ещё и прерывание от генератора будет "под ногами путаться", будет совсем тяжко. Одно дело иногда (при необходимости) задавать новое значение сдвига, и совсем другое отвлекаться на каждый перепад выходного напряжения. Двойная буферизация в данном случае только усложняет дело - при записи новых значений в регистры OCRx обновление произойдёт не одновременно, а каждый канал "досчитает" старое значение и в разные моменты времени каналы стартуют с новыми значениями. Поэтому я и предполагаю, что надо выдавать reset на прескалер, вроде бы при этом происходит безусловное обновление значений OCRx. А чтобы не попасть на момент переключения, надо, видимо, и таймер останавливать. За ссылку (http://electronix.ru/forum/index.php?showtopic=14401) спасибо, действительно, задача похожая (и для похожих целей), только вопрошающий в той ветке как то сам не чётко понимает, что ему нужно. Соответственно, и ответы несколько "не в ту степь". В целом, видимо, более простого (изящного) пути нет...
|
|
|
|
|
Oct 9 2006, 10:14
|

Гуру
     
Группа: Свой
Сообщений: 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)  В целом, видимо, более простого (изящного) пути нет...  Пути есть всегда, вопрос, видим ли мы их, и есть ли на это у нас время...
--------------------
|
|
|
|
|
Oct 9 2006, 14:47
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Цитата(Andy_F @ Oct 9 2006, 11:58)  С прерываниями связываться не хочется - контроллер будет загружен "тяжёлыми" задачами, вероятно, с другими прерываниями, если ещё и прерывание от генератора будет "под ногами путаться", будет совсем тяжко. Одно дело иногда (при необходимости) задавать новое значение сдвига, и совсем другое отвлекаться на каждый перепад выходного напряжения. Да и не надо прерывания, пусть работает "на фоне". Там прерывания нужны были только для того чтобы при изменении фазы от кнопки не происходило заглатыввание периода, а если это делается 1 раз в пару секунд то можно прерывания включать только для этого дела, а потом снова отключать, там же в прерывании. Цитата За ссылку (http://electronix.ru/forum/index.php?showtopic=14401) спасибо, действительно, задача похожая (и для похожих целей), только вопрошающий в той ветке как то сам не чётко понимает, что ему нужно. Соответственно, и ответы несколько "не в ту степь". У него был детектор, и нужно было сдвигом фазы свести выходной сигнал до минимума. А то что я выкладывал с кнопками, это как раз Ваш вариант, вроде бы.
|
|
|
|
|
Oct 9 2006, 15:07
|

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

|
Цитата(Andy_F @ Oct 8 2006, 18:57)  Возник следующий вопрос: как сгенерить два меандра с заданным фазовым сдвигом между ними, при чём этот сдвиг должен достаточно часто программно меняться ? Видимо, это можно реализовать на 16 bit Timer/Counter1 (для Меги). Как бы организовать поизящнее задание значения фазового сдвига? А то пока видится громоздкий алгоритм с остановкой таймера, записью в регистр одного из каналов требуемого фазового сдвига, сбросом прескалера, запуском таймера... Спасибо. Самое простое решение (на примере атмеги16) видится в генерации 8-кГц меандра, назовем его опорный канал, с помощью таймера0. А сдвинутый по фазе меандр получить комбинацией выходных сигналов двух каналов по совпадению ОС1А, ОС1В таймера1. Опорный канал вообще не трогать, а смена содержимого регистров OCR1A, OCR1B будет происходить одновременно, следовательно, фаза канала может меняться произвольно в пределах 180 градусов.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|