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 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;
-
2x16 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:

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 2x16 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.
| Prisegtukas | Dydis |
|---|---|
| EagleCAD schema ir PCB | 45.84 KB |
| HEX byla ir WinAVR programos kodas | 120.28 KB |
- 2447 reads


Komentarai
Na susirinkau aš šį
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.
Hmm. Labai daug netestavau,
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 :D
Turiu osilografa kuris
Turiu osilografa kuris matuoja spektra - bus idomu paziureti sinusoides prie didesnio daznio ka rodo.
Nereikia net spektro
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ą.
Skelbti naują komentarą