Semplice Convertitore D/A con ARDUINO duemilanove : problemi di overshoot

Salve,
Sto cercando di utilizzare Arduino come generatore di segnali per la mia tesi, però con scarsi risultati.

Allego uno schema di massima.

[/url]

Le porte wal 1:4 sono collegate alle porte digital out di arduino.

Il problema è dato dai picchi di overshoot presenti ogni volta che c'è una commutazione.

All' inizio pensavo fosse un problema di iduttanza parassita, loop di massa induttivi o cose del genere.
Però anche collegando DIRETTAMENTE la sonda dell'oscilloscopio ad una porta digitale di arduino, è presente il picco di overshoot.

L'ingresso dell' oscilloscopio dichiara una resistenza di 1 M ohm e una capacità di 40 pF

Io ho trovato degli esempi di dac r2r che funzionano benissimo, senza problemi.
Insomma io vorrei ottenere un risultato simile a questo :

http://arduino.cc/forum/index.php/topic,8715.0.html

Se qualcuno ha un'idea a riguardo è il benvenuto.

Grazie.

Arduino non è granché per generare segnali, arrivi a frequenze e risoluzioni molto basse. Ci sono molti modi migliori.

L'overshoot è in genere capacitivo, hai provato ad usare la molla del probe dell'oscilloscopio invece del coccodrillo senza cavetti jumper o breadboard con tutto scollegato? Puoi allegare qualche schermata dell'oscilloscopio?

Il TL082 lo alimenti dualmente? Direi che ad ogni modo non va bene, è una pessima scelta.

Ma che schema hai trovato? Non potevi fare un semplice DAC R2R senza Mosfet?

Ciao

IMPORTANTE: Hai calibrato l'oscilloscopio? I probe sono da tarare ogni tanto

Allego foto


image

Questo è l'andamento a vista, giusto per capire cosa succede. Se necessario nei prossimi giorni allego uno screen cap fatto come si deve


online photo storage

Un minimo di picco è normale che ci sia, nel tuo caso molto è introdotto nella misurazione, prova a seguire i consigli che ti ho dato
Ciao

Ma che schema hai trovato? Non potevi fare un semplice DAC R2R senza Mosfet?

Lo schema funziona, il problema non è nei mosfet e neppure nell' operazionale

Hai calibrato l'oscilloscopio? I probe sono da tarare ogni tanto

Si, ho fatto, putroppo lo spike è dovuto proprio alla scheda :frowning:

Grazie.

Secondo me è un pessimo schema, con componenti discreti ti viene un macello con quei mosfet.
Le resistenze da 470k poi sono assurde secondo me, sia che il rumore è proporzionale al valore della resistenza?
L'op-amp non è rail-to-rail oltre che essere totalmente inadatto a questo compito, mettici un MCP6022

Hai letto il mio vecchio post: Arduino Forum ?
Con il MCP6022 ho risolto moltissimi problemi, te lo consiglio caldamente.
Costa poco (te lo mandano gratuitamente come sample per l'università) , ha una buona banda (10 MHz) è Rail-to-Rail input/output ed è stabile a guadagno unitario, è fatto apposta per essere utilizzato come DAC Buffer

Ma perché ti danno così fastidio quei picchi?

Ciao

La capacità di ingresso è determinata anche (e sopratutto) dalla sonda, metti l'attenuazione massima per avere meno capacità (dopo ritara), ti faccio coi numeri dei miei probe per farti capire:
Attenuazione 1x 1M ohm 100pF
Attenuazione 10x 10M ohm 17pF

40pF non sono pochissimi.. se non compensati tramite la taratura di entrambe le sonde i pinnacchi si alzano
Ciao

Grazie per la info sull' operazionale.

Ma perché ti danno così fastidio quei picchi?

Semplicemente perchè in uscita voglio un segnale fatto a scalini come questo :

Questo non ha overshoots, come avrà fatto? =( =(

flz47655:
40pF non sono pochissimi.. se non compensati tramite la taratura di entrambe le sonde i pinnacchi si alzano

Per non parlare di tutte le capacità parassite introdotte dalla bread board, mi associo pure io al commento su quanto sia assurdo usare dei mos, che a loro volta introducono altre capacità parassite, per commutare le resistenze, idem per l'opamp scelto e per i valori della rete di feedback.

Il segnale è visto con poco zoom (e potrebbe essere un segnale a frequenza molto bassa) e l'oscilloscopio è molto vecchio, si perde parte degli eventi

Ciao

PS: Se vogliamo mettere il coltello i mosfet sono senza resistenza sulla base, se li comandi con una frequenza un pò elevata... BUM!

@Astro: Per misurare l'overshoot gli avevo consigliato di scollegare tutto, spero l'abbia fatto altrimenti è inutile stare a discutere se era con la breadboard collegata..

Per non parlare di tutte le capacità parassite introdotte dalla bread board, mi associo pure io al commento su quanto sia assurdo usare dei mos, che a loro volta introducono altre capacità parassite, per commutare le resistenze, idem per l'opamp scelto e per i valori della rete di feedback.

Lasciamo perdere per un momento lo schema elettrico, poichè ci vorrebbe troppo tempo per spiegare a fondo la scelta dei cmos e andrei inesorabilmente OT.
Prendetela per buona.
Il problema è l'overshoot presente sull' uscita digitale SENZA mosfet a valle.
A cosa è dovuto? E' eliminabile?

Grazie.

PS: Se vogliamo mettere il coltello i mosfet sono senza resistenza sulla base, se li comandi con una frequenza un pò elevata... BUM!

Per base intendi tra GATE e massa? Perchè "BUM"?

Grazie.

Si scusami intendevo sul gate ovviamente, BUM! perché il gate è come una capacità e serve corrente per caricarla e scaricarla velocemente, se hai una frequenza troppo alta potresti superare il limite dei 40mA per pin e danneggiare il micro.

L'overshoot è dovuto da capacità parassite, in parte non eliminabili, abbassando la frequenza le percepisci di meno.

Ciao

dr.benway oggi sono tonto.
Spiegami il funzionamento di questo circuito.

L' operazionale é un comparatore con retroazione. Tu cosa volevi che fosse?
Come puoi pilotare quei MOSFET? Il source non é collegato a massa. Se la retorazione del operationale funziona hai una tensione quasi uguale sulle entrate + e -. Visto che il + lo hai messo a 3V (partitore con le 2 resistenze da 470Kohm anche la entrata negativa del operazionale é a 3V. Se la source é a 3V non riesci a pilotare il MOSFET con 5V di Arduino perché troppo pochi per portarlo in piena conduzione.

Come detto, spiegami il funzionamento di quel schema; io non ci arrivo.

Ciao Uwe

Spiegare nei minimi dettagli lo scopo, e l' utilizzo del circuito mi risulta impossibile perché dovrei riassumere qui in 2 righe le prime 80 pagine della mia tesi.
Il circuito alla fin fine è stato postato inutilmente perché è ormai chiaro che non è quello il problema.
I picchi di tensione sono presenti collegandomi DIRETTAMENTE ad Arduino, quindi i mosfet non centrano un tubo.
Il mio sospetto è che siano degli artefatti dovuti al campionamento dell' oscilloscopio digitale.
Però l'indagine continua ... :roll_eyes: :roll_eyes: :roll_eyes:

dr.benway:
Spiegare nei minimi dettagli lo scopo, e l' utilizzo del circuito mi risulta impossibile perché dovrei riassumere qui in 2 righe le prime 80 pagine della mia tesi.

allora fai vedere quelle 80 pagine o se non vuoi mostrarla in pubblic spediscimela in PM o via Email. Il mio indirizzo email lo trovi nel mio profilo, basta cliccare sul mio utente.

dr.benway:
Il circuito alla fin fine è stato postato inutilmente perché è ormai chiaro che non è quello il problema.

Ne sei sicuro al 100%?

dr.benway:
I picchi di tensione sono presenti collegandomi DIRETTAMENTE ad Arduino, quindi i mosfet non centrano un tubo.
Il mio sospetto è che siano degli artefatti dovuti al campionamento dell' oscilloscopio digitale.

Ogni oscilloscopio fornisce un segnale rettangolare per calibrare la sonda. Misurando quel segnale Ti da anche quei picchi o hai un segnale pulito?

Ciao Uwe

dr.benway:
Il mio sospetto è che siano degli artefatti dovuti al campionamento dell' oscilloscopio digitale.

Guarda facciamo così, pubblica lo sketch o quelle poche righe che utilizzi per generare il treno di onde quadre, lo faccio girare anch'io sul mio arduino e ti mando una schermata del mio oscilloscopio. Se fosse un problema di campionamento è più probabile che non vedresti il picco o comunque non tutta la sua dinamica.

Ciao

Ogni oscilloscopio fornisce un segnale rettangolare per calibrare la sonda. Misurando quel segnale Ti da anche quei picchi o hai un segnale pulito?

E' la prima cosa che faccio ogni volta quando collego la sonda.

Guarda facciamo così, pubblica lo sketch o quelle poche righe che utilizzi per generare il treno di onde quadre, lo faccio girare anch'io sul mio arduino e ti mando una schermata del mio oscilloscopio. Se fosse un problema di campionamento è più probabile che non vedresti il picco o comunque non tutta la sua dinamica.

Saresti molto gentile e ti ringrazio anticipatamente.
Prima lanci questo sketch (programmi la ROM)

/*
 * EEPROM Write
 *
 * Stores values read from analog input 0 into the EEPROM.
 * These values will stay in the EEPROM when the board is
 * turned off and may be retrieved later by another sketch.
 */

#include <EEPROM.h>


void setup()
{
}
int write = 1;
void loop()
{
  if (write == 1)
  {
EEPROM.write(    0 , B10000000 );
EEPROM.write(    1 , B10000000 );
EEPROM.write(    2 , B10001010 );
EEPROM.write(    3 , B10001010 );
EEPROM.write(    4 , B10101000 );
EEPROM.write(    5 , B10101000 );
EEPROM.write(    6 , B10100010 );
EEPROM.write(    7 , B10100010 );
EEPROM.write(    8 , B10100010 );
EEPROM.write(    9 , B10100010 );
EEPROM.write(   10 , B10101000 );
EEPROM.write(   11 , B10101000 );
EEPROM.write(   12 , B10001010 );
EEPROM.write(   13 , B10001010 );
EEPROM.write(   14 , B10000000 );
EEPROM.write(   15 , B10000000 );
EEPROM.write(   16 , B00101010 );
EEPROM.write(   17 , B00101010 );
EEPROM.write(   18 , B00100000 );
EEPROM.write(   19 , B00100000 );
EEPROM.write(   20 , B00000010 );
EEPROM.write(   21 , B00000010 );
EEPROM.write(   22 , B00001000 );
EEPROM.write(   23 , B00001000 );
EEPROM.write(   24 , B00001000 );
EEPROM.write(   25 , B00001000 );
EEPROM.write(   26 , B00000010 );
EEPROM.write(   27 , B00000010 );
EEPROM.write(   28 , B00100000 );
EEPROM.write(   29 , B00100000 );
EEPROM.write(   30 , B00101010 );
EEPROM.write(   31 , B00101010 );
  }
 
 write = 0;
 


}

poi carichi questo

#include <EEPROM.h>
int addr = 0;
int k=0;


void setup()
{
 
  DDRD = B11111111; //tutti i pin sono uscite
 
}

void loop()
{
  while (k<100)
{
 PORTD = EEPROM.read(addr);
   
    ++ addr;
   
    if (addr > 31)
{addr = 0;}

}

  }

Poi colleghi la sonda tra digital 7 e gnd come vedi nella foto.

Dovresti avere l'onda quadra di circa 10 kHz che sfarfalla (lo sfarfallamento è dovuto al codice, che devo riscrivere, però adesso ho altre priorità ...).

Il mio sospetto è che le commutazioni di Arduino sono troppo rapide, la sonda che uso introduce un carico induttivo ( il cavetto di massa a banana) e quindi si crea il picco.

Grazie ancora.

Giorgio.

Ti allego le schermate del mio oscilloscopio, i fronti di salita sono molto rapidi, circa 20ns, quindi col mio oscilloscopio da 100MHz potrei perdermi qualcosina.

Con una misurazione direttamente sui pin del micro (con la molla e NON il coccodrillo) puoi vedere che l'overshoot è del 16.8% (Vmax raggiunge 6V)

Con una misurazione tramite un cavetto jumper di 10cm collegato ai pin header femmina, utilizzando il coccodrillo per GND puoi vedere che l'overshoot è del 31.7%

Questo a prova che le misurazione a volte sono ingannevoli ed influiscono su quello che si vede a schermo che potrebbe non essere la realtà.

La sovraelongazione dura molto poco, 20ns rispetto a 0.1ms del periodo della tua onda, che problemi ti crea? E' normale quando si hanno segnali in frequenza

Ciao

overshoot molla.bmp (219 KB)

overshoot.bmp (219 KB)