Автор Тема: Простой ДВ-маяк на AD9833 и микроконтроллере  (Прочитано 4325 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Коллеги, всем GE.

Предлагаю вашему вниманию схему и программу простого автономного маяка на микросхеме синтезатора AD9833, управляемого микроконтроллером ATtiny861A. Собственно, это не маяк, а возбудитель маяка, поскольку амплитуда сигнала всего 600 мВ двойной размах.

Маяк имеет 4 режима работы.

1) Оперативная подстройка частоты. При подаче питания программа читает код частоты опорного генератора fSAMPLE и выходных частот fOUT1, fOUT2 из еепром МК. Режим позволяет подстроить любую из частот и записать ее на место  fOUT1 или fOUT2.

2) Режим QRSS. При подаче питания программа читает длительность элементарной посылки TAU0, длительность паузы между сообщениями PAUSE, а также текст сообщения. В этом режима программа периодически выдаёт сообщение на частоте fOUT1.

3) Режим DFCW. При подаче питания программа дополнительно читает длительность между элементарными посылками T0D3. В этом режиме программа периодически выдаёт сообщение на частотах fOUT1 и fOUT2 в соответствии с протоколом.

4) Режим BPSK (экспериментальный). В этом режима программа периодически выдаёт сообщение на частоте fOUT1, при передаче логического нуля фаза частоты равна 0 градусов, при передаче логической единицы фаза частоты равна 180 градусам. Все байты сообщения передаются в формате 8N1, т.е. старт-бит, 8 бит данных, начиная с младшего бита и один стоп бит. В начале сообщения передается байт синхронизации, равный 0хЕ6. В силу специфики BPSK байт синхронизации передаётся независимо от содержимого сообщения.

Собственно, пока все режимы. Далее распишу эти режимы по-подробнее, укажу все форматы данных и расскажу, как можно легко и просто самостоятельно подготовить собственные данные в еепром.

« Последнее редактирование: 08 Июнь 2020, 11:41:47 от GM »
Зачем нам бумеранг? У нас грабли есть!

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Забыл сказать. Тема начиналась здесь. Но там немного сказано о маяке, так что лучше сказанное повторить ещё раз здесь в данной теме.

На схеме видно, что маяк управляется двумя переключателями s1 ("250/1"), s2 ("Зп/Чт"), двумя кнопками s3 ("+"), s4 ("-") и кнопкой сброс ("RST"). Хотя сиё непринципиально, в моём варианте имеется 4 кнопки, а сброс делаю так: замыкаю + и - питания, срабатывает защита БП, потом нажимаю кнопку сброса защиты. Это от лени - не хотелось паять лишнюю кнопку :-). При нажатии кнопки "RST" получается тот же результат, но питание сбрасывать не надо.

Подтягивающие резисторы на s1-s4 в принципе не нужны, поскольку подключены внутренние резисторы. Однако, в сложной помеховой обстановке их лучше подключить.

Кварц 16 МГц, подключенный к ножкам 7 и 8 МК тоже в принципе не нужен, но константы TAU0, T0D3, PAUSE придётся подбирать самостоятельно.

Светодиоды LED1 и LED2 могут иметь разнообразное назначение в каждом режиме, хотя я старался придти к некой унификации. Поскольку нет полноценного дисплея, то смысл применения светодиодов состоит в том, чтобы при каждом нажатии кнопки показывать изменения в состоянии МК.

Итак, выбор режимов. Все режимы выбираются кнопками/переключателями s1, s2.

1) Если s1-выключен, s2-выключен, то при подаче на схему напряжения питания выбирается режим 1 - подстройка и запись частоты. Оба светодиода погашены. Теперь увеличение частоты с помощью кнопки s4 ("+") на 250 единиц df или на 1 единицу df зависит от состояния переключателя s1. Единица перестройки df=fSAMPLE/2^28. К примеру , при fSAMPLE=25000000 Гц, df=0.093132226 Гц. Уменьшение частоты делается с помощью кнопки s3 ("-")

2)  Если s1-включен, s2-выключен, то при подаче на схему напряжения питания выбирается режим 2 - QRSS. Светодиод LED1 светится, LED2 - погашен. Длительность элементарной посылки (точка) определяется 4-х байтной константой TAU0, одна единица константы соответствует 1 мкс. Максимальная величина TAU0 составляет 4294967295 мкс, чуть больше 1 час 11 минут, что удовлетворит самую строгую тетю :-).  Пауза между элементами знака составляет TAU0. Длительность тире в три раза больше. Пауза между знаками три TAU0. Пауза между сообщениями - определяется 4-х байтной константой PAUSE. Запуск режима осуществляется кнопкой s4. После запуска светодиоды мигают в соответствии с передаваемой информацией. [Добавлю, маяк можно использовать для формирования привычного кода Морзе, скажем, от 1 знака/мин до 1000 знаков/мин. Формула выбора константы TAU0=6000/W в мс, где W-требуемая скорость передачи знак/мин.]

3)  Если s1-выключен, s2-включен, то при подаче на схему напряжения питания выбирается режим 3 - DFCW. Светодиод LED1 погашен, LED2 - светится. Длительность элементарной посылки соответствует TAU0. За паузу между элементами знака отвечает 4-х байтная константа T0D3, которая также выбирается пользователем. Пауза между знаками составляет TAU0, пауза между сообщениями - определяется константой PAUSE. Запуск режима осуществляется кнопкой s4. После запуска светодиоды мигают в соответствии с передаваемой информацией.

4) Если s1-включен, s2-включен, то при подаче на схему напряжения питания выбирается режим 4 - BPSK. Светодиод LED1 светится, LED2 - светится. Длительность элементарной посылки соответствует TAU0. Пауза между сообщениями - определяется константой PAUSE. Запуск режима осуществляется кнопкой s4. После запуска светодиоды мигают в соответствии с передаваемой информацией.
« Последнее редактирование: 08 Июнь 2020, 11:56:30 от GM »
Зачем нам бумеранг? У нас грабли есть!

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Если вопросов нет, я продолжу :-).

Поговорим о структуре записей в еепром. Она достаточно простая - шесть 4-х байтных переменных, далее четыре сообщения, на каждое из которых отведено по 100 байт.

Порядок следования такой.

1. Переменная fSAMPLE - частота опорного генератора на плате синтезатора, она же - частота выборок. Частота задается до сотых долей герца, десятичная запятая опускается. Например, у моего опорного генератора частота 24999454,00 Гц, соответственно fSAMPLE = 2499945400 или в шестнадцатиричном виде 0x950223B8. Побайтно запись частоты выглядит так 0x95, 0x02, 0x23, 0xB8. Первый байт является старшим. [Перевести из десятички в хекс можно с помощью калькулятора виндоуз.]

2. Переменная fOUT1 - первая выходная частота. Используется во всех режимах. Например, необходима выходная частота 137500,00 Гц. В шестнадцатиричном виде - 0х00D1CEF0 или, побайтно, 0x00, 0xD1, 0xCE, 0xF0. Подобная точность кажется излишеством, однако  при расчёте кода приращения фазы или, по-простому, кода частоты, точность вычисления кода максимальна. К тому же программа делает округление кода.

3. Переменная fOUT2 - вторая выходная частота. Используется в режиме DFCW. Структура переменной аналогична двум первым. Ответственность за разность частот fOUT2-fOUT1 переложил на плечи потребителя. Пусть ставит 1 Гц или 0.1 Гц или ещё что-нибудь. Для проверки ставил fOUT1=137500,00 Гц, а fOUT2=1000000,00 Гц - работало, как часы.

4. Переменная TAU0 - длительность элементарной посылки в микросекундах. Используется в режимах QRSS, DFCW и BPSK. Например, в QRSS это длительность точки. Например, нужна скорость 50 знаков в минуту, т.е. 120 мс на тире. 120 мс = 120000 мкс = 0x0001В4С0, в таком порядке и записывается.

5. Переменная T0D3 - длительность временного зазора между элементами знака в мкС. Используется в режиме DFCW. RA3TTS посоветовал взять треть TAU0, т.е. TAU0/3, отсюда название T0D3. Совету внял, но переложил ответственность за длительность T0D3 на пользователя, ему виднее.

6. Переменная PAUSE - длительность паузы между сообщениями в мкс.

[Отмечу в скобках, хотя временные переменные можно задавать от 1 до 2^32-1, но менее 10 мкс выставлять задержку не вижу смысла - длительность одного периода 137 кГц составляет 7.3 мкс. Опять же - ответственность за выбор ложится на потребителя.]

7. Сообщение может быть в пределах 100 байт, включая 0x00 на последнем месте. Сообщение может включать в себя 26 прописных букв английского алфавита A-Z, десять арабских цифр 0-9 и пробел в кодировке ASCII.

Сигнал fOUT1 в разных частях сообщения в режимах QRSS и BPSK является синхронным, таким образом существует возможность когерентного приёма.

Приведу пример программного кода в еепром.

            .eseg
        .org 0x000
frqs:   .db  0x95,0x02,0x23,0xB8   ;fS=24999454.00 Hz
frq1:   .db  0x00,0xD1,0xCE,0xF0   ;fOUT1=137500.00 Hz
frq2:   .db  0x00,0xD1,0xCE,0xF1   ;fOUT2=137501.00 Hz
tau0:   .db  0x00,0x01,0xD4,0xC0   ;in us units
t0d3:   .db  0x00,0x00,0x9C,0x40   ;in us units
pause:  .db  0x00,0x07,0xA1,0x20   ;in us units
msg0:   .db  "THE CHASM GAPED BEFORE HIM",0
        .exit


С ним нам предстоит немного поработать.

[подправил в своих сообщениях отдельные досадные неточности]
« Последнее редактирование: 08 Июнь 2020, 11:58:52 от GM »
Зачем нам бумеранг? У нас грабли есть!

Оффлайн R3TNE Алексей

  • Ветеран
  • *****
  • Сообщений: 1285
    • Просмотр профиля
    • Home page VLF/LF
    • E-mail
Работа проведена серьёзная, пытаюсь усвоить и переварить )) Ну что – это здорово. Не совсем всё понимаю, но интуитивно – «внутри песня»: наконец для нашего брата появились альтернативные варианты формирования широко распространённых сигналов таких как QRSS и DFCW, ещё и BPSK.

Именно для походного варианта, ничего лишнего: на ночку метнуться в поле, отработать и домой.

Теоретически, выбор моды и длительности посылок, с помощью кнопок, вроде понятен. Конечно, всё надо пощупать, попробовать, привыкнуть. Вообще – это круто!

Наличие светодиодов оправдано, будит на что ориентироваться при выборе режимов без монитора. ВЧ напряжение поднять примерно до 1,5В (rms), ну это уже мелочи, главное формирование.

Интересно посмотреть работу девайса в разных модах, например в спек.Лаб. Понимаю, что пока всё на столе, в режиме обкатки.
ex.RA3TTS

Оффлайн R3TNE Алексей

  • Ветеран
  • *****
  • Сообщений: 1285
    • Просмотр профиля
    • Home page VLF/LF
    • E-mail

3. Переменная fOUT2 - вторая выходная частота. Используется в режиме DFCW. Структура переменной аналогична двум первым. Ответственность за разность частот fOUT2-fOUT1 переложил на плечи потребителя. Пусть ставит 1 Гц или 0.1 Гц или ещё что-нибудь. Для проверки ставил fOUT1=137500,00 Гц, а fOUT2=1000000,00 Гц - работало, как часы.


Хотел уточнить про такой момент, речь о DFCW: разнос между точками и тире по высоте - переменная fout2. В режиме DFCW60 или DFCW120, подозреваю, расстояние в 0.1 Гц может оказаться великоватым, поэтому вопрос: можно ли в этой переменной установить, скажем 0,05 или 0,02 Гц? 
ex.RA3TTS

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Немного не так. fOUT2 - никакая не разность, а такая же частота, как fOUT1.

Например,  fOUT1=137500.00, fOUT2=137500,10. Разность частот будет 0.1 Гц. Синтезатор с опорой 25 МГц может дать 0.09 с копейками герц, меньше он дать не в состоянии. Так что, в данном случае вы не сможете получить 0.05 Гц, но задать сможете. Программа посчитает и выставит две одинаковые частоты, или при определенном соотношении частот две частоты с разницей df. Повторюсь, для AD9833 формула такова df=fОПОРЫ/2^28.

Чтобы уменьшить шаг частоты от синтезатора, надо снизить частоту опорного генератора.

Нашел: ответ #10. Цитата оттуда
[Замечу в скобках, если взять некий опорник с частотой 2.0-2.6 МГц, то шаг перестройки частоты составит 0.00745..0.00931 Гц, т.е. меньше 0.01 Гц, как и завещал нам партайгеноссе :-) Роман RW3ADB, но частота будет генериться от 0.01 Гц до 1..1.3 МГц].

Формулу привёл выше.

Джордж.

[Странно, могу править все свои сообщения, почему это?]
« Последнее редактирование: 08 Июнь 2020, 12:08:08 от GM »
Зачем нам бумеранг? У нас грабли есть!

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Ну вот, подготовил файл для трансляции, проверил. Вставлю прямо в текст сообщения, благо он короткий.

;File:                EEBEACON.ASM
;Version:             1.3
;Last updated:        08.06.2020
;Author:              GM, a.k.a. George
;Target:              (ATtiny861, 8 MHz internal oscillator)
;
;Support E-mail:
;
;DESCRIPTION
;The programme produces the eeprom content for the LFBEACON project

         .nolist
         .include "tn861Adef.inc"          ;definitions for ATtiny861A
         .list
         .eseg
         .org     0x000
frqs:    .db      0x95,0x02,0x23,0xB8      ;fSAMPLE=24999454.00 Hz
frq1:    .db      0x00,0xD1,0xCE,0xF0      ;fOUT1=137500.00 Hz
frq2:    .db      0x00,0xD1,0xCE,0xF1      ;fOUT2=137501.00 Hz
tau0:    .db      0x00,0x01,0xD4,0xC0      ;in us units
t0d3:    .db      0x00,0x00,0x9C,0x40      ;1/3-rd duration of tau0 in us units
pause:   .db      0x00,0x07,0xA1,0x20      ;in us units
msg0:    .db      "THE CHASM GAPED BEFORE HIM",0,0
         .org     msg0+100
msg1:    .db      "CQ RA3TTS K",0
         .org     msg0+200
msg2:    .db      "CQ RN3AUS K",0
         .org     msg0+300
msg3:    .db      "CQ RW3ADB K",0
         .exit

Теперь каждый может подставить свои данные (константы fSAMPLE, fOUT1, fOUT2, TAU0, T0D3, PAUSE, сообщения msg0, msg1, msg2, msg 3), протранслировать с помощью AVRstudio (или что там есть под рукой), получить файл eeprom.eep и прошить его в МК вместе с хекс-файлом из первого сообщения темы. В общем и целом на этом всё. А, осталось добавить фильтр на выходе синтезатора.

Зачем нам бумеранг? У нас грабли есть!

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Посчитал полосовой фильтр на 137 кГц.
Зачем нам бумеранг? У нас грабли есть!