Получение сигналов различной формы с высокой точностью частоты является весьма распространенной задачей при создании различных радиолюбительских и профессиональных электронных устройств.
Благодаря современной компонентной базе сегодня можно реализовать довольно функциональные генераторы сигналов, работающие по принципу DDS или прямого цифрового синтеза. И сегодня мы рассмотрим простой пример создания такого генератора сигналов с помощью Arduino и AD9850.
Для быстрого прототипирования возьмем плату Arduino Nano и плату HC-SR08 со встроенной микросхемой AD9850.
Схема подключения данных двух плат довольно простая и может выглядеть следующим образом.
Приведенный далее код для Arduino реализует свипирование частоты от 1 Гц до 40 МГц, что является пределом. Данный диапазон можно легко изменить в соответствии с вашими потребностями. Если вам нужны прямоугольные сигналы, вам нужно отрегулировать потенциометр, чтобы получить желаемый скважность, иначе вы можете получить коэффициент заполнения 0 и ничего не увидеть.
#include <SPI.h>
// Подключение: плата AD9850 Board - Плат Arduino:
// CLK = 13,
// DATA = 11,
// RST = GND
const byte FQ = 10; // частота обновления
// VCC - Arduino +5V
// GND - Arduino GND
void setup() {
Serial.begin(9600);
Serial.println(__FILE__);
SPI.begin();
SPI.setBitOrder(LSBFIRST);
pinMode(FQ, OUTPUT);
upDownFq();
// диапазон от 1 Гц до 40 МГц
float f = 1;
while (f < 40E6) {
AD9850_set_frequency(f);
Serial.println(f);
delay(1000);
f = f * 1.5;
}
}
void loop() {}
void AD9850_set_frequency(float frequency) {
// передаем частоту и запускаем DDS
frequency = frequency / 1000000 * 4294967295 / 125;
// для осциллятора 125 МГц
union {
long y;
byte b[4];
} freq;
freq.y = frequency; // float в long
SPI.transfer(freq.b, 4);
SPI.transfer(0);
upDownFq();
}
void upDownFq() {
asm("sbi 5,2 \n\t"
"cbi 5, 2 \n\t"); // устанавливаем новое значение частоты
}
© digitrode.ru