analogComp, una libreria per gestire il comparatore analogico

flz47655:
Se non specificato di default viene passato CHANGE

Che vergogna, non ricordarsi neanche cosa fanno le proprie librerie :sweat_smile: :sweat_smile:
E’ vero, di default prende CHANGE :wink:

flz47655:
Il problema nella libreria è l’ISR che è chiamata sui Tiny e su altri micro ANA_COMP_vect mentre nell’ATmega328P ed in altri è chiamata ANALOG_COMP_vect

Grazie della segnalazione. Ho corretto il codice, adesso seleziona il vettore in base al micro.
Il file cpp corretto te lo allego qui sotto. Poi metterò tutto online sul mio sito (ho l’host in manutenzione).

analogComp.cpp (4.75 KB)

leo72: Attualmente la libreria lavora con una buona quantità di microcontrollori Atmel e schede Arduino:

  • Attiny2313/4313
  • Attiny24/44/84
  • Attiny25/45/85
  • Atmega344/644/1284
  • Atmega8
  • Atmega48/88/168/328 (Arduino UNO)
  • Atmega640/1280/1281/2560/2561 (Arduino MEGA)
  • Atmega32U4* (Arduino Leonardo)

*il supporto di alcuni di essi è solo "su carta", vanno materialmente provati

Limitazioni specifiche

  • Attiny2313/4313: a causa del fatto che queste MCU non hanno un ADC integrato, per AIN- è possibile selezionare solo AIN1
  • Atmega32U4: l’AIN- dell’Atmega32U4 può essere connesso solo ad un ingresso analogico a causa del fatto che esso non ha un pin AIN1.

Scusa, che tu sappia, questa libreria è supportata anche dal Atmel SAM3X8E ARM Cortex-M3 di Arduino Due? Grazie.

assolutamente no, il chip è troppo differente, a meno che leo non si sia preso una due la vedo dura

La Due ce l'ho ma non ho portato la lib per il Sam3x per il semplice fatto che questo chip non ha un comparatore analogico integrato.

leo72: La Due ce l'ho ma non ho portato la lib per il Sam3x per il semplice fatto che questo chip non ha un comparatore analogico integrato.

Ah ok grazie ... Premetto che sono alle prime armi ... ma per la mia tesi avrei bisogno di sapere se per realizzare il comparatore analogico mi basta introdurre qualche 'if' nello sketch, oppure se c'è un modo più efficiente ... Grazie ancora.

Il comparatore è un vero e proprio amplificatore operazionale integrato in alcuni chip. Quasi tutti gli AVR8 ce l'hanno. In pratica è l'op-amp stesso che fa il lavoro, tu a livello di codice non devi far altro che gestire l'interrupt che genera l'op-amp quando si verifica la condizione impostata.

Puoi anche realizzarlo a livello software, usando un ingresso analogico ed una routine che controlla periodicamente se il valore dell'ingresso è superiore o inferiore ad una predeterminata soglia ma non avrai mai la precisione di un op-amp né la stessa velocità (una lettura analogica è lenta). Potresti replicare la funzione usando un op-amp esterno con uscita collegata ad un pin interrupt del chip, in modo che se l'op-amp "scatta" ti attiva l'interrupt, che intercetti da codice.

Grazie mille!

Scusa una cosa però ... Dato che quello che mi serve è l'integrazione stessa di un multivibratore astabile, se devo utilizzare dei comparatori esterni è inutile comprare Arduino Due ... o sbaglio?

Quello che stai facendo lo sai tu, mica posso leggerti nel pensiero ;) Perciò non so se la Due ti serve per un qualche motivo oppure no.

XD Certo :D ... Difatti la mia era una sorta di richiesta di conferma sull'utilizzo di Arduino Due per l'integrazione di un multivibratojavascript:void(0);re astabile :)

la questione non e' "la uno, la due o la tre", la questione e' se un implementazione sw, con tutte le lentezze che ne derivano, basta per la tua applicazione e questo lo puoi sapere solo tu :)

leo72: Il comparatore è un vero e proprio amplificatore operazionale integrato in alcuni chip. Quasi tutti gli AVR8 ce l'hanno. In pratica è l'op-amp stesso che fa il lavoro, tu a livello di codice non devi far altro che gestire l'interrupt che genera l'op-amp quando si verifica la condizione impostata. Puoi anche realizzarlo a livello software, usando un ingresso analogico ed una routine che controlla periodicamente se il valore dell'ingresso è superiore o inferiore ad una predeterminata soglia ma non avrai mai la precisione di un op-amp né la stessa velocità (una lettura analogica è lenta). Potresti replicare la funzione usando un op-amp esterno con uscita collegata ad un pin interrupt del chip, in modo che se l'op-amp "scatta" ti attiva l'interrupt, che intercetti da codice.

Forse non ho letto bene qui nel thread e sul manuale Atmel 328. Mi pare di aver letto che se per AIN- si utilizza un pin analogico, allora l'ADC non può essere utilizzato, viene disabilitato. Dico una bestialità ?

Sì, è giusto. Se attivi uno degli ingressi dell'ADC come pin AIN-, l'ADC viene disattivato. Ma non è obbligatorio usare un pin analogico come ingresso invertente, il 328 ha uno specifico pin denominato AIN1, che è il piedino PD7, basta attaccare la tensione lì e l'ADC non viene toccato.

leo72: Sì, è giusto. Se attivi uno degli ingressi dell'ADC come pin AIN-, l'ADC viene disattivato. Ma non è obbligatorio usare un pin analogico come ingresso invertente, il 328 ha uno specifico pin denominato AIN1, che è il piedino PD7, basta attaccare la tensione lì e l'ADC non viene toccato.

Grazie per la risposta. In un altro topic ti ho posto una domanda, posso riproporla qui? Scusa l'ignoranza, ho letto anche il datasheet del 328 ma c'e' solo una paginetta. Non mi è chiaro. In quel caso proponi ad un utente di usare il comparatore per verificare se una pila da 1,5V scende sotto i 1,3V (almeno questo vuole fare l'utente). Perciò in AIN1 (AIN-) colleghi il positivo della pila e in AIN+ a cosa lo colleghi per avere un riferimento? Se AIN+ è analog_reference okay ma è solo a 1,1V giusto?

ma la pila e' un elemento da controllare esterno o e' l'alimentazione stessa ? se e' un componente esterno, cioe' ad esempio se il tizzio vuole fare un tester di batterie, su un capo del comparatore metti la batteria da misurare e sull'altro un partitore che a partire dalla tensione di alimentazione ti crea il riferimento di 1,3V Vedilo come un normale OAmp

ok, grazie, non ci avevo pensato!! In elettronica sono ancora una capra :blush:

figurati, mai quanto me con il sw :)

Testato: un partitore che a partire dalla tensione di alimentazione ti crea il riferimento di 1,3V

Serve però una tensione bella stabile perché l'AC interno è sensibile, se ti fluttua l'alimentazione, ti fluttua anche il riferimento e quindi anche l'intervento dell'AC stesso. Meglio nei casi in cui serve precisione usare il riferimento interno a 1,1V oppure un riferimento esterno fatto da un integrato atto allo scopo.

in questo caso dove si parla di batteria, di valori di decimi di Volt da monitorare, grandezza enorme, il semplice regolatore della uno va piu’ che bene

leo72: ... oppure un riferimento esterno fatto da un integrato atto allo scopo.

Suggerisco il MAX6043 ... costa poco e mi sembra molto adatto (visto i valori di tensione disponibili) all'uso con Arduino ;)

Guglielmo