Простой GPS-стандарт частоты и генератор RF |
Добавил(а) microsin |
Здесь приведен перевод интересной статьи [1], где описан простой стандарт частоты, собранный из модуля приемника GPS. Автор собирал конструкции на основе моделей NEO-6M (тип NEO-6M-0-001) и NEO-7M (тип NEO-7M-0-000) компании "u-blox AG". Эти модули можно довольно недорого купить на AliExpress. Модуль NEO-6M-0-001 позволяет генерировать максимальную опорную частоту 1 кГц, более современный модуль NEO-7M-0-000 может генерировать частоты до 10 МГц с дискретностью настройки 1 Гц (100 ppm) и минимальной точностью 2·10-8. Можно генерировать также и частоты выше 10 МГц ценой дополнительного джиттера в выходном сигнале. Получается точный RF-генератор, отлично подходящий для всех видов приложений. К сожалению, сигнал этого генератора получается недостаточно чистый по спектру, чтобы его можно было использовать в качестве VFO передатчика или приемника (точнее говоря, качество спектра зависит от генерируемой частоты, см. [7]). Ayoma Gayan Wijethunga описал в своем блоге, как этот GPS-модуль подключить к Arduino Nano, чтобы компьютер PC мог обмениваться с ним данными. Очень простая программа Arduino отправляет команды от PC к GPS-модулю и получает от него данные обратно. Получаемые данные можно увидеть с помощью встроенного в IDE Arduino монитора последовательного порта (окно Serial Monitor), либо с помощью любой программы терминала (SecureCRT, Putty, TerraTerm и т. п.). Также можно очень просто программировать импульсы времени, что рассмотрим далее. Схема подключения GPS-модуля NEO-7M-0-000 к Arduino Nano (модули NEO-6M-0-001 и NEO-7M-0-000 подключаются одинаково): Информационные сигналы обмена данными между модулем GSM и Arduino Nano передаются по последовательному порту TTL UART. Приемник GPS работает с уровнями логики 3.3V, поэтому для согласования с уровнями логики 5V Arduino Nano нужна либо микросхема преобразования уровней (GTL2003 и т. п.), либо цепочка делителя напряжения, составленная из резисторов 4,7 кОм и 10 кОм, подключенная между выходом TX Arduino Nano и входом RX модуля GSM. Уровень 3.3V на выходе TX модуля GSM достаточен, чтобы его подать на вход RX Arduino Nano. Автор для безопасности добавил на выходе TX модуля GSM резистор 1 кОм. Конечно, мы не можем подключить выход импульсов времени (ножка PPS модуля GSM) напрямую ко всем видам приложений. На выход PPS были добавлены резистор 5.6 кОм и емкость 0.1 мкФ, что позволяет избежать коротких замыканий на выходе и удаляет постоянную составляющую. Важный момент - резистор следует подключить как можно ближе к выводу, чтобы в антенну не попадал сигнал помехи, наводимый выводом PPS. В противном случае гармоники выходного сигнала опорной частоты могут нарушить прием сигнала GPS. Вся нехитрая конструкция была собрана в деревянной коробочке из-под пакетиков чая. В верхней крышке выпилено окошко, чтобы можно было видеть мерцание светодиодов. [Программа для Arduino Nano] Программирование микроконтроллера, который стоит на платке Arduino Nano, делается очень просто, всего за несколько минут! Загрузите среду разработки Arduino IDE с сайта arduino.cc и установите. Подключите платку Arduino Nano к компьютеру. Выберите тип подключенной платы (меню Сервис -> Плата -> Arduino Nano), выберите COM-порт, через который компьютер видит Arduino Nano (Сервис -> Последовательный порт). Откройте скетч ublox6a.ino (находится в архиве [12]). Выберите в меню Скетч -> Проверить / Компилировать (Ctrl+R). Через меню Файл -> Загрузить (Ctrl+U) загрузите скомпилированную программу в память микроконтроллера. #include < SoftwareSerial.h>
// Создание программного serial-объекта для обмена данными
// с модулем GPS. Ножка порта D3 Arduino используется как
// сигнал TX, передающий данные выводу RX модуля GPS,
// и ножка порта D4 Arduino работает как вход RX, получающий
// сигнал от выхода TX модуля GPS. SoftwareSerial gps(4, 3); void setup() { // Запуск последовательного обмена между платой Arduino // и Arduino IDE (Serial Monitor). Вместо Serial Monitor // среды Arduino IDE можно использовать любую программу // последовательного терминала (SecureCRT, Putty, TerraTerm). Serial.begin(9600); while(!Serial); // Запуск последовательного обмена между платой Arduino // и модулем GPS. Скорость обмена должна быть 9600 бод. gps.begin(9600); delay(1000); Serial.println("Setup Complete!"); } void loop() { // Чтение данных модуля GPS (если они доступны) и передача их // в последовательный порт. В результате эти данные будут // напечатаны в окне Arduino IDE Serial Monitor. if(gps.available()) { Serial.write(gps.read()); } // Чтение данных из окна Arduino IDE Serial Monitor (если // эти данные доступны, т. е. если их ввел пользователь) // и отправка их модулю GPS. if(Serial.available()) { gps.write(Serial.read()); } } Программа Arduino состоит из двух основных частей. Функция void setup () содержит код конфигурирования, т. е. здесь может быть определено, какие порты Arduino Nano работают как выходы, какие периферийные устройства должны быть настроены. Вторая часть это функция void loop (), содержащая саму программу. Дополнительную информацию о том, как эта вся система работает, можно найти на официальном сайте Arduino (также см. [4]). После загрузки и запуска этой простой программы на плате Arduino Nano откройте окно Serial Monitor, это делается через меню Сервис -> Монитор порта (Ctrl+Shift+M). В окне Serial Monitor Вы увидите данные, которые передает модуль GPS. [ПО для модуля GPS] Мы запрограммировали плату Arduino Nano и подключили с её помощью модуль GPS к компьютеру PC через порт USB. Закройте среду разработки Arduino IDE, она больше не понадобится. Плата Arduino Nano теперь работает как устройство переходника USB-UART. Примечание: вместо платы Arduino Nano можно было использовать готовый переходник USB-TTL-UART, переключив его в режим уровней 3.3V. Такие переходники также продаются в большом разнообразии на сайте AliExpress, и стоят очень дешево. Для управления модулем GPS автор использовал программу u-center, которую можно загрузить с сайта www.u-blox.com [2]. После установки и запуска программы выберите правильный номер COM-порта. С помощью программы u-center можно выполнять множество интересных действий. Например, можно узнать мощность сигнала, принимаемого со спутников, Ваше положение на карте Google Maps. Для генерации сигнала нужно использовать функцию программирования импульсов. Для модуля NEO-6M мы использовали "TP (Timepulse)" для программирования опорной частоты. Но для модуля NEO-7M это не работает, и нужно использовать "TP5 (Timepulse)". Активируйте радиокнопки "Frequency" и "Duty Cycle" (см. скриншот). Вам нужно запрограммировать 2 частоты, одну 1 Гц, чтобы светодиод мерцал, для индикации, и вторую, которая нужна в качестве опорной. Опорная частота программируется в области "Frequency Locked". Здесь можно ввести любую частоту до как минимум 10 МГц. Мой модуль мог выдавать частоты до 16 МГц, при этом частота получала некоторый дополнительный джиттер. Настройки можно сохранить. Это делается выбором функций "BBR-0" и "3-I2C-EEPROM", что сохраняет настройки соответственно в памяти, поддерживаемой батарейкой, и в микросхеме EEPROM. К сожалению, на моем модуле не было памяти EEPROM, и приходилось повторять настройку при разряде батарейки. Пользователь Mark VK6WV сделал следующее замечание: "Когда я попытался сохранить настройку, как советовала Ваша статья, то это не сработало. После изучения руководства пользователя я обнаружил функцию сохранения конфигурации GNSS в меню Tools. После установки настройки TP5 конфигурация GNSS была прочитана и записана в файл. Затем этот файл было записан обратно в модуль GPS функций "Store Configuration into BBR/Flash". Это работает." [Практика использования] В помещении приемник GPS иногда с трудом находит спутники для привязки своей позиции (FIX). Вынесите GPS-модуль на улицу, после чего он находит FIX, после чего можно продолжить работу в помещении. Модуль в деревянном ящичке излучает достаточно мощный сигнал, чтобы можно было откалибровать приемник QRSS. У частоты 10140 кГц есть даже достаточно мощные гармоники, которые могут создавать помехи сигналу GPS. Для получения самого мощного сигнала подключайтесь к выходному коннектору. Если нужен слабый сигнал для проверки приемника, настройте выходную частоту в 2 раза меньше частоты приема (например 5070000 Гц), и скважность 25% (параметр Duty Cycle). Для еще более слабых сигналов используйте скважность 50% и нечетные коэффициенты деления частоты (1/5, 1/7, 1/9 от частоты приема, и т. д.). Для калибровки приемника QRSS автор использовал деление частоты на 10 со скважностью 25% (1014000 Hz). Пример настройки для калибровки приемника QRSS, использовалась 10-я гармоника частоты 1014000 Гц: Возможно, что сейчас появились более современные модели модулей GPS, см. [3]. [Моя реализация генератора] На основе модуля NEO-7M0-0-000 компании U-blox [8], индикатора OLED и макетной платы AVR-USB32U4 [9] собрал генератор эталонных частот (см. фото ниже). Возможности и основные функции генератора: 1. Выходная частота прямоугольной формы регулируется в пределах 1..10 МГц с помощью поворотного энкодера. Регулировка частоты реализована таким образом, что поворот энкодера влево и вправо меняет уменьшает и увеличивает соответственно значение цифры частоты, напротив которой стоит курсор. Когда значение текущей цифры уменьшается до 0 с переходом к цифре 9, левый соседний разряд уменьшается на единицу. И наоборот, при увеличении значения цифры с переходом от 9 к 0 положение левой соседней цифры также увеличивается. Положение курсора можно менять короткими нажатиями на ручку энкодера. Отображение частоты сделано по правилу "показывать максимальное количество значащих разрядов". Это означает, что когда в процессе увеличения значащие разряды частоты не помещаются на экране, форматирование вывода частоты изменяется в соответствии с этим правилом. Т. е. перемещается позиция десятичной точки, меняются единицы частоты с Гц на кГц и с кГц на МГц. И наоборот, когда при уменьшении частоты появляется возможность вывести не отображаемый на экране младший десятичный разряд, то формат вывода частоты соответствующим образом меняется. Вывод на индикатор. Я использовал монохромный индикатор OLED 128x64 с интерфейсом I2C. Для его подключения использовался аппаратный интерфейс TWI микроконтроллера ATmega32U4 и графические библиотеки Adafruit. Библиотеки были предназначены для Arduino, и в целях их облегчения мне пришлось их портировать на чистый C, что было довольно несложно. Русский шрифт также нашелся довольно быстро. Однако пришлось повозиться с ускорением вывода на индикатор, потому что библиотека Adafruit использовала при выводе на индикатор блокировку на ожидании завершения передачи байта, т. е. работала по принципу опроса интерфейса TWI, без применения прерываний. Это сильно тормозило работу всей системы, затрудняло опрос энкодера и снижало отзывчивость системы на внешние события. Пришлось переделать низкоуровневый вывод на индикатор на обработку прерываний TWI, для чего за основу взял библиотеку avr-i2c-master. Подключение к приемнику NEO-7M0-0-000. При включении питания программа микроконтроллера дожидается готовности приемника, и после этого посылает в него настроечные команды, которые запрещают не нужные спутниковые каналы (вызов функции disableUnnecessaryChannels) и разрешает вывод навигационной информации в протоколе UBX (вызов функции enableNavPvt). После этого в приемник посылается команда вывода на ножку TIMEPULSE0 частоты, которая прочитана из EEPROM ATmega32U4 (вызов функции sendCFG_TP5). Команды приемнику и получение от него информации осуществляется через порт UART микроконтроллера. Виртуальный COM-порт. Программа микроконтроллера кроме управления приемником через UART также организует прозрачный мост между UART и виртуальным СОМ-портом (USB CDC), который реализован на основе библиотеки LUFA и аппаратного интерфейса USB ATmega32U4. Это очень полезная функция, потому что можно работать с приемником через пользовательский интерфейс программы u-center. По умолчанию приемник через протокол NMEA выводит множество информации о текущем местоположении, точном времени, количестве доступных спутников, направлении движения и т. п. Сначала у меня также была реализовано отключение вывода информации по протоколу NMEA, чтобы этот вывод не мешал парсингу протокола UBX. Но впоследствии оказалось, что парсер пакетов UBX нормально отфильтровывает пакеты NMEA, так что я не стал отключать протокол NMEA, и это добавило конструкции генератора дополнительный функционал. Интерфейс USB также используется для питания генератора, и через него можно обновлять программное обеспечение как приемника, так и ATmega32U4. Компаратор частоты и фазы. На передней панели в левой части можно увидеть два BNC-разъема. На левый из них выводится частота с выхода TIMEPULSE0 приемника, а на правый можно подать сигнал от внешнего генератора. Компаратор сравнивает эти две частоты, и управляет свечением двух красных светодиодов над коннекторами. Если частота на выходе TIMEPULSE0 больше, то зажжется левый светодиод, правый светодиод погаснет. Если же больше частота на выходе внешнего генератора, то зажжется правый светодиод. Компаратор частоты и фазы собран на КМОП-триггерах (см. схему из статьи [10]). Обработка протокола UBX. Анализ сообщений приемника в формате протокола UBX реализован на основе исходного кода Brian R Taylor bolderflight/UBLOX и документации по протоколу UBX [11]. Библиотека переделана таким образом, чтобы обрабатывать пакеты на лету, по одному байту, в соответствии с заданным шаблоном пакета. Исходный код проекта можно скачать по ссылке [12]. UPD181006. Добавил вывод на индикатор точного времени и даты. [Как поменять пояс времени] Часовой пояс жестко задан в исходном коде, см. модуль screenapp.c, процедуру ScreenHandler, ветку if (updateflags & SCRUPD_DATATIME): ... if (updateflags & SCRUPD_DATATIME) { ... if ((valid & 0x02) || !blank) { // Московское время +3: oledprintf("%2u:%02u:%02u", (hour+3)%24, min, sec); } ... Как вариант, с помощью двоичного редактора можно вручную отредактировать файл VirtualSerial.bin, константа добавления смещения в часах к UTC находится по адресу 0x1DD6 (на скриншоте слева уральское время +5, справа московское +3): [Как и чем компилировать] Часто задают вопрос, как скомпилировать исходный код из архива [12]. Если кратко, то для компиляции нужен тулчейн avr-gcc и каталог с библиотекой LUFA. Компилируется проект с помощью команд make clean и make, выполненных в каталоге src проекта (в этом каталоге находится файл makefile и основные модули исходного кода). Пошаговая инструкция: 1. Восстановите содержимое каталога библиотек LUFA. Полный путь до каталога можно узнать из файла src\makefile (LUFA_PATH = c:/asm/lufa-LUFA-170418/LUFA). 2. Установите тулчейн. Для этого можно установить WinAVR или Atmel Studio. Я установил WinAVR-20100110. Нужно также установить патч, устраняющий проблему совместимости WinAVR с операционными системами Windows 8.1 и Windows 10. См. архив [13], в нем инсталлятор WinAVR и патч. 3. Проверьте переменную окружения PATH, в ней первым должен идти каталог bin, где находятся утилиты компиляции (gcc, make и т. п.). Первой записью должен быть путь C:\WinAVR-20100110\bin;C:\WinAVR-20100110\utils\bin. Как вариант, можно временно в командной строке выполнить команду (переменная PATH поменяется только в этой сессии консоли): set PATH="c:\Program Files (x86)\Atmel\Studio\7.0\shellutils\";%PATH% 4. Зайдите в каталог src, и выполняйте в нем команды make clean и make. После выполнения make в каталоге src появятся файлы VirtualSerial.hex и VirtualSerial.bin. Можно также скомпилировать проект в среде Visual Studio. Откройте файл решения project.sln, и выполняйте команды Построение -> Очистить решение (аналог make clean) и Построение -> Построить решение F6 (аналог make). [Словарик] FIX FIXation, имеется в виду нахождения абсолютной позиции на карте в системе GPS. GPS Global Positionong System, спутниковая система глобального позиционирования. VFO Voltage-controlled Frequency Oscillator, генератор опорной частоты (гетеродин), частота которого управляется входным постоянным напряжением. [Ссылки] 1. SIMPLE 10 MHZ GPS FREQUENCY STANDARD AND RF GENERATOR site:qsl.net. |