Kazalo:

Arduino in PCF8591 ADC DAC IC: 7 korakov
Arduino in PCF8591 ADC DAC IC: 7 korakov

Video: Arduino in PCF8591 ADC DAC IC: 7 korakov

Video: Arduino in PCF8591 ADC DAC IC: 7 korakov
Video: Модуль ADS1115, 16-Bit АЦП, Обзор 2024, Julij
Anonim
Arduino in PCF8591 ADC DAC IC
Arduino in PCF8591 ADC DAC IC

Ste že kdaj želeli več analognih vhodnih zatičev pri svojem projektu Arduino, pa se niste želeli odločiti za Mega? Ali pa želite ustvariti analogne signale? Nato si oglejte temo naše vadnice - IC NXP PCF8591 IC.

Rešuje obe težavi, saj ima en sam DAC (digitalno -analogni) pretvornik in štiri ADC -je (analogno -digitalne pretvornike) - vse dostopne prek vodila I2C. PCF8591 je na voljo v DIP, površinski montaži in obliki modula, kar olajša eksperimentiranje.

Preden nadaljujete, prenesite podatkovni list. PCF8591 lahko deluje tako na 5V kot na 3.3V, tako da če uporabljate Arduino Due, Raspberry Pi ali drugo 3,3 V razvojno ploščo, ste v redu. Zdaj bomo najprej razložili DAC, nato ADC.

1. korak: Uporaba DAC (digitalno-analogni pretvornik)

Uporaba DAC (digitalno-analogni pretvornik)
Uporaba DAC (digitalno-analogni pretvornik)

DAC na PCF8591 ima ločljivost 8 bitov-zato lahko v 255 korakih ustvari teoretični signal med nič voltov in referenčno napetostjo (Vref). Za predstavitvene namene bomo uporabili Vref 5 V, lahko pa uporabite nižji Vref, na primer 3,3 V ali karkoli želite, da je največja vrednost … vendar mora biti manjša od napajalne napetosti.

Upoštevajte, da ko je na analognem izhodu obremenitev (stanje v realnem svetu), bo največja izhodna napetost padla-podatkovni list (ki ste ga prenesli) prikazuje 10-odstotni padec pri obremenitvi 10 kΩ. Zdaj za naše predstavitveno vezje.

Upoštevajte uporabo 10 kΩ vlečnih uporov na vodilu I2C in kondenzatorja 10 μF med 5 V in GND. Naslov vodila I2C je nastavljen s kombinacijo zatičev A0 ~ A2, pri vseh pa do GND je naslov 0x90. Analogni izhod lahko vzamete s pina 15 (na priključku 13. pa je ločen analogni GND. Povežite tudi pin 13 z GND in vezje GND z Arduino GND.

Za nadzor DAC moramo poslati dva bajta podatkov. Prvi je kontrolni bajt, ki preprosto aktivira DAC in je 1000000 (ali 0x40), naslednji bajt pa je vrednost med 0 in 255 (izhodna raven). To je prikazano na naslednji skici:

// Primer 52.1 Predstavitev DAC PCF8591

#include "Wire.h" #define PCF8591 (0x90 >> 1) // Naslov vodila I2C void setup () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // prebujanje PCF8591 Wire.write (0x40); // krmilni bajt - vklopi DAC (binarno 1000000) Wire.write (i); // vrednost za pošiljanje v DAC Wire.endTransmission (); // končaj oddajanje}

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

{Wire.beginTransmission (PCF8591); // prebujanje PCF8591 Wire.write (0x40); // krmilni bajt - vklopi DAC (binarno 1000000) Wire.write (i); // vrednost za pošiljanje v DAC Wire.endTransmission (); // končanje prenosa}}

Ste opazili bitni premik naslova vodila v stavku #define? Arduino pošilja 7-bitne naslove, PCF8591 pa želi 8-bitne, zato premaknemo bajt za en bit.

2. korak:

Slika
Slika

Rezultati skice so prikazani na sliki, Vref smo priključili na 5V in sondo osciloskopa in GND na analogni izhod oziroma GND.

3. korak:

Slika
Slika

Če imate radi krivulje, lahko s spodnjo skico ustvarite sinusne valove. Uporablja iskalno tabelo v nizu, ki vsebuje potrebne vnaprej izračunane podatkovne točke:

// Primer 52.2 Demo sinusni val DAC PCF8591 DAC

#include "Wire.h" #define PCF8591 (0x90 >> 1) // Naslov vodila I2C 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, 0xDx, 0xDx, 0xDx, 0xDx, 0xDx, 0xD, 0xD, 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0x, 0x 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6, 0x, 0x, 0xED, 0xEB, 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC, 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9, 0xC7, 0xC4x, 0xC4, 0xB4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC6 0xB3, 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7D, 0x7A, 0xD, 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, 0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x01, 0x02, 0x02, 0x02, 0x03 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x26, 0x24, 0x26 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37, 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D, 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x64, 0x64, 0x64, 0x64, 0x5E, 0x61, 0x64 0x70, 0x74, 0x77, 0x7A, 0x7D}; void setup () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // prebujanje PCF8591 Wire.write (0x40); // krmilni bajt - vklopi DAC (binarno 1000000) Wire.write (sine_wave ); // vrednost za pošiljanje v DAC Wire.endTransmission (); // končanje prenosa}}

4. korak:

Slika
Slika

Za naslednji izpis slike DSO smo Vref spremenili na 3,3 V - upoštevajte spremembo maksimumov na sinusnem valu.

Zdaj lahko eksperimentirate z DAC -om, da ustvarite zvočne učinke, signale ali nadzirate druga analogna vezja.

5. korak: Uporaba ADC-jev (analogno-digitalnih pretvornikov)

Če ste na svojem Arduinu uporabili funkcijo analogRead () (nazaj v prvem poglavju), potem že poznate ADC. Brez PCF8591 lahko beremo napetost med ničlo in Vref in vrnila bo vrednost med ničlo in 255, ki je neposredno sorazmerna z ničlo in Vref.

Na primer, merjenje 3,3 V bi moralo vrniti 168. Ločljivost (8-bitna) ADC-ja je nižja od vgrajenega Arduina (10-bitni), vendar lahko PCF8591 naredi nekaj, česar ADC Arduino ne zmore. Toda do tega bomo prišli v trenutku. Najprej, da preprosto preberemo vrednosti vsakega zatiča ADC, pošljemo kontrolni bajt, da PCF8591 pove, kateri ADC želimo prebrati. Za ADC -je od nič do tri je kontrolni bajt 0x00, 0x01, ox02 in 0x03.

Nato od ADC -ja zahtevamo dva bajta podatkov in shranimo drugi bajt za uporabo. Zakaj dva bajta? PCF8591 najprej vrne predhodno izmerjeno vrednost - nato trenutni bajt. (Glejte sliko 8 v podatkovnem listu). Nazadnje, če ne uporabljate vseh zatičev ADC, neuporabljene priključite na GND. Naslednja primerna skica preprosto pridobi vrednosti iz vsakega zatiča ADC eno za drugo, nato pa jih prikaže na serijskem monitorju:

#include "Wire.h"

#define PCF8591 (0x90 >> 1) // naslov vodila I2C #define ADC0 0x00 // krmilni bajti za branje posameznih ADC -jev #define ADC1 0x01 #define ADC2 0x02 #define ADC3 0x03 byte value0, value1, value2, value3; void setup () {Wire.begin (); Serial.begin (9600); } void loop () {Wire.beginTransmission (PCF8591); // prebujanje PCF8591 Wire.write (ADC0); // kontrolni bajt - preberite ADC0 Wire.endTransmission (); // konec prenosa Wire.requestFrom (PCF8591, 2); value0 = Wire.read (); value0 = Wire.read (); Wire.beginTransmission (PCF8591); // prebujanje PCF8591 Wire.write (ADC1); // kontrolni bajt - preberite ADC1 Wire.endTransmission (); // konec prenosa Wire.requestFrom (PCF8591, 2); value1 = Wire.read (); value1 = Wire.read (); Wire.beginTransmission (PCF8591); // prebujanje PCF8591 Wire.write (ADC2); // kontrolni bajt - preberite ADC2 Wire.endTransmission (); // konec prenosa Wire.requestFrom (PCF8591, 2); value2 = Wire.read (); value2 = Wire.read (); Wire.beginTransmission (PCF8591); // prebujanje PCF8591 Wire.write (ADC3); // kontrolni bajt - preberite ADC3 Wire.endTransmission (); // konec prenosa Wire.requestFrom (PCF8591, 2); value3 = Wire.read (); value3 = Wire.read (); Serial.print (vrednost0); Serial.print (""); Serial.print (vrednost1); Serial.print (""); Serial.print (vrednost2); Serial.print (""); Serial.print (vrednost3); Serial.print (""); Serial.println (); }

Ko zaženete skico, vam bodo v serijskem monitorju predstavljene vrednosti vsakega ADC -ja. Čeprav je bila preprosta predstavitev, ki vam je pokazala, kako posamezno prebrati vsak ADC, je to okorna metoda pridobivanja več kot enega bajta hkrati iz določenega ADC -ja.

6. korak:

Če želite to narediti, spremenite kontrolni bajt, da zahteva samodejno povečanje, kar naredite tako, da nastavite bit 2 kontrolnega bajta na 1. Zato za začetek od ADC0 uporabimo nov kontrolni bajt binarnega 00000100 ali šestnajstiškega 0x04. Nato zahtevajte pet bajtov podatkov (spet zanemarimo prvi bajt), zaradi česar bo PCF8591 vrnil vse vrednosti v eni verigi bajtov. Ta postopek je prikazan na naslednji skici:

#include "Wire.h"

#define PCF8591 (0x90 >> 1) // I2C naslov bajta value0, value1, value2, value3; void setup () {Wire.begin (); Serial.begin (9600); } void loop () {Wire.beginTransmission (PCF8591); // prebujanje PCF8591 Wire.write (0x04); // nadzorni bajt - preberite ADC0 in nato samodejno prirastejte Wire.endTransmission (); // konec prenosa Wire.requestFrom (PCF8591, 5); value0 = Wire.read (); value0 = Wire.read (); value1 = Wire.read (); value2 = Wire.read (); value3 = Wire.read (); Serial.print (vrednost0); Serial.print (""); Serial.print (vrednost1); Serial.print (""); Serial.print (vrednost2); Serial.print (""); Serial.print (vrednost3); Serial.print (""); Serial.println (); }

Prej smo omenili, da lahko PCF8591 naredi nekaj, česar Arduinov ADC ne zmore, in to ponuja diferencialni ADC. V nasprotju z enosmernim Arduinom (tj. Vrne razliko med napetostjo pozitivnega signala in GND, diferencialni ADC sprejme dva signala (ki jih ni treba nujno sklicevati na ozemljitev) in vrne razliko med obema signaloma To je lahko priročno za merjenje majhnih sprememb napetosti za merilne celice itd.

7. korak:

Slika
Slika

Nastavitev PCF8591 za diferencialni ADC je preprosta stvar pri spreminjanju kontrolnega bajta. Če se obrnete na sedmo stran podatkovnega lista, razmislite o različnih vrstah programiranja analognih vhodov. Prej smo za štiri vhode uporabljali način '00', lahko pa izberete druge, ki so jasno ponazorjeni, na primer sliko.

Torej, če želite nastaviti kontrolni bajt za dva diferencialna vhoda, uporabite binarno 00110000 ali 0x30. Potem je preprosto zahtevati bajte podatkov in delati z njimi. Kot lahko vidite, obstaja tudi kombinacija enojnega/diferencialnega in kompleksnega tri-diferencialnega vhoda. Vendar jih zaenkrat pustimo.

Upajmo, da vas je to zanimalo, ne glede na to, ali ste v svoje poskuse dodali DAC ali se naučili nekaj več o ADC -jih. Prosimo, da svoj PCF8591 naročite pri PMD Way.

To objavo vam je predstavil pmdway.com - vse za ustvarjalce in navdušence nad elektroniko z brezplačno dostavo po vsem svetu.

Priporočena: