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, Juli
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.

On 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 podatkovnu tablicu. 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 svrhu demonstracije koristit ćemo Vref od 5 V, a možete koristiti niži Vref, poput 3,3 V ili bilo što drugo što želite da bude najveća vrijednost … međutim mora biti manji 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 demonstracijsko kolo.

Obratite pažnju na upotrebu 10kΩ pull-up otpornika na I2C sabirnici 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 (izlazni nivo). 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 (binarno 1000000) Wire.write (i); // vrijednost za slanje u 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 (binarno 1000000) Wire.write (i); // vrijednost za slanje u DAC Wire.endTransmission (); // prekid prijenosa}}

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

Korak 2:

Image
Image

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

Korak 3:

Image
Image

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 točke podataka:

// Primjer 52.2 PCF8591 DAC demo -sinusni val

#include "Wire.h" #define PCF8591 (0x90 >> 1) // Adresa I2C 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, 0xDC, 0xDx, 0xD, 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, 0, 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, 0xB4x, 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, 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, 0x03, 0x03 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x26, 0x26, 0x26, 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, 0x5, 0x5, 0x61 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 u DAC Wire.endTransmission (); // prekid prijenosa}}

Korak 4:

Image
Image

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: Upotreba 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 -a i on će vratiti vrijednost između nule i 255 koja je izravno proporcionalna nuli i Vref -u.

Na primjer, mjerenje 3.3V treba vratiti 168. Rezolucija (8-bitna) ADC-a je niža 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 trenutak. Prvo, da bismo jednostavno pročitali vrijednosti svakog ADC pina, šaljemo kontrolni bajt da kaže 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 nazad 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 tehničkom listu). Konačno, ako ne koristite sve ADC pinove, povežite 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 I2C sabirnice #define ADC0 0x00 // kontrolni bajtovi za čitanje pojedinačnih ADC -ova #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); // 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 (value2); Serial.print (""); Serial.print (value3); Serial.print (""); Serial.println (); }

Nakon pokretanja skice bit će vam prikazane 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 glomazna 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 bajt vrijednost0, vrijednost1, vrijednost2, vrijednost3; 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 (value2); Serial.print (""); Serial.print (value3); Serial.print (""); Serial.println (); }

Ranije smo spomenuli da PCF8591 može učiniti nešto što Arduino ADC ne može, a to je ponuda diferencijalnog ADC -a. Za razliku od Arduinovog jednostrukog kraja (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:

Image
Image

Postavljanje PCF8591 za diferencijalni ADC jednostavno je promijeniti upravljački bajt. Ako okrenete 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 kontrolnog 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 širom svijeta.

Preporučuje se: