AVR DDS signalų generatorius
Pirminės kortelės
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.

Specifikacija
AVR signalų generatorius susideda iš keleto paprastų dalių:
- Atmel firmos Atmega8 8 bitų mikrovaldiklio;
- Maitinimo elemento ir įtampos reguliatoriaus;
- 2x16 standartinio LCD ekrano valdomo per poslinkio registrą 74HC164;
- 7 valdymo mygtukų;
- R-2R kodas analogas keitiklio;
- Trijų išėjimų: universalaus (OUT) – per DAC, PWM, ir impulsų(SQ);
- Metalinės dėžutės;
- 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ą:

Č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

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
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:

Keletas nuotraukų:




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:
- PonyProg arba AVRDude.
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.




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
- Komentuoti
- Citavimas
- 9871 peržiūra

Komentarai
sveiki , su programavimu esu
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.
Kokio dažnio reikia? Uždėjus
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
Labas. Puikus generatorius,
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.
Ne, šiame generatoriuje nėra
Ne, šiame generatoriuje nėra tokios galimybės.
Komentuoti