AVR DDS signalų generatorius V2.0

Tikriausiai pamenate pirmąjį AVR DDS V1.0 signalų generatorių, kuris buvo sukonstruotas labiau pabandymui – ką galima išspausti naudojant paprastą AVR Atmega8 mikrokontrolerį. Labiausiai jam trūko signalo amplitudės valdymo išėjime bei valdymo patogumo.

Taigi įvertinus pirmtako trūkumus gimė antrasisi AVR DDS generatoriaus prototipas. Nepaisant didesnio funkcionalumo ir patogumo, norėjosi kad prietaiso gamyba būtų paprasta naudojant plačiai paplitusius elektronikos komponentus bei vienpusę PCB plokštę.

AVR DDS generatorius V2.0

AVR DDS savybės

AVR DDS signalų generatorius V2.0 veikia programinio (modifikuota Jesper’s DDS) DDS algoritmo pagalba. Pagrindinė signalo generavimo funkcija yra parašyta asembleriu, kuri yra įterpta į AVR-GCC programą. Taip yra gaunamas pats didžiausias įmanomas greitis ir pilna laikinių parametrų kontrolė, nepriklausanti nuo kompiliatoriaus.

Prietaisas turi du išėjimus – vieną DDS signalui, kitą aukšto dažnio(HS) [1..8MHz] impulsams, kurie, pavyzdžiui, gali būti naudojami AVR mikrokontrolerių atgaivinimui jei netyčia buvo klaidingai nusatatyti fuse bitai. Aukšto dažnio signalai yra išvedami tiesiai nuo Atmega16 OC1A(PD5) išvado. Taigi fiksuota amplitudė artimą maitinimo įtampai – 5V. DDS išėjimas yra naudojamas sudėtingiems signalams. Jie yra generuojami per paprastą DAC keitiklį sudarytą iš R2R varžų grandinės. Signalo kompensacija (balansas) ir amplitudė yra reguliuojami LM358N operacinių stiprintuvų ir dviejų potenciometrų pagalba. Signalo balansas gali būti reguliuojamas -5V..+5V ribose, o amplitudė 0..10V ribose. O signalo dažnis gali būti keičiamas ribose nuo 0 iki 65534Hz.

Taigi pagrindinės AVR DDS V2.0 signalo savybės:

  • Paprasta grandinė;
  • Vienpusė PCB;
  • Maitinimas iš 220V AC tinklo;
  • Atskiras aukšto dažnio išėjimas (HS);
  • Reguliuojama signalo kompensacija ir amplitudė;
  • DDS signalai: sunsoidė, stačiakampis, pjūklo, atvirkščio pjūklo, trikampio, ECG, triukšmo;
  • 2×16 LCD meniu;
  • Paprastas valdymas 5 mygtukais;
  • Pasirenkami dažnio keitimo žingsniai: 1, 10, 100, 1000, 10000Hz;
  • Išsaugomas paskutinis nustatymas EEPROM atmintyje.

Blokinėje diagramoje matyti loginė generatoriaus struktūra:

AVR DDS generatorius V2.0 blokinė

Grandinei maitinti reikia keletos įtampų: +5V, -12V, +12V. Kur +12V ir -12V įtampos yra reikalingos operaciniam stiprintuvui maitinti. Įtampos yra gaumamos naudojant paprastą žeminantį įtampos tansformatorių ir keletą įtampos reguliatorių:

 

Maitinimas surinktas ant atskiros plokštės:

 

Galima išsiversti be maitinimo šaltinio, jeigu turite atliekamą kompiuterio maitinimo bloką. Jame yra visos reikalingos įtampos. Patogumo dėlei galima pakeisti molex jungtį kad atitiktų generatoriaus maitinimo jungtį:

 

LCD menu ir valdymas

DDS generatorius valdomas meniu pagalba. Visas valdymas atliekamas naudojant penkis mygtukus

 

Viršutinis ir apatinis mygtukai naudojami vaikščiojimui po signalų meniu, o šoniniai mygtukai keičia signalų dažnį. Paspaudus vidurinį mygtuką – pradedams signalo generavimas; paspaudus dar kartą – generavimas stabdomas. Diagramoje galite matyti visą meniu sistemą:

 

Patogumo dėlei yra dažnio žingsio keitimo meniu. Pasirinkus atitinkamą žingsnio dydį galima dažnį keisti dideliais arba mažais intervalais atliekant tik keletą mygtukų paspaudimų.

Triukšmo generavimas neturi dažnio nustatymų. Čia tiesiog yra naudojamas standartinė rand() funkciją. Tad iki tikro triukšmo gan toloka, bet paprastoms reikmėm pakanka.

Aukšto dažnio išėjime dažnis gali būti vieno iš keturių reikšmių: 1, 2, 4 ir 8MHz.

Schema ir PCB

Generatoriaus schema yra labai paprasta, kur naudojami plačiai paplitę elementai:

  • AVR Atmega16 microcontroleris su16MHz kvarciniu rezonatoriumi;
  • Standartinis HD44780 2×16 LCD ekranas;
  • Iš paprastų varžų suformuota R2R DAC grandinė;
  • Dvigubas mažos galios LM358N operacinis stiprintuvas;
  • Du potenciometrai;
  • 5 mygtukai;
  • Keletas jungčių ir lizdų.

Schema:

 

ir vienpusė plokštė:

 

Gamyba

Generatorius buvo surinktas į paprastą plastikinę dėžutę:

 

Pirmas bandymas:

 

AVR DDS 2.0 Programos rašymas

Kaip minėjau DDS signalas generuojamas naudojant Jesper’s DDS algoritmą. Originalus algoritmas naudoja 9 procesoriaus taktus, tačiau nėra galimybės sustabdyt isignalo generavimo neperkrovus mikrokontrolerio. Todėl į algoritmą buvo įdėtas SPCR registro CPHA bito tikrinimas, kuris nustatomas pertaukimo metu kai yra nuspaudžiamas STOP. Taigi šiuo atveju yra sunaudojami 10 taktų vienai signalo atskaitai sugeneruoti:

 

void static inline Signal_OUT(const uint8_t *signal, uint8_t ad2, uint8_t ad1, uint8_t ad0)

{

asm volatile( „eor r18, r18 ;r18<-0“ „\n\t“

„eor r19, r19 ;r19<-0“ „\n\t“

„1:“ „\n\t“

„add r18, %0 ;1 cycle“ „\n\t“

„adc r19, %1 ;1 cycle“ „\n\t“

„adc %A3, %2 ;1 cycle“ „\n\t“

„lpm ;3 cycles“ „\n\t“

„out %4, __tmp_reg__ ;1 cycle“ „\n\t“

„sbis %5, 2 ;1 cycle if no skip“ „\n\t“

„rjmp 1b ;2 cycles. Total 10 cycles“ „\n\t“

:

:“r“ (ad0),“r“ (ad1),“r“ (ad2),“e“ (signal),“I“ (_SFR_IO_ADDR(PORTA)), „I“ (_SFR_IO_ADDR(SPCR))

:“r18″, „r19“

);

}

 

DDS signalų lentelės turi bųti išsaugomos tam tikrose FLASH atminties srityse, kurių adresai prasideda 0xXX00. Todėl kompiliatorius turi iš anksto žinoti kur saugoti signalų lenteles. Tai yra nurodoma makefile eilutėmis:

 

#Define sections where to store signal tables

LDFLAGS += -Wl,-section-start=.MySection1=0x3A00

LDFLAGS += -Wl,-section-start=.MySection2=0x3B00

LDFLAGS += -Wl,-section-start=.MySection3=0x3C00

LDFLAGS += -Wl,-section-start=.MySection4=0x3D00

LDFLAGS += -Wl,-section-start=.MySection5=0x3E00

LDFLAGS += -Wl,-section-start=.MySection6=0x3F00

 

Visa kita turėtų būti aišku programos kode. Jeigu kils klausimų – klauskite diskusijose.

Testavimas

Signalų generatorius buvo testuotas su oscilografu ir dažnomačiu. Iš pirmo žvilgsnio signalai generuojasi kaip ir tikėtasi visame dažnių ruože nuo 1 iki 65535Hz. Amplitudė ir kompensacija reguliuosi gerai. Svarbu momentas tame yra tame, jei kompensacija yra nustatyta ant ribinės reikšmės, pvz., 5V, tai amplitudės reguliavimo ribos sumažėja iki 5V. Paprasčiausiai 5+5=10V.

Štai keletas oscilogramų su testiniais signalais:

10kHz sinusoidė

1kHz stačiakampis signalas

1 kHz trikampis signalas

1 kHz pjūklo formos signalas

1 kHz atvirkščio pjūklo formos signalas

1 kHz ECG signalas

Triukšmas

1MHz aukšto dažnio signalas

Projektas gali būti tobulinamas. Programiniame lygyje būtų galima pridėti dažnio skanavimą – kuris būtų parankus matuojant audio sistemų dažnines perdavimo charakteristikas ir pan. Taip pat į patobulinimų sąrašą būtų galima įrašyti dažnio keitimą nepetraukiant signalų generavimo, nes šiuo metu, norint pakeisti dažnį tenka sustabdyti generatorių. Iš kitos pusės kiekvienas iš šių patobulinimų ženkliai sumažintų signalo rezoliuciją, nes tektų išnaudoti papildomus mikrokontrolerio taktus mygtukų tikrinimui.

 

Skelbta Elektronika Pažymėti: , ,
4 comments on “AVR DDS signalų generatorius V2.0
  1. Kestas parašė:

    Na susirinkau aš šį generatorių (dar prieš pasirodant jam šioje svetainėje). Bet paaiškėjo, jog jo galinis išėjimas niekam tikęs. ( Dažnį padidinus iki 10 KHz stiprintuvo išėjime atsiranda iškraipymai). Tad gražios oscilogramos tik
    DAC išėjime, o po stiprintuvo iškraipymai . Tad jei kas konstruosite, galinį išėjimą
    Siūlau ieškoti kitose schemose, arba paeksperimentuoti pradžioje ant maketinės.

  2. admin parašė:

    Hmm. Labai daug netestavau, bet kad ir prie maksimalaus 64kHz daznio is „akies“ signalai taisyklingi atrode. Bet gincytis nelabai gincysiuos, nes analoginej daly nesu kietas 😀

  3. admin parašė:

    Turiu osilografa kuris matuoja spektra – bus idomu paziureti sinusoides prie didesnio daznio ka rodo.

  4. Kestas parašė:

    Nereikia net spektro analizatoriaus, net pirmajame paveikslėlyje matosi šių iškraipymų pradžia. Sinusoidės perėjime matosi iškraipymas, t.y. perėjimas nėra tiesus ,o ties viduriu truputi iškrypsta (dažnis kaip tik 10 KHz). Vėliau didinant dažnį sinusoidė paverčiama į pjūklą.

Parašykite komentarą