Analóg-digitális átalakító ADC


Az Arduinoba már van ADC beépítve de ez csak 10bites(1024) értéket képes kezelni, ha valakinek ennél nagyobb érzékenységű átalakítóra lenne szüksége akkor használhatók a külső ADC-k. Most az ADS1115-tel és az ADS1015-tel foglalkozunk. 3,3V és 5V mikrovezérlőkkel is üzemel, I2C kommunikációt használ így adattovábbítás két vezetéken megvalósul.

A következő paraméterek érvényesek az ADS1115 típusra:
16bit-es felbontás(65536),
programozható mintavételi sebesség 8-860minta/másodperc,
alacsony áramfelvétel 150mikroA,
belső oszcillátor,
belső PGA: programozható 16x belső erősítő,
I2C interfész, 4választható címzés,
négy egyszerű erősítő bemenet, vagy két differenciál,
programozható komparátor.


Az ADS1015 paraméterei:
12 bites felbontás
programozható minta vétel: 128 – 3300 minta / másodperc
alacsony áramfelvétel 150mikroA,
belső oszcillátor,
belső PGA: programozható 16x belső erősítő,
I2C interfész, 4választható címzés,
négy egyszerű erősítő bemenet, vagy két differenciál,
programozható komparátor.


Bekötése:
VDD – Arduino 5V
GND – Gnd
SDA – SDA(A4)
SCL – SCL(A5)
ADR – cím pin, négy lehetséges címzésre képes: ADR → GND-re kötve 0x48
                                                                              ADR → VDD-re kötve 0x49
                                                                              ADR → SDA-ra kötve 0x4A
                                                                              ADR → SCL-re kötve 0x4B

ez annyit tesz, hogy négy különböző eszközt kezelhetünk egyszerre a címek segítségével.


A négy darab egyoldalas aszimmetrikus erősítő bemenet A0 – A3 és az analóg föld GND,
vagy két darab differenciális bemenet 2 – 2 csatornával A0 – A1, A2 – A3.
Az aszimmetrikus erősítők csak pozitív feszültségről vesznek mintát 15(11) bittel. A differenciál
erősítők 16(12) bites felbontással pozitív negatív feszültséget mérnek, kis jelekből magas nyereséget
képesek létrehozni.

A bemenő jel feszültségnek a föld potenciál és a VCC között kell lenniük, ha a forrás negatív
feszültséget állít elő akkor el kell tolni azt, hogy a GND és Vcc közé essen.


Könyvtár letölthető a https://github.com/adafruit/Adafruit_ADS1X15 oldalról.


A kód:

#include <Wire.h>

#include <Adafruit_ADS1015.h>
Adafruit_ADS1015 ads1015; // létrehozzuk az ADS1015 objektumot 0x48 címzéssel
Adafruit_ADS1115 ads1115(0x49); // létrehozzuk az ADS1115 objektumot 0x49 címzéssel
void setup(void)
{
ads1015.begin(); // ads1015 inicializálás
ads1115.begin(); // ads1115
}


Egyoldalas konverzió:

#include <Wire.h>
#include <Adafruit_ADS1015.h>
Adafruit_ADS1015 ads1015;
void setup(void)
{
Serial.begin(9600);
Serial.println("Hello!");

Serial.println("Getting single-ended readings from AIN0..3");
Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV)");
ads1015.begin();//inicializálás
}

void loop(void)
{
int16_t adc0, adc1, adc2, adc3;

adc0 = ads1015.readADC_SingleEnded(0);// A0 bemenet értéklekérdezés
adc1 = ads1015.readADC_SingleEnded(1);
adc2 = ads1015.readADC_SingleEnded(2);
adc3 = ads1015.readADC_SingleEnded(3);
Serial.print("AIN0: "); Serial.println(adc0);//A0 értékkiíratás a soros monitora
Serial.print("AIN1: "); Serial.println(adc1);
Serial.print("AIN2: "); Serial.println(adc2);
Serial.print("AIN3: "); Serial.println(adc3);
Serial.println(" ");
delay(1000);
}


Differenciál konverzió:

#include <Wire.h>
#include <Adafruit_ADS1015.h>
Adafruit_ADS1015 ads1015;
void setup(void)
{
Serial.begin(9600);
Serial.println("Hello!");

Serial.println("Getting differential reading from AIN0 (P) and AIN1 (N)");
Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV)");
ads1015.begin();
}
void loop(void)
{
int16_t results;
results = ads1015.readADC_Differential_0_1();// differenciál érték beolvasása A0,A1-ről
Serial.print("Differential: "); Serial.print(results); Serial.print("("); Serial.print(results * 3); Serial.println("mV)");//kiíratás
delay(1000);
}


Komparátor működése:

a komparátor segítségével összehasonlíthatjuk a bemeneti feszültséget és a küszöb szintre beállított
feszültséget, ha meghaladja a küszöbértéket egy figyelmeztető jelet küld az ALRT pin-en.
Az ALRT lekérdezhető digitális bemeneten keresztül vagy belehet állítani, hogy megszakítást hozzon létre.

#include <Wire.h>
#include <Adafruit_ADS1015.h>
Adafruit_ADS1015 ads1015;
void setup(void)
{
Serial.begin(9600);
Serial.println("Hello!");
Serial.println("Single-ended readings from AIN0 with >3.0V comparator");
Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV)");
Serial.println("Comparator Threshold: 1000 (3.000V)");
ads1015.begin();

// 3V-os komparátor beállítása az A0-s kimenetre
ads1015.startComparator_SingleEnded(0, 1000);
}
void loop(void)
{
int16_t adc0;
// komparátor kiolvasása
adc0 = ads1015.getLastConversionResults();
Serial.print("AIN0: "); Serial.println(adc0);//kiíratás
delay(100);
}


Erősítés beállítása:

adsGain_t gain = getGain();//erősítést beállító parancs

Erősítés konstansai:

ads1015.setGain(GAIN_TWOTHIRDS); // 2/3x gain +/- 6.144V 1 bit = 3mV (default)

// ads1015.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2mV
// ads1015.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 1mV
// ads1015.setGain(GAIN_FOUR); // 4x gain +/- 1.024V 1 bit = 0.5mV
// ads1015.setGain(GAIN_EIGHT); // 8x gain +/- 0.512V 1 bit = 0.25mV
// ads1015.setGain(GAIN_SIXTEEN); // 16x gain +/- 0.256V 1 bit = 0.125mV


Nézzünk egy példát: ha van egy analóg hőmérőnk aminek a max kimenő feszültsége 2V. Ahhoz,
hogy teljes tartományba mérhessünk ezt fel kell erősítenünk 5V-os tartományba ilyenkor
használjuk GAIN_TWO konstans értéket, tehát a 2x erősítést.

ads1015.setGain(GAIN_TWO);