Походная DSB радиостанция

Обсуждение аппаратуры для радиосвязи.
Аватара пользователя
GoBliNuke
Сообщения: 34
Зарегистрирован: 01 окт 2015, 19:55
Имя: Борис
Откуда: Липецкая область
Контактная информация:

Re: Походная DSB радиостанция

Сообщение GoBliNuke » 21 мар 2018, 17:06

По экранчику - было предложение на щрп.ру взять OLED, поскольку он морозоустойчив, не прожорлив, и по цене скромен.

Параллельно по полевой станции народ ковыряется на http://lpd.radioscanner.ru/topic23659-39.html
Аватара пользователя
ru0aog
Сообщения: 2175
Зарегистрирован: 31 янв 2013, 10:49
позывной: RU0AOG
CиБи позывной: Апрель
Имя: Станислав
Откуда: QTH locator: NO65JX # RDA KK-04
Контактная информация:

Re: Походная DSB радиостанция

Сообщение ru0aog » 21 мар 2018, 17:46

У меня этих LCD уже есть штук 10, не пропадать же добру :)
С ОЛЕД-ом я не работал, может потом как-нить... да и думается мне - ресурсоёмкий он.
А LCD со своим знакогенератором. И без подсветки работает (днём).

P.S.
А я думал, та тема давно сдохла...

P.P.S.
Да, и ещё по поводу шумности.
Вот народ проранжировал:
Изображение

Простой LCD безо всяких I2C почти не шумит.
Свое изделие изъяна не имеет.
Аватара пользователя
ru0aog
Сообщения: 2175
Зарегистрирован: 31 янв 2013, 10:49
позывной: RU0AOG
CиБи позывной: Апрель
Имя: Станислав
Откуда: QTH locator: NO65JX # RDA KK-04
Контактная информация:

Re: Походная DSB радиостанция

Сообщение ru0aog » 22 мар 2018, 09:18

Экранчик вот такой:
20180322_091118.jpg
20180322_091128.jpg
Брал вот тут.
Свое изделие изъяна не имеет.
Аватара пользователя
ru0aog
Сообщения: 2175
Зарегистрирован: 31 янв 2013, 10:49
позывной: RU0AOG
CиБи позывной: Апрель
Имя: Станислав
Откуда: QTH locator: NO65JX # RDA KK-04
Контактная информация:

Re: Походная DSB радиостанция

Сообщение ru0aog » 22 мар 2018, 11:06

Пробую расположить на плате:
DDS_PCB.JPG
Схемку немного подкорректировал:
DDS_SCH.JPG
Вложения
DDS.rar
(1.65 МБ) 22 скачивания
Свое изделие изъяна не имеет.
Аватара пользователя
ru0aog
Сообщения: 2175
Зарегистрирован: 31 янв 2013, 10:49
позывной: RU0AOG
CиБи позывной: Апрель
Имя: Станислав
Откуда: QTH locator: NO65JX # RDA KK-04
Контактная информация:

Re: Походная DSB радиостанция

Сообщение ru0aog » 27 мар 2018, 12:11

Пробую писать ардуиновский код.
Пока только управление дисплеем (библиотека LiquidCrystal) и приём данных с валкодера.
Пока ещё не понял, как заливать прогу на платку. Сто лет платы без USB не прошивал.
Наверное, через программатор по линиям MOSI/MISO/SCK и RESET (D11, D12, D13, RST).
Да, программатор USBasp. Где-то валялся такой.
Хотя и USB-TTL переходником тоже прошивают - вот.

Код: Выделить всё

// Синтезатор для приёмника прямого преобразования на модуле AD9833
// Fc маx = 12,5 МГц
// Микроконтроллер - ATMega329Р 16МГц
// Версия 1.01 от 27.03.2018
// Автор - RU0AOG

// Определим выводы для управления AD9833:
#define FSYNC     5
#define SCLK      6
#define SDATA     7

// Определим пин энкодера, каналы А и В
int pin_A = 2; // канал А
int pin_B = 4; // канал В
int pin_C = 3; // кнопка энкодера
unsigned char encoder_A; // состояние пина А
unsigned char encoder_B; // состояние пина В
unsigned char encoder_A_prev=0; // предыдущее состояние пина А

// Определим переменные и массивы
volatile unsigned long Freq = 3650000;  // определить начальную частоту в Гц
volatile unsigned long Freq_Step = 100; // определить шаг частоты в Гц
  unsigned long TuningWord;             // слово настройки AD9833 (4 байта) 
union MyLong {  // определим переменную для сборки/разборки длинного целого числа на 4 байта
  long l;
  byte b[4];} 
val;

// подключить библиотеку LCD
#include <LiquidCrystal.h>

// определяем распиновку LCD
// RS, E, DB4, DB5, DB6, DB7
LiquidCrystal lcd(13, 8, 9, 12, 11, 10);

void setup() {
  // определяем формат дисплея 16 символов, 2 строки
  lcd.begin(16, 2);
  LCD_PRNT();
  //начальная установка линий
  AD9833_Init();
  // установка прерывания
  pinMode(pin_A, INPUT);
  pinMode(pin_B, INPUT);
  attachInterrupt(digitalPinToInterrupt(pin_A), ISR0, CHANGE);
  attachInterrupt(digitalPinToInterrupt(pin_C), ISR1, FALLING);
}

void loop() {
  // установить курсор на позицию 10, строки 0 (верхняя строка-0, нижняя - 1)
  lcd.setCursor(10, 0);
  // print the number of seconds since reset:
  lcd.print(millis() / 1000);
}

// *************************************************************************************
// * Подпрограммы
// *************************************************************************************
void ISR0() {
  encoder_A = digitalRead(pin_A);       // считываем состояние выхода А энкодера 
  encoder_B = digitalRead(pin_B);       // считываем состояние выхода B энкодера
  if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
      if(encoder_B) {
        // выход В в полож. сост., значит вращение по часовой стрелке
        Freq = Freq + Freq_Step;
      }   
      else {
        // выход В в 0 сост., значит вращение против часовой стрелки     
        Freq = Freq - Freq_Step;
      }   
  }  
  LCD_PRNT();
  encoder_A_prev = encoder_A;     // сохраняем значение А для следующего шага
}

void ISR1() {
  if (Freq_Step<10000){
    Freq_Step = Freq_Step*10;}
    else{
    Freq_Step = 10;}
  // установить курсор на позицию 0, строки 1 (верхняя строка-0, нижняя - 1)
  lcd.setCursor(0, 1);
  // вывести сообщение
  lcd.print("STEP = ");
  lcd.print(Freq_Step, DEC);
}

void LCD_PRNT(){
  int FreqK=Freq/1000;
  int FreqH=(Freq-FreqK)/10;
  // установить курсор на позицию 0, строки 0 (верхняя строка-0, нижняя - 1)
  lcd.setCursor(0, 0);
  // вывести сообщение
  lcd.print(" ");
  lcd.print(FreqK, DEC);
  lcd.print(".");
  lcd.print(FreqH, DEC);  
}

void AD9833_Init(){
  // Назначить выводы управления AD9833
  pinMode(FSYNC, OUTPUT);
  pinMode(SCLK , OUTPUT);
  pinMode(SDATA, OUTPUT);
  // установить выводы управления AD9833 в LOW
  digitalWrite(FSYNC, 0);
  digitalWrite(SCLK, 0);
  digitalWrite(SDATA, 0);}

  

Вложения
SDRv01.rar
(42.54 КБ) 17 скачиваний
Свое изделие изъяна не имеет.
Аватара пользователя
ru0aog
Сообщения: 2175
Зарегистрирован: 31 янв 2013, 10:49
позывной: RU0AOG
CиБи позывной: Апрель
Имя: Станислав
Откуда: QTH locator: NO65JX # RDA KK-04
Контактная информация:

Re: Походная DSB радиостанция

Сообщение ru0aog » 02 апр 2018, 00:11

Сегодня приехал с больницы, и решил немного отвлечься пайкой.
Допаял цифровую часть. Теперь дело за софтом.
Код из поста выше загрузил. Дисплей работает корректно (в нижней строчке бегут секунды после включния). Герцы забыл округлить...
20180402_000439.jpg
А вот с валкодером напортачил. Первый раз всё таки.
Очень редко прерывание завершается корректно, но как правило, вешает дисплей. Наверное библиотека работает по таймеру, а я его разорвал.
На плату код залился достаточно легко. Прошивал usbasp-программатором по линиям mosi/miso.
Вот таким:
20180402_000521.jpg
Поругался на такты и драйверы, но залился.

P.S.
Попробую вот так:
DDS_1_02.rar
(1.99 КБ) 14 скачиваний
Свое изделие изъяна не имеет.
Аватара пользователя
ru0aog
Сообщения: 2175
Зарегистрирован: 31 янв 2013, 10:49
позывной: RU0AOG
CиБи позывной: Апрель
Имя: Станислав
Откуда: QTH locator: NO65JX # RDA KK-04
Контактная информация:

Re: Походная DSB радиостанция

Сообщение ru0aog » 03 апр 2018, 10:03

Так, едем дальше.
Валкодер заработал через пень-колоду.
Точнее, на малых скоростях вращения всё ок. А если крутить быстрее - то значения почти не меняются.
Похоже, надо следить не за уровнями, а за состояниями.
Или же механика такая - одна линия меняется, а вторая за ней не успевает.
Также вывод сообщений на экран довольно медленный. Очистка вообще занимает полсекунды, поэтому ей почти не пользуюсь.

Вольтметр добавил, чтоб за батареей следить:
20180402_233711.jpg
Как бы там ни было, валкод работает. Нажатием на кнопку валкода меняется шаг перестройки.
Нижняя строчка зарезервирована под кубики S-метра.
Можно писать управление синтезом.

Вот скетч:
DDS_1_03.rar
(3.91 КБ) 11 скачиваний
Свое изделие изъяна не имеет.
Аватара пользователя
ru0aog
Сообщения: 2175
Зарегистрирован: 31 янв 2013, 10:49
позывной: RU0AOG
CиБи позывной: Апрель
Имя: Станислав
Откуда: QTH locator: NO65JX # RDA KK-04
Контактная информация:

Re: Походная DSB радиостанция

Сообщение ru0aog » 03 апр 2018, 10:26

Разберём, как же нам управлять синтезом AD9833.
По сути, в ПЗУ AD9833 "вшита" таблица амплитудных значений синуса. Адреса этого ПЗУ перебираются счётчиком (аккумулятор фазы), тактируемым внешним генератором. В нашем случае, это 25 МГц.
В зависимости от того, какое число загружено и крутится счётчике, мы получаем полный или выборочный перебор значений ПЗУ.
Например, если мы загрузили в счётчик выборку всего двух значений, то будет выбираться фаза 0 и 180 градусов, т.е. с ПЗУ будет считываться попеременно только +1 и -1.
А если загрузим восемь значений, то получим последовательность фаз 0-45-90-135-180-225-270-315-360 градусов, т.е. амплитуда +1,+0,7, 0, -0,7, -1, -0,7, 0, +0,7, +1.

В первом случае для формирования сигнала синтезатора понадобится два такта. При тактовой частоте 25 МГц это будет 25/2 = 12,5 МГц - максимальная частота для AD9833.
Во втором случае нужно восемь тактов, т.е. частота будет всего 25/8 = 3,125 МГц, но и сигнал будет более близок к синусоиде.
Поскольку у нас ключевой смеситель, то особого смысла в генерации синуса нет. Он даже вреден.
Поэтому AD9833 в данном случае меня вполне устраивает.

Наша задача сводится к тому, чтобы правильно вычислить и загрузить в AD9833 значение аккумулятора фазы. Кстати, этот АФ имеет длину 28 бит.
По даташиту значение вычисляется так:
АФ = (частота в Гц) * 2^28 / 25 МГц

Например, для частоты 3650,00 кГц мы получим:
АФ = 3650000 * 2^28 / 25000000 = 39191576.576
Но у нас счётчик целочисленный, поэтому мы загружаем округлённое число 39191577.
Соответственно, мы получим частоту не ровно 3,65 МГц, а немного другую:
Частота = АФ * 25 МГц / 2^28, или
Частота = 39191577 * 25000000 / 2^28 = 3650000.039488 Гц
Думаю, ошибка невелика :D
Свое изделие изъяна не имеет.
Аватара пользователя
ru0aog
Сообщения: 2175
Зарегистрирован: 31 янв 2013, 10:49
позывной: RU0AOG
CиБи позывной: Апрель
Имя: Станислав
Откуда: QTH locator: NO65JX # RDA KK-04
Контактная информация:

Re: Походная DSB радиостанция

Сообщение ru0aog » 03 апр 2018, 10:38

Итак, надо загрузить число 39191577 = 0х02560419 = 0000 0010 0101 0110 0000 0100 0001 1001

Но перед тем, как загружать аккумулятор фазы, нужно провести инициализацию AD9833.
По даташиту она делается так:
Init_01.jpg
Init_01.jpg (50.06 КБ) 398 просмотров
И описание, что происходит:
Init_02.jpg
Свое изделие изъяна не имеет.
Аватара пользователя
ru0aog
Сообщения: 2175
Зарегистрирован: 31 янв 2013, 10:49
позывной: RU0AOG
CиБи позывной: Апрель
Имя: Станислав
Откуда: QTH locator: NO65JX # RDA KK-04
Контактная информация:

Re: Походная DSB радиостанция

Сообщение ru0aog » 03 апр 2018, 10:49

Сам процесс передачи данных прост.
Есть три линии:
SCLK - Serial Clock Input, падающий фронт SCLK записывает данные в AD9833.
FSYNC - frame synchronization signal, низкий уровень FSYNC указывает на загрузку нового слова.
SDATA - Serial Data Input, линия данных.

Поднимаем SCLK, роняем FSYNC и по линии SDATA выставляем 15-ый бит слова.
Роняем SCLK - 15-ый бит записывается в AD9833.
Поднимаем SCLK, выставляем 14-ый бит данных в SDATA.
Роняем SCLK - 14-ый бит записывается в AD9833.
***
Поднимаем SCLK, выставляем 0-ый бит данных в SDATA.
Роняем SCLK - 0-ый бит записывается в AD9833.

Слово записано.

Поднимаем SCLK, поднимаем FSYNC.
И дальше непонятно - нужны ли такты SCLK при поднятом FSYNC ?
И если нужны, то зачем?
Init_03.jpg
Хотя вот тут библиотеки на AD9833 есть:
https://github.com/douggilliland/lb-Ard ... ies/AD9833
Вложения
AD9833-Library-Arduino-master.zip
(15.23 КБ) 14 скачиваний
Свое изделие изъяна не имеет.
Ответить