AVR DDS signalų generatorius

Dažnai gaminant ar derinant įvairią elektroninę aparatūrą prisireikia paprasto signalų generatoriaus. Vienas variantas yra nusipirkti kokybišką gaminį su įvairiomis funkcinėmis galimybėmis, o kitas labiau priimtinas mėgėjams – tai pačiam pasigaminti. Šis projektukas skirtas tokio generatoriaus gamybai naudojant minimalų elementų kiekį ir turimas dalis.

LCD_Panel.jpg

Specifikacija

AVR signalų generatorius susideda iš keleto paprastų dalių:

  1. Atmel firmos Atmega8 8 bitų mikrovaldiklio;
  2. Maitinimo elemento ir įtampos reguliatoriaus;
  3. 2×16 standartinio LCD ekrano valdomo per poslinkio registrą 74HC164;
  4. 7 valdymo mygtukų;
  5. R-2R kodas analogas keitiklio;
  6. Trijų išėjimų: universalaus (OUT) – per DAC, PWM, ir impulsų(SQ);
  7. Metalinės dėžutės;
  8. Mikrovaldiklio valdymo programos.

Atmega8 mikrovaldiklis yra paprasčiausias ir pigiausias iš AVR Mega serijos. Flash atminties kiekis yra pakankamas tokio tipo užduočiai realizuoti – 8kb. Maksimalus taktinis dažnis siekia 16MHz, kuris ir yra panaudotas šiame generatoriuje siekiant didžiausio greičio.

Generatorius yra maitinamas 9V elementu. 7805 įtampos reguliatoriumi įtampa ya nužeminama ir stabilizuojama iki 5V kuri yra reikalinga AVR mikrovaldikliui maitinti.

LCD ekranas yra valdomas per nuoseklų-lygiagretų poslinkio registrą 74HC164. Tokiu atvejų yra panaudojami tik 3 mikrovaldiklio išvadai persiųsti duomenis į poslinkio registrą, kuris savo ruožtu išlygiagretina valdymą iki LCD 8 bitų režimo.

Generatoriuje yra naudojami 7 valdymo mygtukai:

  • Start;
  • Stop, kuris yra RESET mygtukas;
  • UP – reikšmės didinimo;
  • DOWN – reikšmės mažinimo;
  • Mode1 – signalo išrinkimo mygtukas;
  • Mode2 – signalo savybių išrinkimo mygtukas;
  • Freq – signalo dažnio eilės išrinkimo mygtukas.

Generatoriuje yra naudojamas paprastas R-2R kodas analogas keitiklis. Tai yra paprasčiausias sprendimas naudojant laiptuotą rezistorių jungimą:

R_2R.png

Čia R=10kΩ. Naudojant 8 bitus ir 5V gaunami laipteliai yra apie 18,5mV. Tai yra pakankamos reikšmės gauti kokybiškus signalus.

Generatoriuje yra suprojektuoti 3 atskiri išėjimai:

  • Universalaus (OUT) per R-2R DAC;
  • PWM;
  • Impulsų(SQ);

Universalus išėjimas (OUT) tai signalo išėjimas naudojant DAC grandinę. Šis išėjimas naudojamas įvairių signalų (stačiakampių, pjūklo formos, trikampio, sinusoidės) išvedimui.

PWM signalo kanalas yra skirtas atskirai PWM signalui išvesti naudojant taimerio funkciją. Taip pat galima šį įėjimą naudoti greitų impulsų išvedimui naudojant tą patį taimerį.

SQ papildomas kanalas yra skirtas taip pat impulsų išvedimui kai pirmas PWM kanalas užimtas.

PWM ir SQ palikti realizuoti ateičiai!

Blokinė AVR DDS generatoriaus schema

AVR_DDS_Blokine.png

Blokinėje schemoje matyti generatoriaus struktūra bei įvairių signalų kelias. Kiekvienas blokas daugiau mažiau yra aprašytas specifikacijose.

Meniu valdymas ir programos būsenos

Zr.: menu.pdf

Principinė schema ir PCB

sch.png

Principinėje schemoje matome detalų generatoriaus vaizdą. Prie mokrokontrolerio jungiam:

  • R-2R kodas analogas keitiklis jungiamas prie mikrovaldiklio D porto 0..7 išvadų.
  • Poslinkio registro duomenų įėjimas jungiamas prie C porto išvado0.
  • Poslinkio registras sinchronizuojamas C porto 1 išvadu;
  • C porto 2 išvadas tiesiogiai valdo LCD ekrano E įėjimą;
  • Start mygtukas prijungtas prie B porto 0 išvado;
  • Stop – atitinka reset mygtuką;
  • Up mygtukas prijungtas prie B porto 3 išvado;
  • Down mygtukas prijungtas prie B porto 4 išvado;
  • Mode1 mygtukas prijungtas prie C porto 3 išvado;
  • Mode2 mygtukas prijungtas prie C porto 4 išvado;
  • Freq mygtukas prijungtas prie C porto 5 išvado;
  • SQ signalo išėjimas prijungtas prie prijungtas prie B porto 2 išvado;
  • PWM kanalo išėjimas prijungtas prie B porto 1 išvado.

PCB vaizdas:

pcb.jpg

Keletas nuotraukų:

RealDDS1.JPG

plain_buttons.jpg

PCB_In_Box.jpg

Assembled1.jpg

Button_Panel.jpg

Detalių sąrašas (eksportuotas iš eagle):

Qty Value Device Parts
1 78MXXL 7805
2 CPOL-EUE5-4 C1, C9
12 PINHD-1X2 9V, DOWN, FREQ, MODE1, MODE2, OUT, POWER, PWM, RESET, SQ, START, UP
1 PINHD-1X14 LCD2X16
1 PINHD-2X3 ISP
1 TRIM_EU-B64W POT
5 0.1u C-EUC0805 C2, C3, C4, C5, C8
8 10k R-EU_M0805 R6, R8, R10, R12, R14, R16, R18, R23
1 10k R-EU_V526-0 R2
1 16M CRYTALHC49S Q1
2 18pF C-EUC0805 C6, C7
9 20k R-EU_M0805 R4, R5, R7, R9, R11, R13, R15, R17, R19
1 74AC164N 74AC164N IC2
1 100 R-EU_M0805 R3
1 ATMEGA8-16P ATMEGA8-16P IC1

Naudoti Įrankiai

Projekto tikslui pasiekti naudojami šie įrankiai:

Programos:

Techninės priemonės:

  • Detalės (Atmega8, plokštė dengta fotorezistu, dėžutė,…);
  • UV apšvitinimo įrenginys;
  • Plokščių ėsdinimo įrenginys;
  • Ryškalai;
  • Ėsdiklis;
  • Lituoklis 🙂
  • Programatorius AVR ISP;
  • kiti įrankiai…

Programos rašymas

Programa parašyta naudojant C kalbą ir sukompiliuota naudojant WinAVR20060421 įrankius. Programavimas atliekamas naudojant ISP programatorių bei PonyProg programą.

Programos eiga keliais žodžiais:

Įjungus generatorių:

  • Pirmiausia yra inicijuojamas LCD ekranas;
  • Nuskaitoma iš vidinės EEPROM atminties prieš tai buvę nustatymai ir būsena atvaizduojama LCD ekrane.
  • Mygtukais galima pakeisti generatoriaus nustatymus arba iš karto spausti Start kad pradėti signalų generavimą. Paspaudus start mygtuką pirmiausia yra išsaugoma generatoriaus būsena EEPROM atmintyje(jeigu buvo padaryta pakeitimų), po to generavimo informacija išvedama į LCD ekraną ir tik po to pradedamas signalų generavimas;
  • Generatorius sustabdomas paspaudus Stop mygtuką, kuris įvykdo mikrovaldiklio pertraukimą. Po Stop signalo įvykus pertraukimui, generatorius vėl nusistato į prieš tai buvusią būseną nuskaitydamas reikšmes iš EEPROM atminties.

EEPROM Atmintyje organizuojami tokie duomenys:

Addres

Value

0 Mode
1 Freq[7…0]
2 Freq[15…8]
3 Freq[23…16]
4 Duty [%]
5 Other reserved for future
6… Other reserved for future.

Mode reikšmės:

  • 0 – OUT_|¯|_;
  • 1 – OUT|/|/|;
  • 2 – OUT|||;
  • 3 – OUT///;
  • 4 – OUT~~~~;
  • 5 – OUT-NOISE;
  • 20 – PWM-OCC;
  • 21 – PWM-SINMDS;
  • 22 – PWMSQSMDS;
  • 23 – PWM-CMDS;

Freq reikšmės. Pasirinkti 3 EEPROM laukai po 8 bitus nes dažnis neviršys 16MHz kuris atitinka šešioliktainį skaičių 0xF42400.

Freq[23…16]

Freq[16…8]

Freq[7…0]

Duty reikšmės nuo 1 iki 99 išreikštos procentais,

Poliarumas 0 – atitinka teigiamą poliarumą, o 1 – neigiamą.

Programos Struktūra:

LCD_3w.h – LCD nustatymai

LCD_3w.c failas kuriame yra šios funkcijos:

  • void sendByteToRegister(uint8_t);
  • void LCDenableCommand(void);
  • void LCDdisableCommand(void);
  • void LCDenableData(void);
  • void LCDdisableData(void);
  • void LCDsendChar(uint8_t); //forms data ready to send to 74HC164
  • void LCDsendCommand(uint8_t); //forms data ready to send to 74HC164
  • void LCDinit(void);
  • void LCDwritebyte(uint8_t, uint8_t);
  • void LCDdefinechar(const uint8_t* ,uint8_t);
  • void LCDclr(void);
  • void LCDhome(void);
  • void LCDstring(uint8_t*, uint8_t);
  • void LCDGotoXY(uint8_t, uint8_t);

signal.c – pagrindinėsje programoje yra:

  • Aprašomos signalų lentelės kurios saugomos vidinėje flash atmintyje;
  • Aprašomi LCD tekstai;
  • EEPROM inicializavimas;
  • Parametrų keitimo procedūros;
  • Signalų generavimo procedūra (aprašyta in line ASM).

Testavimas

Pagrinde testavimas buvo atliekamas naudojant minėtą signalų generatorių, dažnomatį ir osciloskopą. Buvo išmatuotas dažnis per visą dažnių intervalą kuris yra leidžiamas nuo 1Hz iki 65535Hz (galima ir daugiau, tik rezoliucija kenčia). Generuojamas dažnis atitiko dažnomačio parodymus. Oscilloscopo vaizdai matomi sekančiose nuotraukose.

sine_signal.jpgSquare_signal.jpg

sawtooth_signal.jpgtriangle_signal.jpg

Kaip ir minėjau tai yra gana ribotų galimybių generatorius. Kol kas dalis funkcionalumo nesutvarkyta (įskaitant PWM). Tačiau generatorius pilnai generuoja pagrindinius signalus – sinusoidę, stačiakampio, trikampio, pjūklo formos signalus. Taip pat yra užprogramuotas paprastas triukšmo generatorius naudojantis rand() funkciją. Didžiausias šio generatoriaus trūkumas yra tas, kad kad signalai yra generuojami tokie kokie jie yra- tiesiai per varžų suformuotą KKA (DAC). Kad generatorius būtų pilnai funkcionalus reikėtų pritaikyti operacinuką su reguliuojamu stiprinimu. Stiprinimas galėtų būti valdomas paties skaitmeniškai valdant išėjimo amplitudę LCD meniu. Išėjimo įtampa būtų nuskaitoma su DAC taip sudarant grįžtamąjį ryšį.

Projekto bylos: avr_dds_v10.zip

Skelbta Elektronika Pažymėti: , ,
5 comments on “AVR DDS signalų generatorius
  1. x parašė:

    sveiki , su programavimu esu pasipykes, be reikalingas toks dalykas kaip programa (tik pjuklo signalui be lcd, gal galetu kas padeti ir ja isskirti?) buciau dekingas. naudojamas toks pat procikas ir r-2r kopeteles prie tu paciu pinu.

  2. admin parašė:

    Kokio dažnio reikia? Uždėjus vėlinimą galima dažnį koreguoti.
    Paprasčiausias variantas su ASM AVRStudio aplinkoje.

    .INCLUDE “m8def.inc”
    .DEF tmp = R16 ; Multipurpose register
    ldi tmp,0xFF; Set all pins of Port D as output
    out DDRD,tmp
    sawtooth:
    out PORTD,tmp
    inc tmp
    rjmp sawtooth

  3. Saulius parašė:

    Labas. Puikus generatorius, tik noriu sužinoti ar galima generuojant signalą keisti dažnį, ar norint pakeisti dažnį jis sustoja. Man aktualu kad galėčiau per  tam tikrą diapazoną važinėti ukštyn-žemyn.

     

  4. admin parašė:

    Ne, šiame generatoriuje nėra tokios galimybės.

  5. Kirvis parašė:

    niekaip nepaleidziu ekraniuko. Pats veikia ta prasme signala generuoja,neveikia tik ekraniukas.Patikrinau jis pats sveikas,cd74ac164e mikroschema ir pakeiciau jau kelias, kontaktai geri. Gal kas buvot susidure su ta problema? 

Parašykite komentarą