Direct Digital Synthesis ATMEGA-n

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Avatar
apepee
Újonc
Újonc
Hozzászólások: 3
Csatlakozott: 2011. április 6. szerda, 6:00

Direct Digital Synthesis ATMEGA-n

Hozzászólás Szerző: apepee »

Sziasztok!
Elég kezdő vagyok mikrokontroller programozásban, ettől függetlenül azonnal nagy fába vágnám a fejszémet. DDS "procit" szeretnék gyártani, audió tartományban, 32 vagy 44 kHzig. A célom egy monofón, midis szintetizátort csinálni, mint Jarek AVRSynth-je. http://www.elby-designs.com/avrsynth/avrsyn-about.htm
Hogy miért írom magam és nem töltöm le azt? Fene tudja, szeretem tudni, hogy mi dolgozik az ember keze alatt, meg így csak olyan funkciója lesz, ami nekem kell.
Most ATMEGA8-on dolgozok. Egyenlőre saját 1 Mhz-es saját óráján próbálkozok, 8 Mhz-en fog majd járni.

Nagyon sokmindenhez nem értek. Többek között a megszakításokhoz sem. Ebben kéne segítség. Ha jól értem (amit akarok), megszakításokat kéne használnom.

Most úgy oldom meg a fix órajelet, hogy minden számolási ciklus után várok amíg (Timer0==255) nem lesz. A kimenetet csak ez után állítom be.
Viszont, ha a számolási ciklus valami miatt hosszabb (pl. jön egy input, aminek a frekit növelnie kell) és kifutok a timer0 idejéből, a frekvencia lefeleződik.
Van erre megoldás?
Timer1-et használjam?

A Timer0 azért célszerű, mert 8 Mhz/256 az 32kHz, ami tökéletes audió mintavételezés.

Kimenet: PortD 8 biten, R2R létrával. Sima oszciként szépen működik, meg tudom rajzolni a hullámformámat, ami nagyon hasznos, stb...

Valakinek esetleg tapasztalata DDS-ekben?

Üdv!
Pepe
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Hülye kérdés: miért nem célIC?


Kész megoldás:
http://www.elektroda.pl/rtvforum/topic1426199.html


A hullámformák megvannak?



Megszakítás: Bascom leírás-> Megszakítások.... Illetve a Timer fejezet...
http://avr.tavir.hu/modules.php?name=Co ... ies&cid=15
Avatar
apepee
Újonc
Újonc
Hozzászólások: 3
Csatlakozott: 2011. április 6. szerda, 6:00

Hozzászólás Szerző: apepee »

Milyen célIC-k léteznek? Tudom, banális kérdés, miért nem járok utána?

A célom amúgy egy olyan struktúra, ahol két oszcillátor fut, ezután oszcinként DCA 8 bites hangerő, majd DCF filter is dolgozzon. Tehát nem sima oszcit, hanem végülis virtual-analog szintiprogramot szeretnék.
Ami nagyrész működik is, leszámítva ezt a frekifelezős dolgot.

A megszakítós tanodát köszönöm, azt hiszem sejtem, hogy akarom megcsinálni. Még annyi lesz, hogy midi-nek is kell egy uart megszakítás, de a timer0 megszakítás fog dolgozni erősebb prioritással.
Elvben :)


Amúgy. Oszcik működése:
egy(több) programmemóriában tárolt 32 bytos vektorban tárolom a hullámformá(ka)t. Ez sinus, triangle, saw, pulse, igazán nem bonyolítva (utóbbi kettőt lehet, hogy érdemes átírni függvényre, majd még kitalálom). Illetve így akármilyen hullámformát tudok "rajzolni", ezért jó.

Az oszci gyakorlatilag egy függvény, ami megmondja, hogy melyik időpillanatban (órajel/256) a vektorból melyik értéket vegye fel. (Frekiváltáskot fáziskorrekció, stb...).
Ezután az egészet megszorzom egy Amp byte-al, amit egy függvény generál (ADSR szerű). Ez működik, de amíg nyomvatartom a gombot, addig nem férek bele a timer0 túlcsordulásába, a frekvencia feleződik, ha elengedem, akkor normális.

A tervem most úgy futtatni, hogy a kimenetre való másolást és a számláló (ami órajel/256-al lépked) léptetését megszakításban kezelni. Ekkor tuti, hogy nem akadhat meg, mert az mindig lefut, csak maximum egy samplét késik az adat (minimális fáziscsúszás, asszem nem lesz zavaró). De ez még csak elv.

Jól gondolom? :)

Holnap hozok részleteket a kódból, ugyan GCC-ben készült, akkor tudok "konkrétabbat" kérdezni, illetve hozok hangmintákat is.

Még egy kérdés, 8 bites kimenet bőven elég nekem. Mi gyorsabb az AVR-nek, kijönni 8 lábon és R2R létrát használni, vagy OCR regiszterbe másolni és PWM-et használni szűrővel analóg kimenetnént, esetleg külső soros DAC IC-t használni (ezt nem szeretnék :))?

Kösz mindent!
Pepe
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Erősebb megszakítás: Na ilyen NINCS. A megszakítások 1 szintűek, és a belépéskor dúl el (prioritás) hogy melyik fut le _előbb_.

De úgyis végig kell rágnod magad rajta :)

CélIC: hírtelen: a AnalogDevicesnek vannak draga IC-i (neha kuldenek mintat). Illetve a Texas Instruments is (1-1 ingyenminta, de illik válaszolni, tapasztalatokat visszaírni...) Különben a mintaküldés megszűnhet.

Hülye tipp: A Yamaha célIC nem egyszerűbb? Az komplett Midi IC! Hullámformástul, mindenestül...


A timer kiírás akkor fut le, ha nincs épp másik megszakításban. Ezért fontos: A megszakításban maradj a lehető legrövidebb!


Én a DAC-os megoldást javasolnám. A PWM alapú nem az igazi, mivel PWMFreQ>>kijövő hangminta, minimum 2-4x. és a kitöltési tényező változása is Timer/beállításfüggő. A DAC meg 2 utasítás, és azonnali (de az ellenállások 0,1% pontosak legyenek!

Vagy MCP DA konverter (van belőle 12 bites.) SPI buszon át hajtható (max 4 MHz órajellel, a max frekvencia ami állítható vele: 220 kHz.
Avatar
apepee
Újonc
Újonc
Hozzászólások: 3
Csatlakozott: 2011. április 6. szerda, 6:00

Hozzászólás Szerző: apepee »

Igen, végig kell rágnom magam rajta :)
Amúgy kösz a segítséget!
PWM-től eddig is kicsit féltem, talán túl misztikus nekem...de tény, hogy magas frekiknek lőttek és szerintem is csak 2-3x-os oversamplinggel működne, mondjuk talán 20 Mhz-s prockóval...De nem bonyolítom, főleg, hogy írod, hogy a PortD állítás is bőven elég gyors!

Még próbálkozom, elsőre használom a félkész megoldásokat (ellesem :))!
Válasz küldése