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.
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:
per convertirlo in binario bisogna moltiplicare ogni cifra per una potenza di 2 pari alla posizione dove si trova la cifra ossia:
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 |
|
| 010 | 2 | V/4 |
|
| 100 | 4 | V/2 |
|
| 111 | 7 | V/8+V/4+V/2 |
|
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à

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.
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
Onda quadra 550kHz
dente di sega 10kHz
triangolo 5kHz (stesso algoritmo del dente di sega ma avendo due fronti, salita e discesa, la frequenza si dimezza
seno a 10kHz (l'oscilloscopio è scarso davvero e l'onda balla un po', si vede la sovrapposizione nella foto come se fosse doppio)
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.
- dente di sega
unsigned char i; PORTD=i++; //lascio andare i in overflow e si azzera da sola
- triangolo
unsigned char i; for(i=0;i<256;i++) PORTD=i; for(i=256; i>0; i++) PORTD=i;
- 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

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)



