Tartalomjegyzék:

Arduino és PCF8591 ADC DAC IC: 7 lépés
Arduino és PCF8591 ADC DAC IC: 7 lépés

Videó: Arduino és PCF8591 ADC DAC IC: 7 lépés

Videó: Arduino és PCF8591 ADC DAC IC: 7 lépés
Videó: Electronic Basics #10: Digital to Analog Converter (DAC) 2024, Július
Anonim
Arduino és PCF8591 ADC DAC IC
Arduino és PCF8591 ADC DAC IC

Szeretett volna még több analóg bemeneti csatlakozót az Arduino projekthez, de nem akart megakarózni? Vagy analóg jeleket szeretne generálni? Ezután nézze meg oktatóanyagunk tárgyát - az NXP PCF8591 IC -t.

Mindkét problémát megoldja, mivel egyetlen DAC (digitális -analóg) konverterrel, valamint négy ADC -vel (analóg -digitális átalakító) rendelkezik - mindez az I2C buszon keresztül érhető el. A PCF8591 DIP, felületre szerelhető és modul formában kapható, ami megkönnyíti a kísérletezést.

Mielőtt továbblép, töltse le az adatlapot. A PCF8591 5 és 3,3 V feszültséggel is működhet, így ha Arduino Due, Raspberry Pi vagy más 3,3 V -os fejlesztőlapot használ, akkor minden rendben van. Most először elmagyarázzuk a DAC -t, majd az ADC -ket.

1. lépés: A DAC (digitális-analóg átalakító) használata

A DAC (digitális-analóg átalakító) használata
A DAC (digitális-analóg átalakító) használata

A PCF8591 DAC-ja 8 bites felbontású-így 255 lépésben nulla volt és a referenciafeszültség (Vref) közötti elméleti jelet tud generálni. Bemutató célokra 5 V -os Vref -et használunk, és használhat alacsonyabb Vref -et, például 3,3 V -ot, vagy bármit, aminek a maximális értékét kívánja … azonban kisebbnek kell lennie, mint a tápfeszültség.

Vegye figyelembe, hogy ha az analóg kimenet terhelés alatt van (valós helyzet), akkor a maximális kimeneti feszültség csökken-az adatlap (amelyet letöltött) 10% -os terhelés esetén 10% -os csökkenést mutat. Most a bemutató körünkre.

Vegye figyelembe a 10 kΩ-os felhúzó ellenállások használatát az I2C buszon, és a 10μF kondenzátort az 5 V és a GND között. Az I2C busz címét az A0 ~ A2 érintkezők kombinációja állítja be, és mindezekkel GND -re a cím 0x90. Az analóg kimenet a 15 -ös érintkezőből vehető fel (és külön analóg GND van a 13 -as tűn. Csatlakoztassa a 13 -as érintkezőt a GND -hez, és a GND áramkört az Arduino GND -hez.

A DAC vezérléséhez két bájt adatot kell elküldenünk. Az első a vezérlő bájt, amely egyszerűen aktiválja a DAC -t és 1000000 (vagy 0x40), a következő bájt pedig a 0 és 255 közötti érték (a kimeneti szint). Ezt bizonyítja az alábbi vázlat:

// 52.1. Példa PCF8591 DAC demo

#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C busz cím void setup () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // ébresztés PCF8591 Wire.write (0x40); // vezérlőbájt - DAC bekapcsolása (bináris 1000000) Wire.write (i); // a DAC Wire számára küldendő érték.endTransmission (); // az átadás befejezése}

mert (int i = 255; i> = 0; --i)

{Wire.beginTransmission (PCF8591); // ébresztés PCF8591 Wire.write (0x40); // vezérlőbájt - DAC bekapcsolása (bináris 1000000) Wire.write (i); // a DAC Wire számára küldendő érték.endTransmission (); // az átadás befejezése}}

Észrevette a busz cím biteltolódását a #define utasításban? Az Arduino 7 bites címeket küld, de a PCF8591 8 biteset akar, ezért egy bittel áthelyezzük a bájtot.

2. lépés:

Kép
Kép

A vázlat eredményei a képen láthatók, a Vref -et 5V -ra, az oszcilloszkóp szondát és a GND -t az analóg kimenetre és a GND -re kötöttük.

3. lépés:

Kép
Kép

Ha szereted a görbéket, akkor az alábbi vázlattal szinuszhullámokat generálhatsz. Keresési táblát használ egy tömbben, amely tartalmazza a szükséges előre kiszámított adatpontokat:

// 52.2. Példa PCF8591 DAC demo - szinusz

#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C busz cím uint8_t sine_wave [256] = {0x80, 0x83, 0x86, 0x89, 0x8C, 0x90, 0x93, 0x96, 0x99, 0x9C, 0x9F, 0xA2, 0xA5, 0xA8, 0xAB, 0xAE, 0xB1, 0xB3, 0xB6, 0xB9, 0xBC, 0xBF, 0xC1, 0xC4, 0xC7, 0xC9, 0xCC, 0xCE, 0xD1, 0xD3, 0xD0, 0xD5, 0xD 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC, 0xF, 0xF, 0xF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFx 0xED, 0xEB, 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC, 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9, 0xC7, 0xC4, 0xC0, 0xC4, 0xC4, 0xC4 0xB3, 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7D, 0x7A, 0x7, 0x7 0x67, 0x64, 0x61, 0x5E, 0x5B, 0x58, 0x55, 0x52, 0x4F, 0x4D, 0x4A, 0x47, 0x44, 0x41, 0x3F, 0x 3C, 0x39, 0x37, 0x34, 0x32, 0x2F, 0x2D, 0x2B, 0x28, 0x26, 0x24, 0x22, 0x20, 0x1E, 0x1C, 0x1A, 0x18, 0x16, 0x15, 0x13, 0x11, 0x10, 0x0, Fx 0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x26, 0x20 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37, 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D, 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x6, 0x6, 0x6 0x70, 0x74, 0x77, 0x7A, 0x7D}; void setup () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // ébresztés PCF8591 Wire.write (0x40); // vezérlőbájt - kapcsolja be a DAC -t (bináris 1000000) Wire.write (sine_wave ); // a DAC Wire számára küldendő érték.endTransmission (); // az átadás befejezése}}

4. lépés:

Kép
Kép

A következő DSO képkiíráshoz a Vref -et 3,3 V -ra cseréltük - jegyezzük meg a szinuszhullám maximális értékeinek változását.

Most kísérletezhet a DAC -val, hogy hanghatásokat, jeleket készítsen vagy más analóg áramköröket vezéreljen.

5. lépés: Az ADC-k (analóg-digitális konverterek) használata

Ha az analogRead () függvényt használta Arduino -ján (vissza az első fejezetben), akkor már ismeri az ADC -t. A PCF8591 nélkül a nulla és a Vref közötti feszültséget leolvashatjuk, és nulla és 255 közötti értéket ad vissza, amely egyenesen arányos a nullával és a Vref értékkel.

Például a 3.3V mérésének 168. értéket kell visszaadnia. Az ADC felbontása (8 bites) alacsonyabb, mint a fedélzeti Arduino (10 bites), azonban a PCF8591 képes olyasmire, amit az Arduino ADC-je nem. De erre egy pillanat alatt ráérünk. Először is, hogy egyszerűen leolvassuk minden egyes ADC pin értékét, küldünk egy vezérlőbájtot, hogy megmondjuk a PCF8591 -nek, hogy melyik ADC -t szeretnénk olvasni. Nulla -három ADC esetén a vezérlőbájt 0x00, 0x01, ox02 és 0x03.

Ezután két bájt adatot kérünk vissza az ADC -től, és a második bájtot tároljuk használatra. Miért két bájt? A PCF8591 először a korábban mért értéket adja vissza, majd az aktuális bájtot. (Lásd az adatlap 8. ábráját). Végül, ha nem használja az összes ADC -tűt, csatlakoztassa a nem használtakat a GND -hez. A következő példa vázlat egyszerűen egyenként lekéri az értékeket minden egyes ADC tűből, majd megjeleníti azokat a soros monitoron:

#include "Wire.h"

#define PCF8591 (0x90 >> 1) // I2C buszcím #define ADC0 0x00 // vezérlőbájtok az egyes ADC -k olvasásához #define ADC1 0x01 #define ADC2 0x02 #define ADC3 0x03 byte value0, value1, value2, value3; void setup () {Wire.begin (); Sorozat.kezdet (9600); } void loop () {Wire.beginTransmission (PCF8591); // ébresztés PCF8591 Wire.write (ADC0); // vezérlőbájt - olvassa el az ADC0 Wire.endTransmission (); // az átvitel befejezése Wire.requestFrom (PCF8591, 2); érték0 = Vezeték.olvasás (); érték0 = Vezeték.olvasás (); Wire.beginTransmission (PCF8591); // ébresztés PCF8591 Wire.write (ADC1); // vezérlő bájt - olvassa el az ADC1 Wire.endTransmission (); // az átvitel befejezése Wire.requestFrom (PCF8591, 2); érték1 = Vezeték.olvasás (); érték1 = Vezeték.olvasás (); Wire.beginTransmission (PCF8591); // ébresztés PCF8591 Wire.write (ADC2); // vezérlőbájt - olvassa el az ADC2 Wire.endTransmission (); // az átvitel befejezése Wire.requestFrom (PCF8591, 2); érték2 = Vezeték.olvasás (); érték2 = Vezeték.olvasás (); Wire.beginTransmission (PCF8591); // ébresztés PCF8591 Wire.write (ADC3); // vezérlőbájt - olvassa el az ADC3 Wire.endTransmission (); // az átvitel befejezése Wire.requestFrom (PCF8591, 2); érték3 = Huzal.olvasás (); érték3 = Huzal.olvasás (); Serial.print (érték0); Serial.print (""); Serial.print (érték1); Serial.print (""); Serial.print (érték2); Serial.print (""); Serial.print (érték3); Serial.print (""); Sorozat.println (); }

A vázlat futtatása után megjelennek az egyes ADC -k értékei a soros monitoron. Bár egyszerű bemutató volt, hogy megmutassa, hogyan kell egyénileg olvasni az egyes ADC -ket, ez nehézkes módszer arra, hogy egyszerre több bájtot szerezzen be egy adott ADC -ből.

6. lépés:

Ehhez módosítsa a vezérlőbájtot automatikus növelés kérésére, ami a vezérlőbájt 2. bitjének 1-re állításával történik. Tehát az ADC0-ból való induláshoz egy új vezérlőbájtot használunk, amely bináris 00000100 vagy hexadecimális 0x04. Ezután kérjen öt bájt adatot (ismét figyelmen kívül hagyjuk az első bájtot), ami miatt a PCF8591 visszaadja az összes értéket egy bájtláncban. Ezt a folyamatot az alábbi vázlat mutatja be:

#include "Wire.h"

#define PCF8591 (0x90 >> 1) // I2C busz cím bájt érték0, érték1, érték2, érték3; void setup () {Wire.begin (); Sorozat.kezdet (9600); } void loop () {Wire.beginTransmission (PCF8591); // ébresztés PCF8591 Wire.write (0x04); // vezérlő bájt - olvassa el az ADC0 -t, majd automatikusan növelje a Wire.endTransmission (); // az átvitel befejezése Wire.requestFrom (PCF8591, 5); érték0 = Vezeték.olvasás (); érték0 = Vezeték.olvasás (); érték1 = Vezeték.olvasás (); érték2 = Huzal.olvasás (); érték3 = huzal.olvasás (); Serial.print (érték0); Serial.print (""); Serial.print (érték1); Serial.print (""); Serial.print (érték2); Serial.print (""); Serial.print (érték3); Serial.print (""); Sorozat.println (); }

Korábban említettük, hogy a PCF8591 képes olyasmire, amire az Arduino ADC -je nem képes, és ez differenciális ADC -t kínál. Az Arduino egyvégűvel szemben (azaz visszaadja a pozitív jelfeszültség és a GND közötti különbséget, az ADC differenciál két jelet fogad el (amelyeket nem feltétlenül kell a földre vonatkoztatni), és visszaadja a két jel közötti különbséget Ez kényelmes lehet a terhelési cellák feszültségeinek kis változásainak mérésére stb.

7. lépés:

Kép
Kép

A PCF8591 beállítása a differenciális ADC -hez egyszerűen a vezérlőbájt megváltoztatása. Ha az adatlap hetedik oldalára lapoz, fontolja meg az analóg bemenet programozásának különböző típusait. Korábban a „00” módot használtuk négy bemenethez, de kiválaszthatja a többi jól látható ábrát, például a képet.

Tehát két vezérlőbájt beállításához két differenciális bemenethez használja a 00110000 vagy 0x30 bináris értéket. Ezután egyszerű az adatok bájtjainak lekérése és a velük való munka. Amint láthatja, van kombinált single/differenciál és komplex háromdifferenciális bemenet. Azonban egyelőre hagyjuk őket.

Remélhetőleg érdekesnek találta ezt, akár DAC hozzáadásával kísérleteihez, akár egy kicsit többet megtudhat az ADC -kről. Kérjük, fontolja meg PCF8591 megrendelését a PMD Way -től.

Ezt a bejegyzést a pmdway.com hozta neked - mindent a gyártóknak és az elektronika rajongóinak, ingyenes szállítással világszerte.

Ajánlott: