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:
GAIN_TWOTHIRDS (2/3-os erősítés, bemeneti tartomány +/- 6.144V)
GAIN_ONE (egyszeres erősítés, bemeneti tartomány +/-4.096V)
GAIN_TWO (kétszeres erősítés, bemeneti tartomány +/-2.048V)
GAIN_FOUR (négyszeres erősítés, bemeneti tartomány +/-1.024V)
GAIN_EIGHT (nyolcszoros erősítés, bemeneti tartomány +/-0.512V)
GAIN_SIXTEEN (tizenhatszoros erősítés, bemeneti tartomány +/-0.256V)
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);