- Записки программиста
- Как сделать простой антенный переключатель
- Автоматический переключатель антенн с управлением на МК
- Первым делом подключим к МК кнопку
- Теперь подключаем пищалку
- Подключаем к МК реле переключения антенн
- Подключение дисплея
- Вывод отладочной печати в COM порт
- Работа с таймером и прерываниями
- Измерение уровня ALC
- Использование EEPROM
- Использование сторожевого таймера
- Экономия энергии для любителей экологии
Записки программиста
Как сделать простой антенный переключатель
Внимательный читатель мог заподозрить, что сравнение двух антенн в посте Знакомство с тюнером MFJ-971 и антенной «длинный провод» подразумевает наличие у автора какого-то антенного переключателя (коммутатора). Такой переключатель у меня действительно есть, и он был сделан своими руками.
Идея не моя, я просто следовал инструкции из видео Алексея Игонина, RA3TLB. Пользуясь случаем, отмечу, что я c большим удовольствием смотрю все видео Алексея.
Использованные компоненты, их количество и стоимость:
Итого общая стоимость устройства составила 650 рублей ( что-то еще. Анализ при помощи КСВ-метра Mini60S и эквивалента нагрузки 50 Ом показал отсутствие влияния на КСВ на диапазонах от 160 до 20 метров. На диапазонах от 17 до 10 метров какое-то влияние есть, но оно незначительное. Так на 10 метрах без переключателя вы получите КСВ 1.0, а с ним — 1.06.
Во-вторых, когда речь идет о переменном токе, как бы разомкнутая цепь на самом деле не бывает полностью разомкнутой. Какая-то часть сигнала все равно пройдет, подобно тому, как она проходит в конденсаторе. Вопрос только в том, как сильно будет ослаблен прошедший сигнал.
Данная проблема была изучена при помощи осциллографа, генератора сигналов MHS-5200A и нагрузки 50 Ом на диапазоне частот от 1 до 25 МГц. Размах сигнала при генераторе, подключенном через коммутатор, составил 6 В. Когда же генератор отключен, проходит сигнал с размахом 7 мВ. Из заметки Базовые аналоговые фильтры: теория и практика вы можете помнить формулу:
Таким образом, аттенюация составила 58.7 дБ.
Допустим, мы решили использовать RTL-SDR с апконвертором и данным переключателем, как не самый удобный панадаптер к трансиверу Yaesu FT-891. Спрашивается — спалим ли мы «отключенный» RTL-SDR, если включить трансивер на передачу полной мощностью 100 Вт?
Мощность 100 Вт соответствует 50 dBm, которая после аттенюации превращается в -8.7 dBm. Максимальная входная мощность чипа R820T2, согласно его даташиту, составляет 10 dBm (10 mW). Следовательно, устройство в безопасности. Экспериментально это также подтвердилось. Судя по подсчетам, в такой конфигурации мы можем спокойно работать даже с максимально разрешенной мощностью 1000 Вт (60 dBm).
Само собой разумеется, ничто не мешает сделать аналогичный переключатель и с большим количеством разъемов. В таком случае вместо тумблера будет удобнее воспользоваться галетным переключателем. Помимо тумблеров и переключателей с тем же успехом можно воспользоваться и реле. Это позволит сделать коммутатор, управление которым происходит удаленно. Если у вас есть тюнер, и в нем отсутствует функция bypass (как в моем MFJ-971), можно взять тумблер с двумя контактными группами и добавить bypass.
В общем, здесь открывается большой простор для творчества.
Источник
Автоматический переключатель антенн с управлением на МК
В радиолюбительской практике иногда возникает потребность сделать что-нибудь на микроконтроллере. Если не занимаешься такого рода поделками постоянно, то приходится долго гуглить нужное схемное решение и подходящие библиотеки для МК, позволяющие быстро решить задачу. Недавно захотелось мне сделать автоматический антенный переключатель. В процессе работы пришлось использовать многие возможности МК Atmega в одном компактном проекте. Тем, кто начинает изучать AVR, переходит с ардуино или эпизодически программирует МК могут быть полезны куски кода, использованные мной в проекте.
Антенный переключатель задумывался мной как устройство, автоматически подключающее к трансиверу антенну, которая наилучшим образом подходит для рабочего диапазона коротких волн. У меня есть две антенны: Inverted V и Ground Plane, подключены они к антенному тюнеру MFJ, в котором их можно дистанционно переключать. Есть фирменный ручной переключатель MFJ, который хотелось заменить.
Для оперативного переключения антенн к МК подключена одна кнопка. Её я же приспособил для запоминания предпочтительной антенны для каждого диапазона: при нажатии кнопки более 3 секунд выбранная антенна запоминается и выбирается правильно автоматически после очередного включения питания устройства. Информация о текущем диапазоне, выбранной антенне и состоянии её настройки выводится на однострочный LCD дисплей.
О том, на каком сейчас диапазоне работает трансивер, можно узнать разными способами: можно измерять частоту сигнала, можно получать данные по интерфейсу CAT, но самое простое для меня – использовать интерфейс трансивера YAESU для подключения внешнего усилителя. В нём есть 4 сигнальных линии, в двоичном коде указывающие на текущий диапазон. Они выдают логический сигнал от 0 до 5 вольт и их можно через пару согласующих резисторов соединить с ногами МК.
Это еще не всё. В режиме передачи через тот же интерфейс передаются сигналы PTT и ALC. Это логический сигнал о включении передатчика (подтягивается к земле) и аналоговый сигнал от 0 до -4В о работе системы автоматического управления мощностью передатчика. Его я тоже решил измерять и выводить на LCD в режиме передачи.
Кроме того, тюнер MFJ умеет передавать на пульт дистанционного управления сигналы о том, что он ведет настройку и о том, что антенна настроена. Для этого на фирменном пульте MFJ предусмотрено два контрольных светодиода. Я вместо светодиодов подключил оптроны и подал с них сигнал на МК, так чтоб всю информацию видеть на одном дисплее. Выглядит готовый девайс так.
Коротко о самоделке вроде всё. Теперь о программной части. Код написан в Atmel Studio (Свободно скачивается с сайта Atmel). В проекте для начинающих демонстрируются следующие возможности использования популярного МК Atmega8:
- Подключение кнопки
- Подключение линии вход для цифрового сигнала от трансивера и тюнера
- Подключение выхода управления реле переключения антенн
- Подключение однострочного LCD дисплея
- Подключение зуммера и вывод звука
- Подключение линии аналогового входа ADC и измерение напряжения
- Использование прерываний
- Использование таймера для отсчёта времени нажатия кнопки
- Использование сторожевого таймера
- Использование энергонезависимой памяти для хранения выбранных антенн
- Использование UART для отладочной печати
- Экономия энергии в простое МК
Итак, начнём. По ходу в тексте будут встречаться всякие названия регистров и константы, свойственные для применяемого МК. Это не ардуино, здесь к сожалению, придётся почитать даташит на МК. Иначе вам не понять, что значат все эти регистры и как можно поменять их значения. Но структура программы в целом останется той же.
Первым делом подключим к МК кнопку
Это самое простое. Один контакт подключаем к ноге МК, второй контакт кнопки – на землю. Чтобы кнопка работала, понадобится включить подтягивающий резистор в МК. Он соединит кнопку через сопротивление с шиной +5В. Сделать это совсем просто:
Аналогично к шине +5В подтягиваются все цифровые входы, которые управляются замыканием на землю (оптроны, сигнальные линии от трансивера, сигнал PTT). Иногда лучше физически припаять такой резистор меньшего наминала (например 10к) между входом МК и шиной +5В, но обсуждение этого вопроса за рамками статьи. Поскольку все входные сигналы в проекте редко изменяют значения, то они для защиты от помех зашунтированы на землю конденсаторами в 10 нанофарад.
Теперь у нас на входе PB2 постоянно присутствует логическая 1, а при нажатии на кнопку будет логический 0. При нажатии\отжатии нужно отслеживать дребезг контактов кнопки, проверяя, что уровень сигнала не изменился за время, скажем 50 миллисекунд. Делается это в программе так:
Теперь подключаем пищалку
Она будет давать звуковой сигнал подтверждения, что антенна записана в память МК. Пищалка это просто пьезоэлемент. Он подключается через небольшое сопротивление к ноге МК, а вторым контактом к +5В. Для работы этого зуммера нужно сначала настроить ногу МК на вывод данных.
Теперь ею можно пользоваться. Для этого написана небольшая функция, использующая временные задержки для переключения ноги МК из 0 в 1 и обратно. Переключение с необходимыми задержками позволяет формировать на выходе МК сигнал звуковой частоты 4 кГц длительностью около четверти секунды, который и озвучивает пьезоэлемент.
Для работы функций задержек не забудьте подключить заголовочный файл и настроить константу скорости работы процессора. Она равна частоте подключенного к МК кварцевого резонатора. В моём случае был кварц на 16МГц.
Подключаем к МК реле переключения антенн
Здесь нужно просто настроить ногу МК для работы на выход. К этой ноге через усиливающий транзистор по стандартной схеме подключено герконовое реле.
Подключение дисплея
Я использовал однострочный 16 символьный LCD дисплей 1601, добытый из старой аппаратуры. Он использует широкоизвестный контроллер HD44780, для управления которым в сети доступна масса библиотек. Какой-то добрый человек написал легкую библиотеку управления дисплеем, которую я и использовал в проекте. Настройка библиотеки сводится к указанию в заголовочном файле HD44780_Config.h номеров ног МК, подключенных нужным выводам дисплея. Я применил подключение дисплея по 4 линиям данных.
Особенностью моего экземпляра дисплея стало то, что одна строка на экране выводилась как две строки по 8 символов, поэтому в программе был сделан промежуточный экранный буфер для более удобной работы с экраном.
Функция update_display() позволяет выводить содержимое буфера на экран. Значения байтов в буфере это коды ASCII выводимых символов.
Вывод отладочной печати в COM порт
В МК есть UART и я его использовал для отладки программы. При подключении МК компьютеру надо только помнить, что уровни сигнала на выходе МК в стандарте TTL, а не RS232, так что понадобится простейший переходник. Я использовал адаптер USB-Serial, аналогичных полно на aliexpress. Для чтения данных подойдет любая терминальная программа, например от ардуино. Код настройки порта UART:
После настройки потока вывода, можно пользоваться обычным printf для печати в порт:
Программа использует печать вещественных чисел. Обычные библиотеки не поддерживают такой режим вывода, поэтому пришлось подключить полноценную библиотеку при линковке проекта. Она, правда, увеличивает серьёзно объем кода, но у меня был большой запас памяти, так что это было некритично. В опциях линкера нужно указать строку:
Работа с таймером и прерываниями
Для отсчёта интервалов времени в программе важно иметь счётчик времени. Он нужен для отслеживания, что кнопка нажата более 3 секунд и, следовательно, нужно запомнить в энергонезависимой памяти новые настройки. Чтоб измерить время в стиле AVR нужно настроить счётчик импульсов тактового генератора и прерывание, которое будет выполняться при достижении счётчиком заданного значения. Я настроил таймер так, чтоб он примерно раз в секунду выдавал прерывание. В самом обработчике прерывания подсчитывается количество прошедших секунд. Управляет включением\отключением таймера переменная timer_on. Важно не забывать объявлять все переменные, которые обновляются в обработчике прерывания, как volatile, иначе компилятор может их «оптимизировать» и программа работать не будет.
Значение переменной passed_secs проверяется в главном цикле программы. При нажатии кнопки таймер запускается и далее в главном цикле программы проверяется значение таймера при нажатой кнопке. Если это значение превысит 3 секунды, то производится запись в EEPROM, а таймер останавливается.
Последнее, но самое главное – после всех инициализаций нужно разрешить выполнение прерываний командой sei().
Измерение уровня ALC
Производится с помощью встроенного аналого-цифрового преобразователя (ADC). Я измерял напряжение на входе ADC7. Надо помнить, что можно измерить значение от 0 до 2.5В. а у меня входное напряжение было от -4В до 0В. Поэтому я подключил МК через простейший делитель напряжения на резисторах, так чтобы уровень напряжения на входе МК был на заданном уровне. Далее, мне не нужна была высокая точность, поэтому я применил 8 битное преобразование (достаточно читать данные только из регистра ADCH). В качестве опорного источника использовал внутренний ИОН на 2.56В, это чуть упрощает расчёты. Для работы ADC не забудьте подключить на землю конденсатор 0.1 мкФ к ноге REF.
ADC в моем случае работает непрерывно, сообщая об окончании преобразования вызовом прерывания ADC_vect. Хорошим тоном является усреднять значения нескольких циклов преобразования для уменьшения погрешности. В моём случае я вывожу среднее из 2500 преобразований. Весь код работы с ADC выглядит так:
Использование EEPROM
Это энергонезависимая память в МК. Её удобно использовать для хранения всяких настроек, корректировочных значений и т.п. В нашем случае она используется только для хранения выбранной антенны для нужного диапазона. С этой целью в EEPROM выделен 16 байтный массив. Но обращаться к нему можно через специальные функции, определенные в заголовочном файле avr/eeprom.h. При запуске МК считывает информацию о сохранённых настройках в оперативную память и включает нужную антенну в зависимости от текущего диапазона. При длительном нажатии на кнопку в память записывается новое значение, сопровождаемое звуковым сигналом. Во время записи в EEPROM на всякий случай запрещаются прерывания. Код инициализации памяти:
Фрагмент кода обработки нажатия кнопки 3 сек и записи в память:
Использование сторожевого таймера
Не секрет, что в условиях сильных электромагнитных помех МК может зависнуть. При работе радиостанции бывают такие помехи, что «утюги начинают разговаривать», так что нужно обеспечить аккуратную перезагрузку МК в случае зависания. Этой цели служит сторожевой таймер. Использовать его очень просто. Подключите сначала в проект заголовочный файл avr/wdt.h. В начале работы программы после выполнения всех настроек нужно запустить таймер вызовом функции wdt_enable(WDTO_2S), а потом не забывать периодически сбрасывать вызовом wdt_reset(), иначе он сам перезапустит МК. Для отладки чтоб узнать по какой причине был перезапущен МК, можно использовать значение специального регистра MCUSR, значение которого можно запомнить и затем выдать в отладочную печать.
Экономия энергии для любителей экологии
Пока МК ничем не занят, он может заснуть и ждать наступления очередного прерывания. В этом случае экономится немного электрической энергии. Пустяк, но почему бы его не использовать в проекте. Тем более, что это очень просто. Подключите заголовочный файл avr/sleep.h. Тело программы состоит из одного бесконечного цикла, в котором нужно вызывать функцию sleep_cpu(), после чего МК немного засыпает и основной цикл останавливается до возникновения следующего прерывания. Они возникают при работе таймера и ADC, так что долго спать МК не будет. Режим спячки определяется при инициализации МК вызовом двух функций:
На этом пока всё. Переключатель я сделал, он успешно трудится на моей любительской радиостанции без сбоев. Надеюсь, предоставленный материал будет полезен начинающим.
Источник