Лабораторный генератор сигналов на dds

Автор работы: Пользователь скрыл имя, 29 Января 2013 в 20:02, курсовая работа

Описание

Целью работы является изучение лабораторного генератора сигналов на DDS.
Данная цель конкретизируется решением взаимосвязанных задач:
1. охарактеризовать выбор темы и элементной базы.
2. сделать расчетную работу.
3. разработать печатную плату и спрограммировать.

Содержание

Введение
1. Выбор темы
2. Выбор элементной базы
3. Расчетная часть
4. Разработка печатной платы
5. Программирование
Заключение
Список литературы

Работа состоит из  1 файл

ЛАБОРАТОРНЫЙ ГЕНЕРАТОР СИГНАЛОВ НА DDS.doc

— 1.03 Мб (Скачать документ)

Катушки L1 и L2 индуктивностью 6 мкГн можно намотать проводом ПЭВ-2 диаметром 0,15...0,2 мм на ферритовых кольцах с начальной магнитной проницаемостью 100...400 и внешним диаметром 5...7 мм. Число витков лучше подобрать экспериментально с помощью измерителя индуктивности или добиваясь резонанса параллельного контура, составленного из катушки и конденсатора емкостью 51 пФ, на частоте около 10 МГц. На плате предусмотрена и возможность установки готовых катушек индуктивности в оформлении для поверхностного монтажа. Контактные площадки для них обозначены L1' и L2'. Дроссель L3 —ДМ-0,1.

Некоторые резисторы, как показано на рис. 4, смонтированы непосредственно на выводах переменных резисторов, кнопок и переключателей, размещенных на верхней крышке корпуса генератора. Конденсатор С15 составлен из двух меньшей емкости, соединенных параллельно. Также из двух параллельных резисторов составлен резистор R27.

Трансформатор Т1 должен давать напряжение 2x12 В при токе 100 мА. Переменный резистор R14 — СП5-20ВБ. Увеличивать его номинал более 1,5 кОм не следует, это приведет к  сильной зависимости амплитуды  выходного сигнала от частоты.

Налаживание генератора заключается в установке подстроечным резистором R4 симметричного относительно нуля синусоидального напряжения на верхнем по схеме выводе переменного  резистора R14. При необходимости  максимальную амплитуду сигнала на выходе генератора можно изменить подборкой резистора R21, а пределы регулирования его постоянной составляющей — подборкой резистора R19.

Теоретически максимальная генерируемая DDS частота равна половине тактовой. На практике выше 1/4 тактовой частоты начинается резкий спад амплитуды сигнала, который в какой-то степени можно скомпенсировать, усложняя выходной фильтр. Но налаживание генератора при этом также резко усложнится. В данной конструкции максимальная частота выбрана равной 6 МГц. Однако учитывая, что радиолюбители предпочитают реализовывать возможности своих приборов по максимуму, программа микроконтроллера позволяет установить частоту и 11 МГц, но амплитуда и форма выходного сигнала при этом не гарантируются.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5. Программирование

 

В программной части  проекта, для реализации DDS метода, нам  понадобится 4 вещи:

аккумулятор и tuning word, который  в нашем случае состоит из двух long integer переменных;

таблица значений синусоидального  сигнала (один период);

цифро-аналоговый преобразователь, который обеспечивается внутренним ШИМ Arduino (analogWrite);

генератор тактовых импульсов (используем внутренний hard-таймер от ATMega).

Большинство значащих байт аккумулятор используется для адресов  таблицы синусоидального сигнала. Весь циклический процесс, работает по прерыванию от внутреннего тактового генератора.

Для работы данного скетча на Arduino Diecimila или Duemilenove подключите потенциометр к аналоговому выводу 0 и к GND и +5В. Выход генератора находится на выводе 11, куда вы можете подключить активные колонки, или ФНЧ фильтр описанный ниже.

/*

*

* DDS Sine Generator mit ATMEGS 168

* Timer2 generates the  31250 KHz Clock Interrupt

*

* KHM 2009 /  Martin Nawrath

* Kunsthochschule fuer Medien Koeln

* Academy of Media Arts Cologne

*/

#include "avr/pgmspace.h"

// table of 256 sine values / one sine period / stored in flash memory

PROGMEM  prog_uchar sine256[]  = {

127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,

242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,

221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,

76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,

33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124

};

#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))

#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))

int ledPin = 13;                 // LED pin 7

int testPin = 7;

int t2Pin = 6;

byte bb;

double dfreq;

// const double refclk=31372.549;  // =16MHz / 510

const double refclk=31376.6;      // measured

// variables used inside interrupt service declared as voilatile

volatile byte icnt;              // var inside interrupt

volatile byte icnt1;             // var inside interrupt

volatile byte c4ms;              // counter incremented all 4ms

volatile unsigned long phaccu;   // pahse accumulator

volatile unsigned long tword_m;  // dds tuning word m

 

void setup()

{

  pinMode(ledPin, OUTPUT);      // sets the digital pin as output

  Serial.begin(115200);        // connect to the serial port

  Serial.println("DDS Test");

  pinMode(6, OUTPUT);      // sets the digital pin as output

  pinMode(7, OUTPUT);      // sets the digital pin as output

  pinMode(11, OUTPUT);     // pin11= PWM  output / frequency output

  Setup_timer2();

  // disable interrupts to avoid timing distortion

  cbi (TIMSK0,TOIE0);              // disable Timer0 !!! delay() is now not available

  sbi (TIMSK2,TOIE2);              // enable Timer2 Interrupt

  dfreq=1000.0;                    // initial output frequency = 1000.o Hz

  tword_m=pow(2,32)*dfreq/refclk;  // calulate DDS new tuning word

}

void loop()

{

  while(1) {

     if (c4ms > 250) {                 // timer / wait fou a full second

      c4ms=0;

      dfreq=analogRead(0);             // read Poti on analog pin 0 to adjust output frequency from 0..1023 Hz

       cbi (TIMSK2,TOIE2);              // disble Timer2 Interrupt

      tword_m=pow(2,32)*dfreq/refclk;  // calulate DDS new tuning word

      sbi (TIMSK2,TOIE2);              // enable Timer2 Interrupt

       Serial.print(dfreq);

      Serial.print("  ");

      Serial.println(tword_m);

    }

 

   sbi(PORTD,6); // Test / set PORTD,7 high to observe timing with a scope

   cbi(PORTD,6); // Test /reset PORTD,7 high to observe timing with a scope

  }

}

//******************************************************************

// timer2 setup

// set prscaler to 1, PWM mode to phase correct PWM,  16000000/510 = 31372.55 Hz clock

void Setup_timer2() {

// Timer2 Clock Prescaler to : 1

  sbi (TCCR2B, CS20);

  cbi (TCCR2B, CS21);

  cbi (TCCR2B, CS22);

  // Timer2 PWM Mode set to Phase Correct PWM

  cbi (TCCR2A, COM2A0);  // clear Compare Match

  sbi (TCCR2A, COM2A1);

  sbi (TCCR2A, WGM20);  // Mode 1  / Phase Correct PWM

  cbi (TCCR2A, WGM21);

  cbi (TCCR2B, WGM22);

}

//******************************************************************

// Timer2 Interrupt Service at 31372,550 KHz = 32uSec

// this is the timebase REFCLOCK for the DDS generator

// FOUT = (M (REFCLK)) / (2 exp 32)

// runtime : 8 microseconds ( inclusive push and pop)

ISR(TIMER2_OVF_vect) {

  sbi(PORTD,7);          // Test / set PORTD,7 high to observe timing with a oscope

  phaccu=phaccu+tword_m; // soft DDS, phase accu with 32 bits

  icnt=phaccu >> 24;     // use upper 8 bits for phase accu as frequency information

                         // read value fron ROM sine table and send to PWM DAC

  OCR2A=pgm_read_byte_near(sine256 + icnt);  

  if(icnt1++ == 125) {  // increment variable c4ms all 4 milliseconds

    c4ms++;

    icnt1=0;

   } 

cbi(PORTD,7);            // reset PORTD,7

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Заключение

 

Генератор синусоидального  сигнала является одним из наиболее распространенных приборов в любой  измерительной лаборатории. Генераторы сигналов промышленного производства имеют большие габариты, вес и довольно высокую стоимость. С появлением микросхем прямого синтеза частоты DDS (Direct Digital Synthesizer) появилась возможность изготовить генератор синусоидальных сигналов, имеющий довольно высокие параметры при относительно простой схеме и конструкции.

Генератор позволяет  плавно перестраивать частоту в  диапазоне 0,1 Гц...6 мГц с шагом 0,1 Гц...1 мГц, амплитуда может регулироваться от 0 до 7 В. Возможно смещение выходного  напряжения относительно нуля в пределах до +/- 5 В. В генераторе использована одна из самых дешевых микросхем прямого синтеза частоты – AD9832 с тактовой частотой 25 мГц. Управляющий контроллер PIC16F84 или PIC16F628. Установленная частота и период отображаются на ЖКИ индикаторе.

 Принципиальная схема  лабораторного генератора сигналов на DDS показана на рисунке. Выходной сигнал с микросхемы DDS генератора проходит через пассивный LC фильтр c частотой среза 10 мГц, который улучшает спектр сигнала, фильтруя высшие гармоники. Поскольку микросхема DDS работает с однополярным питанием, необходима схема сдвига уровня. Она выполнена на «ОУ с активной обратной связью» типа AD8130. Кроме сдвига уровня на этом ОУ реализован активный фильтр нижних частот второго порядка с частотой среза 10 мГц и коэффициентом передачи 2, который дополнительно подавляет высшие гармоники.

Отфильтрованный и симметричный относительно нуля сигнал с выхода ОУ подается на регулятор амплитуды - обычный переменный резистор. Применение обычного резистора, а не электронного аттенюатора обусловлено стремлением  упростить и удешевить конструкцию. Да и в практической работе гораздо удобнее поворачивать ручку, а не заходить в меню, многократно нажимая кнопки. Хотя выходной ток AD8130 может достигать 40 мА, длительная работа с таким током приведет к перегреву и выходу из строя кристалла. Поэтому в схему введен дополнительный защитный резистор R26, который ограничивает выходной ток до безопасного уровня даже при длительном коротком замыкании выхода. При работе на низкоомную нагрузку этот резистор можно закоротить тумблером SA2.

Работой генератора прямого  синтеза управляет микроконтроллер DD1. Индикатор HG1 – двухстрочный по 16 символов в строке на основе контроллера HD44780. В нижней строке отображается частота с точностью до 0,1 Гц. Ввод требуемого значения частоты осуществляется кнопками SB1…SB4. Можно плавно перестраивать DDS генератор в диапазоне частот 0,1 Гц...6 мГц с любым шагом из ряда 0,1 Гц; 1 Гц; 10 Гц;...1 мГц. В верхнюю строку индикатора выводится период в микросекундах для частот менее 300 Гц или в наносекундах для частот более 300 Гц.

Программа работает следующим  образом. Вначале, исходя из введенной  частоты, рассчитываются значения коэффициентов, загружаемых в DDS синтезатор. Затем  по этому значению производится расчет периода генерируемой частоты. Результат, особенно на частотах менее 10 Гц, может несколько отличаться от того, который получился бы при расчете по формуле T=1/F. Это связано с тем, что частота в DDS синтезаторе может быть установлена не любая, а только с шагом FMCLK/2^32. Для тактовой частоты 25 мГц это около 0,006 Гц. Вопреки широко распространенному мнению о примитивности и несовершенстве системы команд PIC контроллеров двух килобайт внутренней памяти и 35 команд вполне достаточно для проведения всех расчетов без каких-либо упрощений и округлений. Поэтому точность установки частоты определяется только точностью и стабильностью тактового генератора DDS. Разработаны варианты программы для тактовой частоты 25 и 20 мГц.

Монитор питания DA1 использован  не стандартно. В PIC контроллерах, в  отличие от некоторых AVR, внутренняя память не склонна к искажению при медленном нарастании или снижении напряжения питания. Поэтому принимать специальные меры для внешнего сброса контроллера при включении и выключении нет необходимости. Монитор питания подключен к выводу порта RB0 и служит для подачи команды контроллеру на сохранение установленной частоты в EEPROM PIC при снижении напряжения питания ниже 4,7 В

В генераторе можно использовать как устаревший, но широко распространенный контроллер PIC16F84A, так и более новый, имеющий аналогичную цоколевку PIC16F628. Индикатор HG1 типа MT 16S2Q-2YLG производства фирмы МЭЛТ. Теоретический предел генерируемой частоты в DDS равен половине тактовой. На практике на частотах выше 1/4 тактовой начинается резкий спад амплитуды первой гармоники, который в какой-то степени можно скомпенсировать усложнением схемы фильтра. Но настройка генератора сигналов при этом резко усложняется, поэтому в данной конструкции верхняя частота принята равной 6 мГц. Однако, учитывая, что радиолюбители предпочитают реализовывать возможности своих приборов по максимуму, программно верхняя рабочая частота DDS генератора ограничена значением 11 мГц.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Список литературы

 

      1. DDS-технологии и передача сигналов // Техника молодежи. - 2008. - № 4.
      2. Давыдов А.В. Сигналы и линейные системы: Тематические лекции. - Екатеринбург: УГГУ, 2006.
      3. Кучумов А.И. Электроника и схемотехника. - М.: Гелиос АРВ, 2004.
      4. Мышляева И.М. Цифровая схемотехника. - М.: Академия, 2005.
      5. Сергиенко А.Б. Цифровая обработка сигналов. - СПб.: Питер, 2003.
      6. Тарабрин Б.В. Справочник по интегральным микросхемам. - М.: Радио и связь, 2011.
      7. Хлюпин Н. Лабораторный генератор сигналов на DDS // Радио. - 2009. - № 8.

Информация о работе Лабораторный генератор сигналов на dds