Oggi vi presento analogComp, una libreria che potete usare per gestire il comparatore analogico integrato nei microcontrollori Atmel.Un comparatore analogico è sostanzialmente un amplificatore operazionale utilizzato in modalità comparatore di tensione che imposta su High la sua uscita quando la tensione presente sull’ingresso non invertente supera quella presente sull’ingresso invertente. Gli ingressi possono essere due pin esterni ai quali far pervenire le tensioni da comparare.
La libreria, che supporta una buona quantità di chip, permette sia di gestire una singola comparazione sia di richiamare una funzione tramite un interrupt ogni qual volta si manifesta una particolare condizione.
Metodi ed utilizzo
Come al solito, scaricate il pacchetto presente in fondo all’articolo e scompattatelo, fatto questo copiate la cartella /analogComp che avete ottenuto all’interno della cartella /libraries contenuta nella vostra cartella degli sketch.
Per poter utilizzare la libreria, dovete prima includerla con
#include "analogComp.h"
Adesso potete impostare ciò che deve essere connesso agli ingressi invertente (AIN-) e non invertente (AIN+) del comparatore analogico. Generalmente, AIN+ è connesso al piedino AIN0 ed AIN- è connesso al piedino AIN1. AIN+ può essere anche connesso alla tensione di riferimento interna (1,1V) mentre AIN- può anche essere connesso ad uno degli ingressi analogici del microcontrollore (vedi “Microcontrollori supportati” per alcune limitazioni specifiche).
Per scegliere gli ingressi del comparatore analogico si usa il metodo setOn():
analogComparator.setOn(AIN+, AIN-);
Le scelte per AIN+ sono le seguenti:
- AIN0: imposta il pin AIN0 come ingresso
- INTERNAL_REFERENCE: imposta la tensione interna di riferimento come ingresso
Per AIN- potete scegliere fra le seguenti voci:
- AIN1: imposta il pin AIN1 come ingresso
- A0..Ax: imposta uno specifico ingresso analogico (il valore massimo dipende dal tipo di microcontrollore, se superato viene scelto il pin A0)
AIN+ e AIN- sono opzionali, nel caso in cui non fossero passati verranno selezionati AIN0 e AIN1.
Si può attivare un interrupt in modo che esso esegua una routine al verificarsi di un evento:
analogComparator.enableInterrupt(miaFunzione[, evento]);
miaFunzione è la funzione che deve essere chiamata quando si verifica l’evento. evento può essere:
- CHANGE: quando la comparazione cambia fra AIN+>AIN- e AIN+<AIN-
- RISING: quando la tensione su AIN+ diventa maggiore di quella su AIN-
- FALLING: quando la tensione su AIN+ diventa minore di quella su AIN-
evento è opzionale, se non è specificato viene scelto CHANGE di default.
Si può anche disabilitare un interrupt precedentemente attivato:
analogComparator.disableInterrupt();
Si può anche attendere per un certo tempo che si verifichi la condizione che AIN+ diventi maggiore di AIN-:
analogComparator.waitComp([timeout]);
timeout è opzionale e rappresenta il numero di millisecondi da aspettare prima di ritornare al punto di chiamata (il valore di default è 5000). Questo metodo restituisce false (0) se la tensione su AIN- rimane maggiore di quella presente su AIN+ per tutto il periodo indicato da timeout; restituisce true (1) se AIN+ diventa maggiore di AIN- durante l’intervallo specificato.
Se il comparatore analogico non è stato impostato prima di chiamare il metodo waitComp, di default la liberia imposta come ingressi AIN0 e AIN1.
Per spengere il comparatore analogico e disattivare l’eventuale interrupt basta chiamare il metodo setOff():
analogComparator.setOff();
Microcontrollori supportati
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)
*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.
Since AIN0 is not available on an Arduino Mega 2560, what do I use instead?
I need to trigger an interrupt when an analog pin (e.g. A0) voltage is greater than 0.5 v
I’d very much appreciate if you could reply directly to my emai: dougr@telus.net
Leonardo, I was really glad to come across this library which at first blush appears to be straight forward to use. I’m running into an issue though with my Arduino YUN. It uses the 32U4 chip, so as far as I could determine from the libraries code the AIN1 will default to ADC0 or A5 on the Arduino YUN since the 32U4 has no AIN1. I built the test circuit you suggested in the analogComp_enableInterrupt example, namely A5 is plugged straight into the 3V terminal, and D7 (AIN0) is plugged into one end of a 10K resistor with the other end connected to ground. I upload the example touch a 5V jumper cable to the D7 jumper cable and nothing is happening. Any ideas? Thanks!
Never mind Leonardo, I figured it out. On the Atmega32U4 the interrupt function is ISR by default. Bravo, great library!
On my ATmega382p there are 8 analogue inputs. i couldn’t use ADC6 and ADC7. I think that is error. so probably change AnalogueComp.h the first contdition #define NUM_ANALOG_INPUTS 6 to #define NUM_ANALOG_INPUTS 8.
then it will work over the whole multiplexed input.
Nice library
Thanks
Not exactly an error, I didn’t consider the SMD version of the chip, that has more pins than the DIP one. If I change that setting by default, a user with a DIP chip could experience issues if he accidentally set a wrong input. I think that it’s better that anyone changes that setting to fit his own needs.
I can put a note into the documentation to inform users of this possibility.