Главная страница   Контактная информация   Новости науки и техники   Поиск на сайте   Форум

Задающий генератор - цифровой синтезатор частоты с выходным усилителем
(диапазон до 70 МГц, амплитуда выходного напряжения до 4 В)

Устройство на основе цифрового синтезатора частоты (DDS - direct digital synthesis) разработано в качестве задающего генератора для усилителей мощности высокой частоты, использующихся при проведении технологических опытов, в которых требуется высокая стабильность частоты рабочего напряжения (тока). Для предотвращения помех теле- и радиоприему все узлы генератора собраны в металлическом корпусе, выполняющем роль экрана, а опыты проводились в экранированных боксах. Блок-схема задающего генератора показана на рис. 1.

 

Рис. 1. Блок-схема задающего генератора на основе цифрового синтезатора частоты с микроконтроллером и выходным усилителем.

Задающий генератор построен из трех модулей: цифровой синтезатор частоты, микроконтроллер и выходной усилитель. В качестве цифрового синтезатора частоты используется модуль HC-SR08 на основе микросхемы AD9851 [1]. Микроконтроллером служит модуль Arduino Pro mini (микроконтроллер на микросхеме ATmega328) с предварительно загруженным отладчиком, позволяющим использовать программы, написанные на языке C в среде программирования Arduino [2]. Выходной усилитель - широкополосный усилитель мощности. Для установки и контроля режима работы устройства используются жидкокристаллический дисплей и клавиатура, подключаемые к выходным линиям микроконтроллера.

Полоса рабочих частот задающего генератора до 70 МГц, амплитуда выходного напряжения примерно 4 В на частоте 40 МГц.

Электрическая принципиальная схема задающего генератора приведена на рис. 2.

Рис. 2. Электрическая принципиальная схема задающего генератора на основе цифрового синтезатора частоты с микроконтроллером и выходным усилителем.

Сигнальные выводы модуля цифрового синтезатора частоты HC-SR08 WCLK, FQUD, DATA и RESET связаны с выходами микроконтроллера A3, A2, A1, A0, соответственно. Они служат для управления цифровым синтезатором частоты - задания режима работы, установки частоты и фазы выходного напряжения синтезатора. Оставшиеся выводы микроконтроллера могут быть использованы для подключения клавиатуры или энкодера и устройств индикации (например, ЖКИ индикатора), а также преобразователя USB-UART для записи рабочей программы в память микроконтроллера через порт USB компьютера.

Выходной усилитель (AMPLIFIER) построен по схеме рис. 3 на двух транзисторах VT1, VT2 (S9018). Рабочая точка (+4.5 В на эмиттере VT2 - половина напряжения питания) устанавливается подбором резистора R1. Входной конденсатор C1 отсекает постоянную составляющую входного напряжения цифрового синтезатора частоты. Выходная цепь R6C4 служит для согласования с нагрузкой, имеющей входное сопротивление около 50 Ом. Цепь L1C3 выполняет роль фильтра цепи питания. Рабочее напряжение усилителя +9 В.

Рис. 3. Электрическая принципиальная схема усилителя на частоту до 70 МГц.

Усилитель мощности собран на печатной плате (рис. 4, 5) из одностороннего фольгированного стеклотекстолита. Общий провод (GND) платы имеет максимально возможную площадь.

Рис. 4. Печатная плата усилителя. Размеры печатной платы 40 х 25 мм2.

Рис. 5. Внешний вид печатной платы усилителя.

Модули задающего генератора смонтированы на кросс-плате. Эскиз и внешний вид платы показаны на рис. 6, 7.

Рис. 6. Печатная кросс-плата цифрового синтезатора частоты. Размеры печатной платы 80 х 65 мм2.

Рис. 7. Внешний вид печатной платы цифрового синтезатора частоты.

Кросс-плата с модулями монтируется в корпусе из оцинкованного железа, выполняющего роль электромагнитного экрана (рис. 8). Корпус состоит из основания и крышки, которые скрепляются между собой двумя винтами.

Рис. 8. Задающий генератор в электромагнитном корпусе.

Вариант программы микроконтроллера в среде Arduino (рабочая частота 40 ... 41 МГц, ЖКИ индикатор подключен в соответствии со схемой рис. 2, три кнопки установки рабочей частоты подключены к контактам D10, D11, D12 микроконтроллера):

/*
  This program for 40
... 41 MHz generator
 */

#include <Bounce2.h>
#include <LiquidCrystal.h> 
       // Library LiquidCrystal
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); // (RS, E, DB4, DB5, DB6, DB7)

byte sym1[8] =   // стрелка вниз
{
  B00100,
 
B00100,
  B00100,
  B00100,
  B10101,
  B01110,
  B00100,
} ; 

byte sym2[8] =   // буква Г
{
  B11111,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
} ; 

byte sym3[8] =   // буква ц
{
  B00000,
  B00000,
  B10010,
  B10010,
  B10010,
  B10010,
  B11111,
} ; 

byte sym4[8] =   // буква н
{
  B00000,
  B00000,
  B10001,
  B10001,
  B11111,
  B10001,
  B10001,
} ; 

#define pressed_long 2000 // долговременное нажатие = 2 секунды
#define num_modes 6         // максимальное число разрядов справа налево (0 ... 6)

Bounce bouncer1 = Bounce();  //создаем экземпляры класса Bounce
Bounce bouncer2 = Bounce();
Bounce bouncer3 = Bounce();

unsigned long pressed_moment; // момент нажатия кнопки
int current_mode = 0 ; // Режим работы - номер разряда. Меняется при нажатии кнопки
short int max_mode = num_modes + 1; // вспомогательная переменная

long fr_1 = 40500000 ; // Main frequency
long fr_2 = 40500000 ; // Changed frequency
double fr_3 ;

#define W_CLK A3  // A3 - connect to AD9851 W_CLK
#define FQ_UD A2   // A2 - connect to AD9851 FQ_UD
#define DATA A1    // A1 - connect to AD9851 DATA
#define RESET A0    // A0 - connect to AD9851 RESET

#define B_MIN 10    // D10 - connect to Button Minimize
#define B_NP 11       // D11 - connect to Button Number position
#define B_MAX 12  // D12 - connect to Button Maximize

#define LED_PIN 13 // D13 - LED

#define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
// transfers a byte, a bit at a time, LSB first to the AD9851 via serial DATA line

void tfr_byte(byte data)
{
  for (int i=0; i<8; i++, data>>=1) {
   digitalWrite(DATA, data & 0x01);
   pulseHigh(W_CLK);   //after each bit sent, CLK is pulsed high
  }
}

void sendFrequency(double frequency) {
   int32_t freq = frequency * 25 / 105 * 100 * 1004 / 1001 * 1000000 / 1000845;
   for (int b=0; b<4; b++, freq>>=8) {
     tfr_byte(freq & 0xFF);
   }
   tfr_byte(0x001);   // Final control byte for AD9851 chip
   pulseHigh(FQ_UD);  // Done!  Should see output
 }

void setup(){
 pinMode(FQ_UD, OUTPUT);   // pin FQ_UD = A2 - Output
 pinMode(W_CLK, OUTPUT);  // pin W_CLK = A3 - Output
 pinMode(DATA, OUTPUT);    // pin DATA = A1 - Output
 pinMode(RESET, OUTPUT);    // pin RESET = A0 - Output

 pinMode(LED_PIN, OUTPUT);
 pinMode(B_MIN, INPUT) ;     // pin B_MIN = D10 - Input
 pinMode(B_NP, INPUT) ;        // pin B_NP = D11 - Input
 pinMode(B_MAX, INPUT) ;   // pin B_MAX = D12 - Input

 bouncer1.attach(B_MIN) ;     // Button A5
 bouncer1.interval(5) ;              // stable interval = 5 мс
 bouncer2.attach(B_NP) ;        // Button A6
 bouncer2.interval(5) ;              // stable interval = 5 мс
 bouncer3.attach(B_MAX) ;   // Button A7
 bouncer3.interval(5) ;              // stable interval = 5 мс

 pulseHigh(RESET);
 pulseHigh(W_CLK);
 pulseHigh(FQ_UD);  // thin pulse enables serial mode

 start() ; 

}

void loop(){
  KBD_But() ;
  F_Change() ;
  KBD_But() ;
  lcd.setCursor(0, 1) ; // Cursor on 1 column 2 row
  lcd.print("\2"); lcd.print("e"); lcd.print("\4");
  lcd.print(": "); lcd.print(fr_2); lcd.print(" ") ;
  lcd.print("\2"); lcd.print("\3");
  if (fr_1 != fr_2) {fr_1 = fr_2; sendFrequency(fr_1);}
}

void start() {
       lcd.begin(16, 2); // LCD 1602
       lcd.createChar(1, sym1) ;
       lcd.createChar(2, sym2) ;
       lcd.createChar(3, sym3) ;
       lcd.createChar(4, sym4) ;
       lcd.setCursor(12-current_mode, 0) ; // Cursor on 13 column 1 row
       lcd.print("\1") ;  // Arrow down
       lcd.setCursor(0, 1) ; // Cursor on 1 column 2 row
       lcd.print("\2"); lcd.print("e"); lcd.print("\4");
       lcd.print(": "); lcd.print(fr_2); lcd.print(" ") ;
       lcd.print("\2"); lcd.print("\3");
       sendFrequency(fr_1);
       digitalWrite(LED_PIN, LOW);
 }

void KBD_But() {
  do {
  bouncer1.update();
  bouncer2.update();
  bouncer3.update();
  }
  while ((bouncer1.read() == HIGH) && (bouncer2.read() == HIGH) && (bouncer3.read() == HIGH));
}

void F_Change() {
 bouncer1.update();
  // если произошло событие
  if (bouncer1.read() == 0)
  { //если кнопка B_MIN нажата
    if (current_mode == 0) {fr_2 = fr_2 - 1 ;}
    if (current_mode == 1) {fr_2 = fr_2 - 10 ;}
    if (current_mode == 2) {fr_2 = fr_2 - 100 ;}
    if (current_mode == 3) {fr_2 = fr_2 - 1000 ;}
    if (current_mode == 4) {fr_2 = fr_2 - 10000 ;}
    if (current_mode == 5) {fr_2 = fr_2 - 100000 ;}
    if (fr_2 < 40000000) {fr_2 = 40000000;}
    delay(300);
   }
 bouncer2.update();
  // если произошло событие
  if (bouncer2.read()==0)
  { //если кнопка B_NP нажата
    current_mode++;
    if (current_mode > 5) {current_mode = 0;}
    lcd.setCursor(0, 0);
    lcd.print("                ");
    lcd.setCursor(12-current_mode, 0) ; // Cursor on 13 column 1 row
    lcd.print("\1") ;  // Arrow down
   delay(300);
  }
 bouncer3.update();
  // если произошло событие
  if (bouncer3.read()==0)
  { //если кнопка B_MAX нажата
    if (current_mode == 0) {fr_2 = fr_2 + 1 ;}
    if (current_mode == 1) {fr_2 = fr_2 + 10 ;}
    if (current_mode == 2) {fr_2 = fr_2 + 100 ;}
    if (current_mode == 3) {fr_2 = fr_2 + 1000 ;}
    if (current_mode == 4) {fr_2 = fr_2 + 10000 ;}
    if (current_mode == 5) {fr_2 = fr_2 + 100000 ;}
    if (fr_2 > 41000000) {fr_2 = 41000000;}
   delay(300);
  }  
 }

Ссылки:

  1. Mixed-signal and digital signal processing ICs | Analog Devices. Электронный ресурс: http://www.analog.com . Доступен по состоянию на 26.08.2019.
  2. Аппаратная платформа Ардуино | Arduino.ru. Электронный ресурс: http://arduino.ru . Доступен по состоянию на 16.12.2017.
  3. Ред Э. Справочное пособие по высокочастотной схемотехнике: Схемы, блоки, 50-омная техника: Пер. с нем. - М.: 1990. - 256 с., ил.

Словарь терминов:

28.08.2019


Альтернативные источники энергии
Компьютеры и Интернет
Магнитные поля
Механотронные системы
Перспективные разработки
Электроника и технология

Главная страница



 

 

 

 

 

 

 

 

 

 

 

 

Hosted by uCoz