Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Ricerca personalizzata
15
voti

DDS casalingo con DAC.... casalingo!

Indice

Breve premessa

Questo è il primo articolo che scrivo e non so neanche bene da dove cominciare. Non so neanche perché lo scrivo in realtà perché quello che sto per presentare non è nulla di innovativo né tantomeno di particolare ma, visto che per me è stata fonte di divertimento e di studio, voglio condividerlo con voi un po’ nella speranza di ricevere consigli e critiche utili ai miei studi, un po’ per mettere “nero su bianco” quello che ho fatto.

antefatto

Moltissime volte per un’applicazione che abbiamo in mente basta rivolgersi al mercato. Servono 5V per alimentare qualcosa? Bhe, ci sono i caricabatterie USB che danno 5V che ci vuole costano 2€! Serve accendere un led? Beh, ci sono i driver fatti apposta che ci vuole costano 2€! Serve un DAC? Che ci vuole, costa 2€!

Si, tante cose oramai costano due euro ma spesso abbiamo disimparato come queste cose sono realizzate, la logica che c’è dietro, i principi di funzionamento e anche gli escamotage per non dover sempre essere ridotti a comprare tutto.

Ci sono certamente occasioni ed occasioni. Quando si parla di sicurezza e precisione non si scherza affatto, per un falegname è meglio comprare una sega elettrica testata e certificata piuttosto che attaccare una lama ad un motore e farla girare all'impazzata. Mi si è presentata la scelta se comprare qualcosa di già fatto o trovare un modo per farla da me e, visto che le condizioni lo permettevano: ho fatto da me.

il DAC

IL DAC che ho realizzato non ho voluto comprarlo ma hopreferito sperimentare varie tecniche che convertono l’uscita di unmicrocontrollore in un segnale continuo. Ho preso in considerazione tre metodi:

  • Filtrare il PWM
  • Sommatore pesato
  • R-2R ladder

Provo a dare un accenno su questi metodi.

Filtrare il PWM

Molti micro di oggi hanno un uscita di PulseWidthModulation ossia un’onda quadra con duty-cycle modulato che quindi può spaziare da 0% (sempre 0 in uscita) a 100% ( sempre 5V in uscita) passando per esempio dal 50% in cui l’onda è per metà del tempo alta e metà del tempo bassa.

Si sfrutta quindi un solo pin del micro e serve filtrare il segnale per ottenere il valore medio dell’onda: se il duty cycle fosse 30% ci aspettiamo in uscita il 30% di 5V ossia 1.5V.

Ovviamente per ottenere un ripple trascurabile, bisogna che il filtro abbia una pendenza piuttosto spinta e un filtro del primo ordine non è quasi mai sufficiente se si vuole ottenere in uscita un’onda piuttosto pulita.

IMG_20171017_110801.jpg

IMG_20171017_110801.jpg

sinusoide generata con PWM, si nota come verso sinistra l'onda quadra abbia un dity cicle molto piccolo e infatti il seno si abbassa, poi sulla destra quando il duty cicle aumenta anche il seno.

PRO: usa un solo pin del micro
CONTRO: con l'aumentare dell'ordine del filtro aumenta anche costo e complessità

Sommatore pesato

Si tratta di prendere un numero binario e trasformarlo indecimale però con un circuito analogico.

Prendiamo un numero binario nella forma: X_{bin}=x_{n-1}\ ...\ x_{1}x_{0} per convertirlo in binario bisogna moltiplicare ogni cifra per una potenza di 2 pari alla posizione dove si trova la cifra ossia:
X_{dec}=x_{n-1} \cdot 2^{n-1}+ \ ... \ +x_{1} \cdot  2^{1}+ x_{0} \cdot 2^{0}

Implementare questa operazione in analogico è semplice perchè non è nient'altro che un sommatore pesato.


In questo circuito si divide il bit più significato per R, il secondo bit per 2R, il terzo bit per 4R e così via ottenendo la stessa formula di prima: apposto di moltiplicare per numeri sempre più grandi si divide per numeri sempre più piccoli.

PRO: pochi componenti utilizzati e semplicità concettuale e circuitale
CONTRO: le tolleranze delle resistenze giocano un ruolo importante e inoltre trovare valori di resistenze tutti gli uni doppi degli altri non è semplice con i valori commerciali, si finisce col fare serie e paralleli e accontentarsi di tolleranze molto larghe rispetto ai valori ideali

R-2R LADDER

Si tratta di una specie di partitore resistivo, propongo subito il circuito:


Faccio una veloce analisi del circuito solo per chiarezza di un qualche neofita che leggerà questo piccolo articolo, i più esperti si annoieranno a leggere queste banalità.
Prendiamo un esempio a 3bit.


Adesso si considerano 3 diversi ingressi in cui c'è un solo bit a 1 e gli altri due sono a 0. Visto che la rete è lineare per tutti gli altri ingressi (con più di un 1) si può usare la sovrapposizione degli effetti e sommare i contributi dei singoli 1.

(se qualcuno fosse interessato ai passaggi lo dicesse, si possono sempre aggiungere) Avendo considerato 3bit in ingresso il massimo numero che possiamo scrivere è 111(bin) ossia 7(dec)
Ricapitolando:

BIN DEC Vout Value
001 1 V/8 \frac{1}{8} \cdot V
010 2 V/4 \frac{2}{8} \cdot V
100 4 V/2 \frac{4}{8} \cdot V
111 7 V/8+V/4+V/2 \frac{7}{8} \cdot V

cosa ci dice questa tabella? Ho chiamato V il valore di tensione corrispondente all' uno logico. In teoria il massimo valore che possiamo raggiungere in uscita è proprio V (nel mio caso 5V) ma succede che questo valore va diviso per le combinazioni possibili con il numero di bit scelti (nell'esempio 3bit quindi 8 combinazioni)! In uscita avremo la tensione massima raggiungibile V, diviso 8, moltiplicato per il valore decimale da rappresentare. La cattiva notizia è che il massimo numero binario scribile (111) corrisponde solo a 7/8 della tensione massima quindi 5V non li raggiungiamo mai. La buona notizia è che al crescere del numero di bit usati in ingresso ci avviciniamo sempre più ai 5V infatti basta passare ad 8 bit per ottenere un totale di 256 combinazioni, il più grande numero binario scrivibile sarà 11111111 (che rapprensenta il decimale 255) e così la tensione di uscita massima sarà V_{out}= V \cdot \frac{255}{256}= 5V \cdot 0.996=4.98V
Per me un margine di un paio di centesimi di volt è più che sufficiente.

PRO: facile realizzazione, realizzabile con tutti resistori uguali e ottenere i 2R dalla serie. Io ho usato resistori SMD all'1%.
CONTRO: tolleranze dei componenti, variazioni dei valori di resistenza con la temperatura impedenza di uscita alta.

il mio DDS

posto una foto dell'inizio della realizzazione del dac in componenti SMD su millefori, forse per qualcuno sarà una banalità ma io era la prima volta che saldavo SMD su millefori e ne sono stato entusiasta! Il risultato estetico non è dei migliori ma funziona.

IMG_20171016_170812.jpg

IMG_20171016_170812.jpg

Queste sono le 2R ossia la serie di due resistori uguali. La R singola è stata saldata tra le piazzole. Il tutto direttamente sotto il micro.

carrellata di foto per piccoli esperimenti

IMG_20171016_233915.jpg

IMG_20171016_233915.jpg

Onda quadra 550kHz

IMG_20171016_234115.jpg

IMG_20171016_234115.jpg

dente di sega 10kHz

IMG_20171016_234231.jpg

IMG_20171016_234231.jpg

triangolo 5kHz (stesso algoritmo del dente di sega ma avendo due fronti, salita e discesa, la frequenza si dimezza

IMG_20171016_234352.jpg

IMG_20171016_234352.jpg

seno a 10kHz (l'oscilloscopio è scarso davvero e l'onda balla un po', si vede la sovrapposizione nella foto come se fosse doppio)

IMG_20171016_234531.jpg

IMG_20171016_234531.jpg

seno a 100k, uscita presa direttamente dal DAC. Se fatto seguire da un filtro anche a questa frequenza si ottiene un buon seno ma il filtro l'ho progettato per tagliare a frequenze molto più basse perchè alla fine questo arnese verrà usato in campo audio.

mini codice

nessuna novità, nessuna ottimizzazione, quattro righe in tutto, giusto per vedere due segnali muoversi.

  1. dente di sega
unsigned char i;
PORTD=i++;
//lascio andare i in overflow e si azzera da sola


  1. triangolo
unsigned char i;
for(i=0;i<256;i++) PORTD=i;
for(i=256; i>0; i++) PORTD=i;


  1. seno (unica vera applicazione di DDS)
//array di byte, CI SONO MODI MIGLIORI PER FARLO
unsigned char i=0;
unsigned char sine[] = {     127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,242,243,244,245,247,248,249,249,250,251,252,   252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,221,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124};
//scorro l'array e mando in uscita il segnale corrispondente
for(i=0; i<256; i++) PORTD=i;

conclusioni

è stato comunque divertente approfondire un po'questi argomenti che in facoltà non vengono trattati per nulla. Realizzare qualcosa con le mie mani è sempre un piacere e questo è il primo pezzo di un progetto un po' più grande che presenterò in un altro articolo. Ripeto che questo articolo è stato scritto così, per imparare quindi andateci giù di critiche e commenti che non posso che migliorare!

Un saluto a chi avrà avuto il coraggio di leggere fin qua giù,
Davide

5

Commenti e note

Inserisci un commento

di ,

Sono stato coraggioso, allora :-) Complimenti per il lavoro e per l'articoletto!

Rispondi

di ,

Grazie a tutti dei consigli e dei commenti sono stati apprezzatissimi!

Rispondi

di ,

Sì, carino questo articolo, anche per come è scritto in modo abbastanza chiaro e semplice. Unico appunto: è sempre bene esplicitare gli acronimi, anche se questo è un ambiente tecnico e il gergo è ammesso. Per esempio ho la sensazione che non tutti capiscano subito DDS (Direct Digital Synthesis). Comunque il voto lo meriti!

Rispondi

di ,

Non male come esordio...e ora persevera!

Rispondi

di ,

Bravo. Il fatto di provare è sempre lodevole ed è la strada maestra per imparare veramente le cose. Ho apprezzato lo sforzo che hai fatto per cui il voto positivo viene di conseguenza.

Rispondi

Inserisci un commento

Per inserire commenti è necessario iscriversi ad ElectroYou. Se sei già iscritto, effettua il login.