Софтуерен DDS със схема и коментари
#1
=== Основни данни ===

Функционалният генератор с DDS (Direct Digital Synthesizer) в основата си се състои от брояч, фазов акумулатор и масив с данните за формата на вълната (look-up таблица) (синус, правоъгъллник, триъгълник, произволна). При синусоидални сигнали минималната генерирана честота се изчислява по формулата <math>f_{out} = \frac{f_{clk}}{2^N}</math>  където N е разрядността на фазовия акумулатор. Пример: 20MHz/(2^28) = 0.074Hz. Ако фазовият акумулатор е 16 битов, тогава минималната честота ще бъде 20MHz/(2^16) = 305.17Hz.


Колкото по-голяма е разрядността на фазовия акумулатор, толкова по-ниска изходна честота може да се синтезира. Максималната изходна честота не зависи от увеличението на фазовия акумулатор, защото той се запълва до 2 пъти (поради Найкуист) при максимално висока честота.

Обичайно е фазовият акумулатор да се препълва. То е фундаментална идея в прекия цифров синтез.

   

Изчислението на честотата зависи от стойността на фазовия акумулатор (М). Минимална честота се получава при М=1. При дадена стойност на М може да се установи изходната честота: <math>f_{out} = \frac{Mf_{clk}}{2^N}</math>. Пример: 100*20MHz / 2^16 = 30517.58Hz.

Или да се намери стойността М за конкретна честота: <math>M = \frac{2^Nf_{out}}{f_{clk}}</math>, като стойността му се закръгля.

{{ambox | text = Стоиността М е цяло число.}}

{{mbox | type = warning | text = Максималната изходна честота за различен от синусоидален сигнал обикновено е много по-ниска. Тя зависи от най-високата честота в спектъра на синтезирания сигнал.}}

{{mbox | type = notice | text = За синтезиране на трионообразен сигнал не е необходима look-up таблица. Достатъчно е да се инкрементира стойността на отчета и да се подаде към ЦАП (DAC).}}

{{mbox | type = notice | text = За правоъгълен високочестотен сигнал обикновено се ползва операционен усилвател на изхода от генератора и се извежда по аналогов път от синусоидалния сигнал.}}

В изхода на синтезирания сигнал съществуват огледални съставки (виж прикачената презентация
.pps   DDS_spectrum.pps (Размер: 126 KB / Сваляния: 0) ). Обикновено изходният филтър се проектира с честота на среза 0.45 от честотата на основния клок (например при клок 20MHz -> 0.45*20MHz = 9 MHz). Повишаването на честотата води до сближаване на основния сигнал до първата съставка, т.е. води до изкривявания.

{{mbox | type = notice | text = Възможно е генерирането на по-високи честоти от 0.45*clock, когато се използват огледалните съставки от спектъра на синтезирания сигнал (по подобие на високочестотните кварцови генератори, при които трептенето не е на фундаменталната честота, а на някой от хармониците). }}


   

=== Изходен филтър ===

Обикновено се ползва нискочестотен филтър, освен ако няма специално предназначение за ползване на огледалните спектрални съставки на сигнала.


Максималната изходна честота за синусоидален сигнал е 1/2 от честотата на генератора. Често се взима като коефициент 0.45, тъй като изходния филтър (нискочестотен; low pass) не е идеален и няма безкрайно стръмна характеристика на отрязване.

Проектиране - да се допише!
=== Изпълнение с микроконтролер ===
==== Схема ====
   
==== Примерен код ====
Авторски код в изпълнение с Atmega16L

Код:
/*
fClock = all instr. (10). With 20 MHz Quartz
it is 10*100ns = 1uS. f = 1/T; f = 1/1uS
f = 1 MHz; fdds(max) is 0.45*fClock;
fdds(max) is max up to 450 kHz.  
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
//#include <stdint.h>
#define F_CPU 20E6  //8MHz
#define bit_get(p,m) ((p) & (m))
#define bit_set(p,m) ((p) |= (m))
#define bit_clear(p,m) ((p) &= ~(m))
#define bit_flip(p,m) ((p) ^= (m))
#define bit_write(c,p,m) (c ? bit_set(p,m) : bit_clear(p,m))
#define BIT(x) (0x01 << (x))
#define LONGBIT(x) ((unsigned long)0x00000001 << (x))
void sysinit(void);
void generator(void);
uint32_t somevar;
uint32_t accumulator = 0;
const uint8_t sine[] PROGMEM =
{
0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,
0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5,
0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,
0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc,
0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3,
0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83,
0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51,
0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,
0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,
0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23,
0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c,
0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c
};
int main(void)
   {
   sysinit();
   generator();
   }
void sysinit(void)
   {
   somevar=100000000;
   DDRB=0xFF; //portB ports are outputs
   PORTB=0b00000000; //all ports down
   }
void generator(void)
   {
   while(1)
       {
       accumulator = accumulator+somevar;
       PORTB = pgm_read_byte( &sine[ accumulator >> 24] );
       }
   }

==== Изходен сигнал ====
   

==== Особености при използване на микроконтролер ====
* Клок сигнала се смята, като се сумира времетраенето на всички инструкции в основния цикъл на DDS генераторната функция (инкрементиране на променлива, прочитане на данни от паметта и т.н.).
* Прекъсвания (или друг метод за обработка на входните команди към контролера) ще доведе до изменение на формата на изходния сигнал. Може да се пресметне времето за изпълнение на командата (обработка от бутон, време за изписване на данните на дисплей и т.н.) и да се добави към текущия отчет, за да се установи точното изкривяване на сигнала.

=== Използване на монолитни схеми ===

Съществуват DDS генератори в изпълнение на различни схеми, при които данните за честотата, формата на сигнала, фазата и т.н. се подават чрез сериен или паралелен интерфейс. Подобни схеми са AD9833, AD9851 и т.н. от Analog Devices.

Положителни страни:

* формата на сигнала не зависи от натовареността на управляващия микроконтролер;
* управляващият контролер може да влиза в sleep режими, докато DDS изважда необходимия сигнал - води до понижена консумация;
* може да съдържат вградени PLL, клок генератори и други важни компоненти.

=== Полезни източници ===

* http://www.analog.com/library/analogdial...8/dds.html
* http://pa2ohh.com/04dds1.htm EXPERIMENTAL DIRECT DIGITAL SYNTHESIS BASED ON A MICROCONTROLLER AND PHASE LOCKED LOOP
* http://hem.passagen.se/communication/dds.html
* http://hyperphysics.phy-astr.gsu.edu/hba...c/dac.html
* http://lea.hamradio.si/~s53mv/dds/theory.html - много добро обяснение
* http://free.hit.bg/rkt/pdf/DDS.pdf - теория от курса по радиокомуникационна техника от ТУ-София - на български!
Отговори


Отваряне на:


Потребители разглеждащи темата: 1 гост(и)