Sadržaj:

Arduino i PCF8591 ADC DAC IC: 7 koraka
Arduino i PCF8591 ADC DAC IC: 7 koraka

Video: Arduino i PCF8591 ADC DAC IC: 7 koraka

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

Jeste li ikada htjeli više analognih ulaznih pinova na svom Arduino projektu, ali niste htjeli izdvojiti Mega? Ili želite generirati analogne signale? Zatim provjerite temu našeg vodiča - NXP PCF8591 IC.

Rješava oba ova problema jer ima jedan DAC (digitalno -analogni) pretvarač, kao i četiri ADC -a (analogno -digitalna pretvarača) - svima dostupnim putem I2C sabirnice. PCF8591 je dostupan u DIP -u, površinskom montiranju i obliku modula, što olakšava eksperimentiranje.

Prije nego nastavite, preuzmite podatkovni list. PCF8591 može raditi i na 5V i na 3.3V pa ako koristite Arduino Due, Raspberry Pi ili drugu razvojnu ploču od 3.3 V, dobro ste. Sada ćemo prvo objasniti DAC, zatim ADC -ove.

Korak 1: Korištenje DAC-a (digitalno-analogni pretvarač)

Korištenje DAC-a (digitalno-analogni pretvarač)
Korištenje DAC-a (digitalno-analogni pretvarač)

DAC na PCF8591 ima rezoluciju od 8 bita-tako da može generirati teoretski signal između nula volti i referentnog napona (Vref) u 255 koraka. U demonstracijske svrhe koristit ćemo Vref od 5 V, a možete koristiti niži Vref, poput 3,3 V ili što god želite da maksimalna vrijednost bude … međutim mora biti manja od napona napajanja.

Imajte na umu da će, kada postoji opterećenje na analognom izlazu (situacija u stvarnom svijetu), maksimalni izlazni napon pasti-podatkovni list (koji ste preuzeli) pokazuje pad od 10% za opterećenje od 10 kΩ. Sada za naše pokazno kolo.

Obratite pozornost na uporabu 10kΩ pull-up otpornika na sabirnici I2C i kondenzatora od 10μF između 5V i GND. Adresa sabirnice I2C postavljena je kombinacijom pinova A0 ~ A2, a sa svima na GND adresa je 0x90. Analogni izlaz može se uzeti s pina 15 (a na pinu 13. postoji zasebni analogni GND. Također, spojite pin 13 na GND i spojite GND na Arduino GND.

Za kontrolu DAC -a moramo poslati dva bajta podataka. Prvi je kontrolni bajt, koji jednostavno aktivira DAC i iznosi 1000000 (ili 0x40), a sljedeći bajt je vrijednost između 0 i 255 (izlazna razina). To je prikazano na sljedećoj skici:

// Primjer 52.1 PCF8591 DAC demonstracija

#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C sabirnica adresa void setup () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // buđenje PCF8591 Wire.write (0x40); // kontrolni bajt - uključite DAC (binarni 1000000) Wire.write (i); // vrijednost za slanje na DAC Wire.endTransmission (); // prekid prijenosa}

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

{Wire.beginTransmission (PCF8591); // buđenje PCF8591 Wire.write (0x40); // kontrolni bajt - uključite DAC (binarni 1000000) Wire.write (i); // vrijednost za slanje na DAC Wire.endTransmission (); // prekid prijenosa}}

Jeste li primijetili pomak bita adrese sabirnice u #define izrazu? Arduino šalje 7-bitne adrese, ali PCF8591 želi 8-bitnu, pa pomaknemo bajt za jedan bit.

Korak 2:

Slika
Slika

Rezultati skice prikazani su na slici, spojili smo Vref na 5V, a sondu osciloskopa i GND na analogni izlaz, odnosno GND.

3. korak:

Slika
Slika

Ako volite krivulje, možete generirati sinusne valove sa skicom ispod. Koristi tablicu za pretraživanje u nizu koji sadrži potrebne unaprijed izračunate podatkovne točke:

// Primjer 52.2 PCF8591 DAC demo -sinusni val

#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C adresa sabirnice 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, 0xD, 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFx, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0x, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6, 0xFx, 0xF, 0xF, 0x 0xED, 0xEB, 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC, 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9, 0xC7, 0xC4x, 0xC4x, 0xC6, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC6, 0xC4 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 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x26, 0x26, 0x20, 0x26, 0x0, 0x0, 0x0, 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, 0x4, 0x5E, 0x61, 0x64, 0x4 0x70, 0x74, 0x77, 0x7A, 0x7D}; void setup () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // buđenje PCF8591 Wire.write (0x40); // kontrolni bajt - uključite DAC (binarni 1000000) Wire.write (sine_wave ); // vrijednost za slanje na DAC Wire.endTransmission (); // prekid prijenosa}}

Korak 4:

Slika
Slika

Za sljedeći DSO ispis slike, promijenili smo Vref na 3,3 V - imajte na umu promjenu maksimuma na sinusnom valu.

Sada možete eksperimentirati s DAC -om za stvaranje zvučnih efekata, signala ili upravljanje drugim analognim krugovima.

Korak 5: Korištenje ADC-ova (analogno-digitalnih pretvarača)

Ako ste koristili funkciju analogRead () na svom Arduinu (natrag u prvom poglavlju), tada ste već upoznati s ADC -om. Bez PCF8591 možemo očitati napon između nule i Vref i on će vratiti vrijednost između nule i 255 koja je izravno proporcionalna nuli i Vref.

Na primjer, mjerenje 3.3V treba vratiti 168. Razlučivost (8-bitna) ADC-a niža je od ugrađenog Arduina (10-bitnog), međutim PCF8591 može učiniti nešto što Arduino ADC ne može. Ali do toga ćemo doći za koji trenutak. Prvo, da bismo jednostavno pročitali vrijednosti svakog ADC pina, šaljemo kontrolni bajt koji će reći PCF8591 koji ADC želimo pročitati. Za ADC -ove od nule do tri, kontrolni bajt je 0x00, 0x01, ox02 i 0x03.

Zatim tražimo dva bajta podataka natrag iz ADC -a i spremamo drugi bajt za upotrebu. Zašto dva bajta? PCF8591 prvo vraća prethodno izmjerenu vrijednost - zatim trenutni bajt. (Pogledajte sliku 8 u podatkovnom listu). Konačno, ako ne koristite sve ADC pinove, spojite neiskorištene pinove na GND. Sljedeći primjer skice jednostavno preuzima vrijednosti sa svakog pina ADC -a jednu po jednu, a zatim ih prikazuje na serijskom monitoru:

#include "Wire.h"

#define PCF8591 (0x90 >> 1) // Adresa sabirnice I2C #define ADC0 0x00 // kontrolni bajtovi za čitanje pojedinačnih ADC -ova #define ADC1 0x01 #define ADC2 0x02 #define ADC3 0x03 vrijednost bajta0, vrijednost1, vrijednost2, vrijednost3; void setup () {Wire.begin (); Serial.begin (9600); } void loop () {Wire.beginTransmission (PCF8591); // buđenje PCF8591 Wire.write (ADC0); // kontrolni bajt - pročitajte ADC0 Wire.endTransmission (); // prekid prijenosa Wire.requestFrom (PCF8591, 2); value0 = Wire.read (); value0 = Wire.read (); Wire.beginTransmission (PCF8591); // buđenje PCF8591 Wire.write (ADC1); // kontrolni bajt - pročitajte ADC1 Wire.endTransmission (); // prekid prijenosa Wire.requestFrom (PCF8591, 2); value1 = Wire.read (); value1 = Wire.read (); Wire.beginTransmission (PCF8591); // buđenje PCF8591 Wire.write (ADC2); // kontrolni bajt - pročitajte ADC2 Wire.endTransmission (); // prekid prijenosa Wire.requestFrom (PCF8591, 2); value2 = Wire.read (); value2 = Wire.read (); Wire.beginTransmission (PCF8591); // buđenje PCF8591 Wire.write (ADC3); // kontrolni bajt - pročitajte ADC3 Wire.endTransmission (); // prekid prijenosa Wire.requestFrom (PCF8591, 2); value3 = Wire.read (); value3 = Wire.read (); Serial.print (value0); Serial.print (""); Serial.print (vrijednost1); Serial.print (""); Serial.print (vrijednost2); Serial.print (""); Serial.print (vrijednost3); Serial.print (""); Serial.println (); }

Nakon pokretanja skice prikazat će vam se vrijednosti svakog ADC -a u serijskom monitoru. Iako je to bila jednostavna demonstracija koja vam je pokazala kako pojedinačno čitati svaki ADC, to je nezgrapna metoda dobivanja više od jednog bajta odjednom iz određenog ADC -a.

Korak 6:

Da biste to učinili, promijenite kontrolni bajt kako biste zatražili automatsko povećanje, što se postiže postavljanjem bita 2 kontrolnog bajta na 1. Dakle, za početak od ADC0 koristimo novi kontrolni bajt binarnog 00000100 ili heksadecimalnog 0x04. Zatim zatražite pet bajtova podataka (još jednom zanemarujemo prvi bajt) što će uzrokovati da PCF8591 vrati sve vrijednosti u jednom lancu bajtova. Ovaj proces prikazan je na sljedećoj skici:

#include "Wire.h"

#define PCF8591 (0x90 >> 1) // I2C sabirnica adresa byte value0, value1, value2, value3; void setup () {Wire.begin (); Serial.begin (9600); } void loop () {Wire.beginTransmission (PCF8591); // buđenje PCF8591 Wire.write (0x04); // kontrolni bajt - pročitajte ADC0 pa automatski povećajte Wire.endTransmission (); // prekid prijenosa Wire.requestFrom (PCF8591, 5); value0 = Wire.read (); value0 = Wire.read (); value1 = Wire.read (); value2 = Wire.read (); value3 = Wire.read (); Serial.print (value0); Serial.print (""); Serial.print (vrijednost1); Serial.print (""); Serial.print (vrijednost2); Serial.print (""); Serial.print (vrijednost3); Serial.print (""); Serial.println (); }

Prije smo spomenuli da PCF8591 može učiniti nešto što Arduinov ADC ne može, a to je ponuda diferencijalnog ADC -a. Za razliku od jednostrukog Arduina (tj. Vraća razliku između napona pozitivnog signala i GND, diferencijalni ADC prihvaća dva signala (koja ne moraju nužno biti upućena na masu) i vraća razliku između dva signala Ovo može biti prikladno za mjerenje malih promjena napona za mjerne ćelije itd.

Korak 7:

Slika
Slika

Postavljanje PCF8591 za diferencijalni ADC jednostavno je promijeniti upravljački bajt. Ako se okrenete na sedmu stranicu podatkovnog lista, razmislite o različitim vrstama programiranja analognog ulaza. Ranije smo koristili način '00' za četiri ulaza, međutim možete odabrati ostale koji su jasno ilustrirani, na primjer sliku.

Dakle, za postavljanje upravljačkog bajta za dva diferencijalna ulaza, koristite binarni 00110000 ili 0x30. Tada je jednostavno zatražiti bajtove podataka i raditi s njima. Kao što vidite, postoji i kombinacija jedno/diferencijalnog i složenog trodiferencijalnog ulaza. Međutim, zasad ćemo ih ostaviti.

Nadamo se da vam je ovo bilo zanimljivo, bilo dodavanjem DAC -a u vaše eksperimente ili učenjem više o ADC -ovima. Molimo razmislite o naručivanju vašeg PCF8591 od PMD Way.

Ovaj post vam donosi pmdway.com - sve za proizvođače i ljubitelje elektronike, uz besplatnu dostavu diljem svijeta.

Preporučeni: