Синтезатор за полчаса

Синтезатор за полчаса.

Ну разумеется очень простой синтезатор. Чуда тут никакого нет. Просто в наш промышленный век некоторые проблемы радиолюбителей потихоньку уходят в прошлое. Такой узел вполне можно использовать в очень простой конструкции, в том числе и начинающим. Собирается из готовых модулей. Да, собственно вся сборка сводится к изготовлению соединительного кабеля между двумя блоками, приехавшими за две – три недели из Китая. Стоимость комплектующих едва переваливает за 600 рублей и позволяет получить вполне приличный сигнал в заявленном производителями диапазоне 3.5 – 40 МГц. Впрочем за пределами этого диапазона устройство тоже работоспособно, хотя качество сигнала может быть похуже, а как далеко за эти пределы можно уйти, я не проверял. Хотя, частоты диапазона 160м у меня вполне получились, в чем я убедился с помощью лежащего рядом Дегена.
Итак. Нам потребуется:
• Модуль HC-SR08, выполненый на базе широко известного чипа DDS AD9850. В он-лайн магазинах лучше искать по словам AD9850 DDS module
• Одна из плат Arduino.
Я использовал Arduino Uno. Если есть желание и дальше экспериментировать с этой платформой, а опыта в этом нет, то есть смысл брать именно такую. Причем есть некоторый смысл брать именно такую, у которой сам микроконтроллер в панельке, а не впаян, хотя это чуть дороже. Впрочем, впаянный тоже будет работать без проблем. С аналогичным результатом подойдет Nano. Функционально они идентичны, но нано заметно компактнее. Подойдут и другие, но могут быть ньюансы. Есть много аналогов функционально совместимых с Uno и Nano, тоже можно брать.
Можно также заказать макетную плату и перемычки к ней, тогда монтаж еще больше упростится, но это не обязательно. Перемычки я использовал. Поскольку в модуль DDS были уже впаяны штырьки, я разрезал перемычки пополам и на свободные концы установил шестиконтактный разъем BLS.
Пока заказанное оборудование едет к вам. Посетите сайт http://arduino.cc откуда нужно скачать среду разработки Arduino IDE и установить её. Если с английским не очень, без ущерба для результата можно ограничиться http://arduino.ru , хотя информации там несколько меньше и сайт слегка отстает с новинками.
Далее делаем кабель. Схема такая:
ARDUINO DDS
5v ----------- vcc
8 ------------- w_CLK
9 -------------- FU_UD
10 ------------ DATA
11 ------------ RESET
GND --------- GND
Дальше все просто. По получении оборудования, соединяем модули изготовленным кабелем. Подключаем плату Arduino к компьютеру соответствующим кабелем USB. Запускаем среду разработки и загружаем приведенный ниже скетч, не забыв вписать в него нужную частоту.
Вуалля. Имеем сигнал нужной частоты. Если нужна другая, меняем значение и перегружаем скетч.
Модуль DDS имеет два парафазных выхода, с синусоидой и с меандром.
Устройство работоспособно и без компьютера. Последний загруженный скетч хранится в памяти платы и начинает выполнятся при подключении к разъему питания источника напряжением 6-12В. Впрочем, Uno держит и до 20В, но микросхема стабилизатора при больших напряжениях может ощутимо греться.
Это очень простое устройство, но и оно может быть очень полезным, особенно в простых конструкциях. Для дальнейшего развития тоже нет никаких препятствий. Я уже получил из Китая 16Х2 LCD индикатор с клавиатурой, пару валкодеров и даже модуль GPS. По мере отработки новых вариантов буду их выкладывать.

Приведеннй ниже текст программы можно просто скопировать в окно среды разработки или загрузить отсюда: http://webshed.org/mediawiki/upload/7/70/Dds_test-120823a.zip . Частота 10МГц.

Рабочий пример с частотой 3550 КГц:
//AD9850 DDS test

#define DDS_CLOCK 125000000

#define CLOCK 8 //pin connections for DDS
#define LOAD 9
#define DATA 10
#define RESET 11

void setup()
{
pinMode (DATA, OUTPUT);
pinMode (CLOCK, OUTPUT);
pinMode (LOAD, OUTPUT);
pinMode (RESET, OUTPUT);
AD9850_init();
AD9850_reset();

SetFrequency(3550000);

}

void loop()
{

}

void SetFrequency(unsigned long frequency)
{
unsigned long tuning_word = (frequency * pow(2, 32)) / DDS_CLOCK;
digitalWrite (LOAD, LOW);

shiftOut(DATA, CLOCK, LSBFIRST, tuning_word);
shiftOut(DATA, CLOCK, LSBFIRST, tuning_word >> 8);
shiftOut(DATA, CLOCK, LSBFIRST, tuning_word >> 16);
shiftOut(DATA, CLOCK, LSBFIRST, tuning_word >> 24);
shiftOut(DATA, CLOCK, LSBFIRST, 0x0);
digitalWrite (LOAD, HIGH);
}

void AD9850_init()
{

digitalWrite(RESET, LOW);
digitalWrite(CLOCK, LOW);
digitalWrite(LOAD, LOW);
digitalWrite(DATA, LOW);
}

void AD9850_reset()
{
//reset sequence is:
// CLOCK & LOAD = LOW
// Pulse RESET high for a few uS (use 5 uS here)
// Pulse CLOCK high for a few uS (use 5 uS here)
// Set DATA to ZERO and pulse LOAD for a few uS (use 5 uS here)

// data sheet diagrams show only RESET and CLOCK being used to reset the device, but I see no output unless I also
// toggle the LOAD line here.

digitalWrite(CLOCK, LOW);
digitalWrite(LOAD, LOW);

digitalWrite(RESET, LOW);
delay(5);
digitalWrite(RESET, HIGH); //pulse RESET
delay(5);
digitalWrite(RESET, LOW);
delay(5);

digitalWrite(CLOCK, LOW);
delay(5);
digitalWrite(CLOCK, HIGH); //pulse CLOCK
delay(5);
digitalWrite(CLOCK, LOW);
delay(5);
digitalWrite(DATA, LOW); //make sure DATA pin is LOW

digitalWrite(LOAD, LOW);
delay(5);
digitalWrite(LOAD, HIGH); //pulse LOAD
delay(5);
digitalWrite(LOAD, LOW);
// Chip is RESET now
}
========================================================================
По материалам http://webshed.org/wiki/AD9850_Arduino