Připojení DAC k ATmega8

Ahoj,

rád bych kdyby mi někdo pomohl s připojením DAC k up Atmel ATmega8.
Snažím se zhotovit generátor pseudonáhodných čísel (generátor bíleho šumu). Kdesi jsem našel jakési zapojení s posuvnými registry s následným použitím XOR hradel to vše připojeno na 12bit DAC převodník.

Snažím se realizovat fci. dvou pousuvných registrů a XOR hradel pomocí program ve zmíněném MCU a na výstupy připojit jen DAC (AD7545A).
Na procesoru používám dva porty (6bitů z PC a 6bitů z PD).

Mimochodem vše programuji v AVRstudiu a WINAVR.

Asi nejjednodušší bude shrnout moje otázky do bodů.
a) jakým způsobem mám zajistit zapsání hodnoty na výstupy MCU současně tedy na porty C a D, aby převodník převáděl hodnotu pro všechny výstupy v jeden okamžik?
b) zmíněný AD7545A disponuje ještě vstupy WR/ a CS/ z datasheetu jsem nepochopil zda bych je měl taktéž používat či né, resp. při jaké přiležitosti by šlo je využít?

Děkuji za odpovědˇ.

CS cip select—tj vyber aktivneho cipu. napr Umiznuje pripojenie viac zariadeni na jednu zbernicu, Tj pouzijes spolocne vodice napr data a clk pricom signaly z nich bude spracovavat len ten obvod ktory je zaktivovany CSkom

Predpokladam ze nad cs je ciarka tj obvod bude aktivny ked je cs v log0

RW predpokladam volba medzi citanim a zapisom
Nepozeral som dadta seet

Pokud necháš /WR a /CS v nule, na výstupu bude okamžítá převedená hodnota ze vstupu. Pokud jeden z řídicích pinů dáš do “1”, můžeš na port zapsat data postupně a potom shodit pin na “0”. V ten okamžik teprve začne převod.
Ten převodník je jen R-2R síť. Najdi si datasheet (kde je ostatně odpověď na tvé otázky) a obšlehni z něj zapojení - připojení OZ na výstup (bez něho ti z toho polezou nesmysly). Mimochodem to zapojení na figure 4 je invertující. Pokud chceš neinvertovaný výstup, budeš potřebovat ještě druhý invertují OZ za něj. Jejich napájení musí být symetrické. Pokud bys to potřeboval zprovoznit na jednoduchém napájení, bylo by potřeba pověsit AGND nad nulu do požadovaný úrovně.

Diky za rady :slight_smile: .

Schéma z figure č.5 (viz. datasheet) tj. bipolarní s 2OZ bych rád použil.

Ještě mi nyní vrtá v hlavě co jsi piityy myslel tím: bylo by potřeba pověsit AGND nad nulu do požadovaný úrovně, myslíš tím jinou úroven nežli DGND pokud ano jakou?

figure 5: budeš do převodníku posílat čísla ve dvojkovém doplňku (znaménková čísla)? Jesli ano tak vpořádku, v opačném případě (čísla bez znaménka) to bude dávat opět nesprávné hodnoty. A nejsem si jist, zda dokážeš v procesoru zpracovávat 12bit čísla se znaménkem :wink:.

Posun AGND: To nelze jednoznačně bez dalších informací určit. Je potřeba vědět, co očekáváš na výstupu. Ovšem za předpokladu Vref<=Vcc(OZ) a rail-to-rail OZ by to bylo Vref/2. Na výstupu by pak proti AGND bylo napětí od 0 do Vref/2. Proti DGND by to bylo od Vref/2 do Vref. Pokud bys požadoval výstup od 0 do Vref proti DGND, bylo by potřeba ještě zařídit posun a zesílení. Rail-to-rail zesilovač (ny vstupu i výstupu) je však nezbytný.
Pokud máš symetrické napájení (vyšší než Vref+1.5V) a budeš do toho posílat neznaménková čísla, tak bude nejjednodušší použít figure 4 a přidat na konec ještě jeden invertující OZ s jednotkovým zesílením.

Dvojkový doplněk: myslíš tím bit DB11 (jako znaménko) viz. figure č.5, když použiji symboliku z datasheetu?

Výstup z DAC: rád bych aby na výstupu bylo napětí v rozmezí -2,6V až +2,6V v případě Vin = Vref = +2,6V.

K tomuto převodníku jsem se uchýlil i s ohledem na možnost koupě v GM či GES, kdyby jsi ovšem věděl o nějakém lepším řešení byl bych vděčen :slight_smile: .

Zkusil jsem něco pospojovat, dle tvé rady umístit další OZ na výstup s jedničkovým zesílením, viz příloha.

Ale nevím jak zajistit potenciál 0-Vref/2 pro AGND a Vref/2 - Vred u DGND?

Diky za radu :slight_smile: .
pseudo.JPG

Jako OZ ti bude stačit nějaký úplně obyčejný bez nastavování offsetu. TL072, NE5532, NJM4580(seřazeny podle kvality) a pod.
Všechny spoje na Vin (2.6V) krom R11 jsou nesmyslné, zrušit. Na související napájení (+15V, -15V) používej stejné značky(šipky nebo kolečka), kdo má tohle zkoumat :wink:
Ten druhý zesilovač nemá jednotkové zesílení, tvoří tam teď jen zkrat. Zesílení invertujícího zesilovače je zhruba -R2/R1 a ty u něj nemáš ani R1 ani R2 :slight_smile:. Mezi pin 2 a 6 IC4 dej odpor např. 4k7-10k a mezi 6(IC5) a 2 (IC4) to samé.

Jelikož máš symetrické napájení OZ, tak posun AGND neřeš.

Dvojkový doplněk není jen znaménko v nejvyšším bitu! V tom datasheetu je i příklad. Ještě máš co studovat :slight_smile:

“na výstupu bylo napětí v rozmezí -2,6V až +2,6V v případě Vin = Vref = +2,6V.” Na pin 3(IC5) přiveď Vref/2 klidně z obyčejnýho děliče.

Diky za odpovědˇ, připomínky jsem již opravil :slight_smile: , až to dám v nejbližší době dohromady písnu zda všechno fungovalo.

V případě odporů R2 a R1 by šlo odpory uplně vynechat, vzhledem k vykráceni ve zlomku -R2/R1 tj. Uvyst = -Uvst, původně jsem to tak zamýšlel.

Tak přesně to nelze. Když odpor vynecháš, tak je tam 0Ohm. Jak chceš dělit nulou??? OZ mrská výstupem tak, aby mezi + a - byla nula. Když je + na 0V, tak se bude OZ snažit dostat 0V i na -. A jak jinak tam má dostat 0V když je výstup připojen přímo na “-”? No přeci tak, že dá na výstup taky 0V. A to bez ohledu na to, co se do - pokoušíš dostat z předchozího stupně. Jelikož tam chce předchozí OZ tlačit nějaký napětí a ten druhej se snaží držet 0V, tak jsou koncový stupně obou zesilovačů v parádním zkratu :wink:.
Vynechat odpory lze POUZE u neinvertujícího zapojení: vstup jde do + a zpětná vazba do - a to pouze v případě, že je OZ stabilní pro jednotkové zesílení. To není tento případ.

Hmm, tohle podchycení detailů při zapojování mi trošku chybí :frowning: . Snad to co nejdřive odstraním. Každopádně díky :slight_smile:

Zdravím Vás, rád bych se při této příležitosti zeptal na trochu jinou věc…

Snažím se řešit podobný problém, konkrétně připojení více DAC (12 nebo 14 bit, paralelně) k jednomu uC, popřípadně jednoho DAC a za něj multiplex + S&H na výstupy, na tom nezáleží. Z datasheetů dokáži vyčíst postupy, jediné, co nechápu, je časování… Pochopil jsem, že každá operace má nějaký timing, takže např. stahnu CS na 0, tím naadresuji DAC (počkám?), vystavím na porty uC data (počkám?), pak probíhají operace na DAC, musím počkat na ustálení (může už být odpojený a uC mezitím pracovat s dalším?), stejné, resp. podobné, je to i v případě multiplexů za jedním DAC, tam adresuji multiplexy a jejich jednotlivé výstupy. Můžete mi někdo poradit, popř. sem dát pseudo nebo reálný kód (je mi jedno v jakém prog. jazyce nebo pro jaký procesor, jsem profesionální programátor, bohužel nemám prakticky žádné zkušenosti s vazbou na HW, dělám na Win/Linux/Mac) třeba pro nějaký DAC, který používáte, já už si to snad nějak podle datasheetu přeberu.

Díky za případné rady.

p.s.: je zajímavé, že jsem nenašel žádný tutorial, všude se řeší jen ADC, jako DAC používají odporovou síť nebo přinejlepším DAC, ale bez multiplexování, tj. s jedinou výstupní hodnotou, kdy se nic takového neřeší a jede to kontinuálně.

Každý obvod/zapojení má trochu jiné řízení. Bylo by lepší, kdybys nějaké zapojení nadhodil abysme se mohli bavit konkrétněji, případně navrhnout úpravy.

Som nejako nepochopil, co chces za DA muxovat. Ako nahle prepnes MUX, tak vystup na danom kanali ide k zemi. Ak potrebujes viac kaanalov, tak pouzi nieco take ako je

ww1.microchip.com/downloads/en/D … 22187d.pdf

je to lacne, je to dostat a dobre sa tym pracuje. Ak sa chces hrat zo zvukom tak pouzi nejaky lacnucky I2S 16b DA, napriklad

alebo dokonca 24b CS4344-CZZ v cene 67Kc/od troch kusov.

Celkovo to schema co sa tu rozoberalo pred rokom je scestne, lebo na generator sumu cez AD nepotrebujem MCU, ale staci ZD so zosilnovacom vstupu

Přikládám obrázky, jak zhruba vypadají popisovaná zapojení. Počet periferií by měl být větší, ale jistě nemá cenu tam opakovat 8x DAC… Je to pro názornost.

Za multiplexem je S&H, kondenzátor a OZ, takže to nějakou dobu drží, to je běžné zapojení, to už jsem vykoukal.

Záměr je ten, že potřebuji generovat několik řídících napětí (s periodickým i neperiodickým průběhem) současně, pro řízení dalších obvodů. Řekněme, že je potřeba řídit např. 8 shodných obvodů, každý potřebuje 5 řídících napětí, jež jsou během jednoho obnovovacího cyklu naprosto nezávislá. Obnovovací frekvence pro každý výstup je poměrně vysoká (v řádu kHz).
DAC - mux.jpg
DAC - dual.jpg

  1. chces pouzit 12-14bit DA. Z toho vyplyva, ze na S&H Ti nesmie za cas kedy sa znovu s MUXom vratis na ten isty kanal klesnut napati na C pod 1/2LSB. To je pre 12 co dokonca a14bit neskutocne kratky cas. Si to zrataj a zapocitaj do toho i parazitny ‘odpor’ tvoreny vstupom OZ. Ak ti to nebude vychadzat, efekt bude ten isty ako keby si pouzil DA s tolkymi bitmy o kolko ti na kondiku klesne napatie kym sa tam znovu vratis. Tu si treba ozrejmit, ze parametre S&H na SAR AD stacia take, aby napatie nekleslo na C o 1/2LSB za cas prevodu, co je dnes bezne radovo okolo 2-10us. Ak obsluhujes 8x S&H s pristupom 1x 1ms, si na tom 100x horsie. Casovy priebeh vybijania C je myslim vseobecne znamy.

  2. Ak chces problem s casom samovybijania S&H poriesit zvysenim kapacity, narazis na dalsi problem a to je cas, za ktory C nabijes na zelane napatie. Predsa len na nabijanie pouzivas realny zdroj napatia s realnym vnutornym odporom. Cas musi byt taky, aby sa kondenzator nabil na zelane napatie aspon na 1/2LSB. A ti nasledne klesne napatie do dalsieho dobijania o 1/2LSB, musis k hodnote DA pripocitat 1LSB aby si mal prevod s pouzitelnou presnostou +/-1/2LSB. Ak casy nedodrzis, uplne zbytocne budes pouzivat X-bitovy DA. Je ti nanic a zbytocne si komplikujes zapojenie a plosak.

  3. este mala uvaha k casom.
    Uvadzas periodicke a neperiodicke signaly s frekvenciami radovo kHz. Tak nech je to len 1kHz. Jeden z najjednoduchsich signalov pre odvodenie casu za ktory potrebujes menit hodnotu DA je trojuholnik. Ak mas 12b DA a chces ho vyuzit, potom musis spravit 4096 krokov na 1/2 periody. Druhu polku zase zliezas dole. Z toho vyplyva frekvencia pristupu k DA vratane casu pre nastavenie S&H na 8.192MHz co je 122ns.

Ak pouzijes iba jeden DA a MCU nebude robit nic ine, len vycitavat data z tabulky, pripadne testovat nejake vstupy meniace spravanie sa zariadenia toto nie si schopny zvladnut na 20MHz mcu. Jednoducho z principu na maximalne 2.5 instrukcie nic nenastavis, nic nepremuxujes a nic nevyhodnotis. A to je trojuholnik z hladiska casu ten najpriatelskejsi. So sinusom je to daleko horsie.

A ty chces pouzit Ax12-14bitovy DA a na kazdom vystupe DA este Bx S&H pre frekvencie radovo kHz.
Aj ked uvadzas, ze sa jedna o obnovovaciu frekvenciu, Nie je mi ulne jasne ci tym myslis frekvenciu vystupneho signalu, alebo frekvenciu pristupu k DA. Preto som zratal ten nepriaznivejsi pripad.

Ale je zase pravda, ze pri takychto rychlostiach zase nebudes mat problemy s kapacitami na S&H.

  1. nie si schopny nastavovat vystupy synchronne. Z principu, ale mozno ti to nevadi.

  2. sebemensia nerovnomernost vo vykonavani programu, napriklad jeho vetvenie v dosledku detekcie stlaceneho tlacitka sa okamzite prejavi na vystupoch

Obnovovací frekvence je frekvence změny jednoho výstupu, ať už v případě více DAC nebo muxů. Tzn., že maximální frekvence signálu může být nižší, pochopitelně, tohle mi nemusíte vysvětlovat, 10 let píši vědeckotechnický výpočetní SW. Takže uC musí generovat data s frekvecí rovnou obnovovací * počet výstupů, tj. např. 10 kHz a to není nic světoborného. Když to zvládne na zapojení na přiloženém obrázku stará 8051 na 12 MHz, je to mimochodem stejná aplikace, jako chci dělat já a těch mux výstupů je tam cca. 40…

Toho, že nemohu měnit výstupy synchronně jsem si samozřejmě vědom, nicméně se to tak dělá a nevadí to, viz znovu obrázek.

Vazba na počet bitů není tak přesná, záleží na aplikaci a požadované přesnosti, protože např. pro 0.01 Hz aproximaci sinu je to potřeba mít hladké, u 100 Hz nikdo nepozná, že je to v podstatě trojúhelník. Pokud potřebuji provést změnu z 0V na 5V během 1ms, nepotřebuji na to 1000 kroků, stačí jeden. Generované frekvence a časy (neperiodických signálů - lin. nebo exp. průběh) mají jisté hranice a mám ověřeno, že ten 1 kHz je dostačující. Výše zmíněná aplikace pracuje právě s touto frekvencí.

Větvení programu nebude, resp. vygenerování hodnoty a update DAC se děje na přerušení, tohle už mám napsané a funguje to (na Mega16) a na výrazně vyšší frekvenci. Je to udělané tak, že se nejprve vystaví na porty aktuální hodnota bufferu a pak se počítá hodnota pro další iteraci, která se uloží. Čili přestože jde o různě náročné výpočty, obnovuje se to přesně. A i kdyby ne, nevadilo by to. Jen potřebuji umět obsloužit připojený HW.
Jupiter6.jpg

popis plati pre DA so zapisom hodnoty pri nabeznej hrane /CS

  1. vypni vsetky MUX-y k prislusnemu DA. Napr. 4051 na to maju samostatny pin inhibit.

  2. nastav pozadovane hodnoty na porty mcu

  3. nastav CS daneho DA. Ak je DA 12b, potom je vhodne na ovladanie cs DA pouzit jeden z pinov portu, ktoreho 4b sa pouzivaju na nastavenie slova. V Tvojom pripade moze CS a data prist spolu, prechodove javy mas osetrene “odstavenim” vystupom MUX-ov. Takze pri 12b 4xDA bod 2) a 3) vykonas sucasne

  4. nastav adresu prislusneho vystupu cez MUX-y

  5. nastav CS na log.1. Min.cas trvania /CS na nule je dany v katalogu. realizacia bodu 4) by mala trvat dlhsie, ako je bezny katalogovy udaj, takze preto cinnost v bode 4) predchadza bodu 5), aby program mohol pracovat kontinualne bez zbytocnych cakacich instrukcii.

  6. za dobu ustalenia vystupnej hodnoty definovanu v katalogu aktivuj signal inhibit. To by mali byt tiez nejake tie desiatky pripadne stovky ns.

Podla

national.com/ds/DA/DAC0830.pdf

ak spojis /WR a /CS musis mat data na DA aspon 1100ns + 50ns(tCS + tDH). Do casu tS = 1us mas ustalene data na vystupe od dobeznej hrany /WR. Az potom mozes menit data na portoch v prospech dalsieho DA.
Inhibit moze byt priamo zluceny s /WR a /CS. To znamena, ze akonahle aktivujes /CS+/WR zaroven zavries MUX-y. Nastavis data na zbernici, pockas 1us v ramci ktorych si nastavis vystup MUX-ov a potom nastavis /CS a /WR do log.1. Tym istym signalom zaroven aktvivujes prislusne MUX-y. A hned mozes deaktivovat MUX-y pre dalsi DA, atd.

Ale pozna to kazdy presne tak ako to pozna pri tych 0.01Hz. Vizualne spoznanie predsa zavisi na nastavenej CZ osciloskopu. :slight_smile:

Dokonca 100Hz sinus a trojuholnik uplne bezpecne pozna kazdy s troskou sluchu, kedze signal sinus je tvoreny iba prvou harmonickou a trojuholnik je tvoreny prvou harmonickou a vsetkymi neparnymi, ktorych amplituda klesa s druhou mocninou poradia harmonickej. A to uz pekne pocut je. Pre ilustraciu je obdlznik tvoreny velmi podobnym vztahom ako ten trojuholnik, len pokles amplitud harmonickych nie je s druhou mozninou.

Ci to vsak Tvojej aplikacii vadi, vies najlepsie.

Inak stale som nejako nezaregistroval aky typ DA chces pouzit., takzo je potom radit v casovani.

Uz som zistil co asi znamena Jupiter6. Ak je to to co myslim, tak potom je to jedno :slight_smile: