Domande di un neofita

Salve a tutti, eccomi con la mia prima richiesta, scusatemi se è un po' banale ma sono un neofita sia di arduino sia di microcontrollori simili in generale. Cercando un po' in rete e molto su questo forum ho trovato diverse risposte ma avrei ancora delle domande: - ho letto che un pin digitale messo come output in low può fare da massa e può passare massimo 40mA, ma su grd normale quanto può passare? (immagino lo stesso valore) e ci sono differenze sostanziali per cui uno dovrebbe adottare questa disposizione?

  • quali sono i valori per cui un pin digitale input è high o low? cioè immagino che 4,9 invece di 5V sia comunque high e 0,2 sia sempre low ma con che limiti? (questo porta a dei vantaggi ma anche degli svantaggi...)

  • l'alimentazione tramite USB non è molto pulita (cosa di cui necessito per fare misure molto precise) però necessito del trasferimento dati, se alimento con un'alimentazione esterna e collego un cavo usb con i fili di alimentazione tagliati funziona il trasferimento dati?

  • per alcune applicazioni necessito di una precisione sopra i 10bit (1mV = 12-13bit), ho letto il metodo di oversampling che dovrebbe essere se ho capito bene: guadagno=2^(2n)/2^n però non ho capito in codice come si fa, cioè basta dichiarare una variabile (x) e con ad esempio un ciclo for fare n volte x+=analogRead(pin) e poi dividere?

  • da quello che ho capito per uscite analogiche ci sono solo PWM e con una precisione di 8bit che sono un po' pochi, ci sono sistemi per ottenere tensioni effettive (cioè se cerco 2,5V che siano esattamente 2,5 e non un impulso quadrato da 5V con un duty del 50%) con una precisione del mV ma che non intacchino troppo la velocità con cui varia il potenziale (pensando a un condensatore) per avere una buona rampa di potenziale

Se vi state chiedendo perchè mi faccio questo tipo di domande basta che andate a vedere la mia presentazione in cui ho detto che vorrei provare ad usare arduino in elettrochimica poichè secondo me è valido però questa materia necessita di questo grado di precisione. Grazie, Theiden.

Le cose dette valgono per un Arduino UNO. Per altri valgono anche se hanno un ATmega328 in parte se hanno un altro microcontroller montato.

  • Su un pin puó transitare ( verso +5V o verso massa) al massimo 40mA. Su un certo gruppo puó passare in totale al massimo 100mA e sui pin +5V e masssa puó passare al massimo 200mA. Vedi datasheet http://www.atmel.com/Images/doc8161.pdf tabella 28.1 pagina 313 e note 3 e 4 pag 314 Sulla massa di arduino (i pin GND) puó passare al massimo un po meno di 500mA (massimo che da la USB) oppure alimentato dal alimentatore esterno qualcosa da 200mA a 1A a seconda se colleghi l' utenza a Vin o utilizzi lo stabilizzatore e dalla tensione data dal alimentatore.
  • livelli H e L vedi tabella 28.2 pagina 313. Per una alimentazione di 5V vale: H da 5,5V a 3V e L da -0,5 a 1,5V. Valori tra 1,5V e 3V non sono definite; vuol dire che non fanno cambiare lo stato precedentemente letto. Con altre tensioni di alimentazione i valor cambiano. Non capisco cosa intendi con vantaggi / svantaggi.
  • Dipende cosa misuri. Se misuri un valore che deriva da un partitore resistivo dove una delle due resistenze cambia ( potenziometro NTC,PTC LDR ecc) la misura é precisa se il partitore e la tensione di riferimento siano la stessa (anche l' aliemntazione non costante) se leggi una tensione data da un sensore che non dipende dalla tensione di alimentazione (come per esempio tutti i sensori a semiconduttore )puoi usare una tensione di riferimento precisa collegata a AREF mettendo analogReference(EXTERNAL)
  • L' oversampling non funziona cosí bene da poter guadagnare 3 bit di risoluzione in piú. Devi usare un ADC esterno da 12-13 bit. In pratica fai la somma di piú letture e poi non dividi per il numero di misure, ma per un numero minore ( per esempio 8 letture e dividere per 4). Guadagni 1 bit.
  • Se ti serve una tensioen analogica di uscita puoi usare un DAC (per esempio un MCP4921 o MCP4922) oppure usi un PWM e metti un RC per stabilizzare la tensione.

Se vuoi pilotare dei esperimenti e percui ti servono tensioni analogice Ti servono alimentatori pilotati digitalmente. Un DAC non Ti da abbastanza potenza.

Ciao Uwe

Grazie mille delle risposte. Leggendo un po' credo che per le mie applicazioni sia più indicato arduino DUE perchè ha già due uscite DAC di precisione rispettabile (3300/4096=0,8mV), in questo modo mi risparmierei gli MPCP49xx che in caso potrei sempre aggiungere dopo in caso di necessità (i PWM + RC non credo siano abbastanza puliti e allo stesso tempo veloci per queste applicazioni); inoltre ha molte più uscite in generale. Per quanto riguarda le correnti non ho ben capito la differenza tra pin e porta: come faccio ad avere sulla porta ad esempio 10 una corrente maggiore che sul pin 10? (per vantaggio intendevo che la tensione non importa che sia perfetta per avere un certo valore però per altre applicazioni è uno svantaggio: ad esempio avevo fatto un circuito che legge tensioni negative ma solo se avesse letto HIGH con qualsiasi tensione positiva ma non è un grosso problema penso che userò un inseguitore di tensione) Per l'adc ho capito, mi sembra di aver letto che al massimo si guadagna 2bit , cmq con arduino DUE ci sono già 12bit ed essendo la tensione massima 3,3 invece di 5 si va sotto il mV (se ho fatto i conti giusti).

Non ho invece capito la cosa dell'alimentazione esterna; quello che intendevo io era che l'alimentazione usb non è pulita e stabile per un ADC preciso quindi userei si un alimentatore esterno. Per non peggiorarmi la precisione Aref deve stare sempre sui 3,3V quindi pensavo di prendere un cavo USB, sbucciarlo, staccare tutti i cavi tranne quelli trasferimento dati e sostituire quelli di alimentazione con un alimentatore da 5V che usa un LM7805 però poi andare ad alimentare arduino con la USB in modo che lui pensi che quei 5V belli stabili provengano dal pc (oppure usare l'alimentazione esterna con un lm7809), e per sicurezza mettere anche un analogReference(EXTERNAL) collegando il pin 3,3V e aref. Mi domandavo però se ad arduino questo andasse bene e mi trasferisse i dati senza accorgersi di niente. Inoltre mi pare di aver capito che questo tipo di arduino ha 2 entrate USBmicro, sono indifferenti?

Questi esperimenti sono tutti o a corrente 0 o al massimo 1mA quindi per la potenza non ci dovrebbero essere problemi.

PS forse ho fatto un po' di casino nella parte dell'alimentazione casomai metto uno schemettino veloce.

Arduino è dotato di un selettore per la fonte di alimentazione. E' un semplice comparatore. Se lo alimenti dalla USB prende la corrente lì, ma se gli colleghi un alimentatore esterno con tensione maggiore della USB, stacca l'alimentazione dell'USB e preleva l'alimentazione dalla fonte esterna. Non c'è motivo di modificare il cavetto USB.

Ricorda che la DUE è più delicata e la corrente massima erogabile da un pin e di solo 3mA e non di 40mA. La porta è un insieme di pin. Le puoi facilmente riconoscere negli schemi --> http://forum.arduino.cc/index.php/topic,151646.0.html Ad esempio PB0, PB1, PB2 ecc ecc sono tutti i pin della porta B.

Le due porte micro usb della DUE sono diverse. Una, quella nativa, è collegata direttamente al micro mentre l'altra è collegata tramite il 16U2 e corrisponde alla Serial0. (pin 0 e 1). --> http://arduino.cc/en/Main/ArduinoBoardDue

Dal link che mi hai dato leggo: "Each pin can provide (source) a current of 3 mA or 15 mA, depending on the pin, or receive (sink) a current of 6 mA or 9 mA, depending on the pin" mi piacerebbe capire quali erogano quanto xD cmq come ho detto le correnti saranno minime, dorò dimensionare cmq bene le resistenze. Per le usb ancora devo leggere e capire bene. Per l'alimentazione buono a sapersi, non vorrei però che ci fossero tensioni parassite, bo valuterò più avanti :)

Grazie delle risposte precise ed esaurienti :D

Questi dati sono riportati sul datasheet del microcontrollore SAM3X8E. http://www.atmel.com/Images/doc11057.pdf

Ricorda che c'è anche un massimo quantitativo di corrente erogabile da tutto il microcontrollore. Non è che puoi "succhiare" quanta corrente pare a te, solo 130 mA.

Il mio consiglio resta da un Arduino UNO o Arduino MEGA 2560 e aggiungi un DAC e un ADC con maggiore risoluzione. Ciao Uwe

Questi datasheet sono enormi è impossibile trovare quello che uno cerca :astonished: :astonished: :astonished: cmq dopo mi ci metto.
leo72 grazie per l’informazione ma non farò elettrolisi spinte ma solo a livello analitico quindi non ci dovrebbero essere problemi di superare le correnti max.
Ho letto due siti sulla differenza tra usb nativa e programmabile ma sinceramente non ho capito a cosa serve un a cosa l’altra e perchè ce ne solo uno…
Ho un ultima domanda (spero, mi dispiace di avervi tartassato così) volendo misurare una tensione esterna, ad esempio di una batteria, (poniamo che abbia dimensionato bene le resistenze per non avere problemi di corrente) collegherei un capo a GRD e uno a un ingresso analogico ma se non so qual’è il polo negativo (che andrebbe su GRD, giusto?) posso collegare i due poli a due ingressi analogici, immaginando che quello a tensione minore venga considerato 0 o friggo tutto ed è meglio usare un’altra strategia?

EDIT
uwefed forse hai ragione ma dipende anche dai costi, poi un MCP4922 mi da 12 bit che non sono sicuro siano sufficienti, mi sapresti suggerire un DAC e un ADC a 13 o più bit di facile assemblaggio e con una buona uscita?

theiden: Questi datasheet sono enormi è impossibile trovare quello che uno cerca :astonished: :astonished: :astonished: cmq dopo mi ci metto.

Tabella 46.2 pag 1391

Ho un ultima domanda (spero, mi dispiace di avervi tartassato così) volendo misurare una tensione esterna, ad esempio di una batteria, (poniamo che abbia dimensionato bene le resistenze per non avere problemi di corrente) collegherei un capo a GRD e uno a un ingresso analogico ma se non so qual'è il polo negativo (che andrebbe su GRD, giusto?) posso collegare i due poli a due ingressi analogici, immaginando che quello a tensione minore venga considerato 0 o friggo tutto ed è meglio usare un'altra strategia?

No, non puoi farlo cosí semplicemente. Ci sono dei ADC con entrate differenziali, ma il valore deve essere sempre compreso tra le tensioni di alimentazone negativa (massa) e alimentazione positiva.

Se hai una tensione che non é riferita a massa puoi attacarla su un offset di 2,5V (un partitore resistivo con 2 resistenze uguali) e l' altro polo all'enrata analogica limitando la tensione a un escursione massima di +/- 2,5V

Ciao Uwe

bene bene mi arrangerò in qualche maniera e facendo dei test, in effetti arduino UNO sembra più robusto ed è decisamente più economico del DUE e i pin mi dovrebbero bastare però non riesco a capire come possa aumentare i bit con gli integrati, ADC forse per il fatto che il campionamento è molto veloce ma DAC se le porte PWM sono a 8bit più di quelli... no? cmq cercando ho trovato questi: TDA1543 e AD8139ARDZ dovrebbero andare

Theiden, questi due modulini, disponibili su Adafruit, possono forse esserti utili … :wink:

12 bit DAC : http://www.adafruit.com/products/935

16 bit ADC : http://www.adafruit.com/products/1085

Guglielmo

ok, grazie, però vorrei capire come posso aumentare i bit in uscita con un ADC se arduino ha una moduazione di soli 8 bit...

ADC è una cosa, DAC è un'altra. L'ADC è Analog-to-Digital-Converter ed è un circuito che converte un segnale analogico in digitale. Gli ingressi segnati come Ax dell'Arduino sono agganciati all'ADC interno.

Un DAC, Digital-to-Analog-Converter, fa l'opposto, ossia genera un segnale analogico da un valore digitale. L'Atmega328 dell'Arduino Uno NON ha un DAC. Quello che tu hai su alcuni pin segnati con il simbolo "~" è un segnale PWM, Pulse-Width-Modulation, che simula un segnale analogico ma non lo è.

Tra gli Arduino, solo la Due ha il DAC vero e proprio.

Con il PWM ad 8 bit tu simuli un segnale ad onda quadra. Gli 8 bit controllano il duty cycle, ossia il rapporto fra la cresta alta e la cresta bassa dell'onda.

Si si scusa ho solo sbagliato a scrivere, volevo dire: come posso mettere su arduino UNO un DAC a x bit (con x>8) e sfruttarli tutti se poi i dati gli arrivano da una fonte che ne ha solo 8 (cioè il PWM)?

Credo che non hai le idee chiare ;)

I due moduli che ti ho indicato sono due moduli [u]esterni/u...

... uno in grado di convertire 12 bit in un segnale analogico, quindi, tu hai il tuo "unsigned int" a 16 bit, mascherato 0x0FFF, che gli mandi e lui traduce il numero rappresentato dai 12 bit in una tensione (... Digital to Analog Converter).

L'altro è un modulo che dato un segnale analogico, lo converte in un numero a 16 bit (... quindi un "unsigned int") che poi tu ricevi e memorizzi (... Analog to Digital Converter). Anzi, se ben ricordo, il modulo contiene ben 4 ADC quindi puoi acquisire da 4 sorgenti diverse.

Ora, detto chiaramente ... se usi i moduli esterni ... che te ne frega della risoluzione del PWM di Arduino o di quant'altro ? Sono i moduli che hanno già all'interno i registri delle giuste dimensioni, tu li gestisci da programma con delle variabili adeguate :)

Guglielmo

si si li avevo visti, solo che no avevo capito come dargli i comandi (credevo via PWM), ora che ho letto che li prende direttamente via dati e che unsigned int ha 16 bit mi è tutto più chiaro, dunque il limite massimo è 16 bit? non che mi serve ma se volessi usare un DAC a, mettiamo, 20 bit comunque 4 bit li butterei giusto?

theiden: ... dunque il limite massimo è 16 bit? non che mi serve ma se volessi usare un DAC a, mettiamo, 20 bit comunque 4 bit li butterei giusto?

Scusa, ma [u]una bella letta[/u] al "Reference" di Arduino http://arduino.cc/en/Reference/HomePage prima di "fasciarsi la testa" NO ??? ]:D

L' "unsigned long" è un intero a 32 bit !!! :)

Guglielmo

Ci sono anche i moduli con ADC a 24bit.

zoomx: Ci sono anche i moduli con ADC a 24bit.

... che facciamo a gara a "chi ce l'ha più lungo" ??? ]:D

Allora esistono anche ADC/DAC a 32 bit ... come questi : http://uk.farnell.com/codecs/adc-dac-resolution/32bit/pg/110165544 :grin: :grin: :grin:

Guglielmo