Përmbajtje:

Arduino dhe PCF8591 ADC DAC IC: 7 hapa
Arduino dhe PCF8591 ADC DAC IC: 7 hapa

Video: Arduino dhe PCF8591 ADC DAC IC: 7 hapa

Video: Arduino dhe PCF8591 ADC DAC IC: 7 hapa
Video: [경희대 김동한] 2021-1 마이크로프로세서 (25) 2024, Nëntor
Anonim
Arduino dhe PCF8591 ADC DAC IC
Arduino dhe PCF8591 ADC DAC IC

A keni kërkuar ndonjëherë më shumë kunja analoge të hyrjes në projektin tuaj Arduino, por nuk keni dashur të dilni për një Mega? Apo dëshironi të gjeneroni sinjale analoge? Pastaj shikoni temën e mësimit tonë - IC NXP PCF8591.

Ai zgjidh të dyja këto probleme pasi ka një konvertues të vetëm DAC (dixhital në analog) si dhe katër ADC (konvertues analogë në dixhital) - të gjitha të arritshme përmes autobusit I2C. PCF8591 është i disponueshëm në formën e DIP, montimit në sipërfaqe dhe modulit, gjë që e bën të lehtë eksperimentimin me të.

Para se të vazhdoni, shkarkoni fletën e të dhënave. PCF8591 mund të funksionojë si në 5V ashtu edhe në 3.3V, kështu që nëse jeni duke përdorur një Arduino Due, Raspberry Pi ose bord tjetër të zhvillimit 3.3 V jeni mirë. Tani së pari do të shpjegojmë DAC, pastaj ADC.

Hapi 1: Përdorimi i DAC (Konvertuesi dixhital në analog)

Përdorimi i DAC (konvertuesi dixhital në analog)
Përdorimi i DAC (konvertuesi dixhital në analog)

DAC në PCF8591 ka një rezolutë prej 8-bit-kështu që mund të gjenerojë një sinjal teorik midis zero volt dhe tensionit të referencës (Vref) në 255 hapa. Për qëllime demonstrimi ne do të përdorim një Vref prej 5V, dhe ju mund të përdorni një Vref më të ulët si 3.3V ose çfarëdo që dëshironi që vlera maksimale të jetë … sidoqoftë duhet të jetë më pak se tensioni i furnizimit.

Vini re se kur ka një ngarkesë në daljen analoge (një situatë në botën reale), voltazhi maksimal i daljes do të bjerë-fleta e të dhënave (që keni shkarkuar) tregon një rënie 10% për një ngarkesë 10kΩ. Tani për qarkun tonë demonstrues.

Vini re përdorimin e rezistencave tërheqëse 10kΩ në autobusin I2C dhe kondensatorin 10μF midis 5V dhe GND. Adresa e autobusit I2C është vendosur nga një kombinim i kunjave A0 ~ A2, dhe me to të gjitha në GND adresa është 0x90. Dalja analoge mund të merret nga kunja 15 (dhe ka një GND analog të veçantë në kunjin 13. Gjithashtu, lidhni pinin 13 me GND dhe qarkoni GND me Arduino GND.

Për të kontrolluar DAC duhet të dërgojmë dy byte të dhënash. E para është bajti i kontrollit, i cili thjesht aktivizon DAC dhe është 1000000 (ose 0x40) dhe bajti tjetër është vlera midis 0 dhe 255 (niveli i daljes). Kjo demonstrohet në skicën e mëposhtme:

// Shembull 52.1 demonstrim i PCF8591 DAC

#include "Wire.h" #define PCF8591 (0x90 >> 1) // Adresa e autobusit I2C void setup () {Wire.begin (); } lak void () {për (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // zgjo PCF8591 Wire.write (0x40); // byte kontrolli - aktivizo DAC (binar 1000000) Wire.write (i); // vlera për t'u dërguar në DAC Wire.endTransmission (); // përfundoj transmetimin}

për (int i = 255; i> = 0; --i)

{Wire.beginTransmission (PCF8591); // zgjo PCF8591 Wire.write (0x40); // byte kontrolli - aktivizo DAC (binar 1000000) Wire.write (i); // vlera për t'u dërguar në DAC Wire.endTransmission (); // përfundoj transmetimin}}

A e vutë re ndryshimin e vogël të adresës së autobusit në deklaratën #define? Arduino dërgon adresa 7-bit, por PCF8591 dëshiron një 8-bit, kështu që ne e zhvendosim bajtin me një bit.

Hapi 2:

Imazhi
Imazhi

Rezultatet e skicës tregohen në imazh, ne kemi lidhur Vref me 5V dhe sondën e oshiloskopit dhe GND me daljen analoge dhe GND përkatësisht.

Hapi 3:

Imazhi
Imazhi

Nëse ju pëlqejnë kthesat mund të krijoni valë sinusale me skicën më poshtë. Ai përdor një tabelë kërkimi në një grup i cili përmban pikat e nevojshme të të dhënave të para-llogaritura:

// Shembulli 52.2 Vala demo -sinus PCF8591 DAC

#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C autobus adresë 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, 0xD5, 0xD8, 0xDA, 0xDC, 0xDE, 0xE0, 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC, 0xFD, 0xFD, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6, 0xF5, 0xF4, 0xF3, 0xF1, 0xF0, 0xEF, 0xED, 0xEB, 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC, 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9, 0xC7, 0xC4, 0xC1, 0xBF, 0xBC, 0xB9, 0xB6, 0xB3, 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7D, 0x7A, 0x77, 0x74, 0x70, 0x6D, 0x6A, 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, 0x0F, 0x0D, 0x0C, 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, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x24, 0x26, 0x28, 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37, 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D, 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x64, 0x67, 0x6A, 0x6D, 0x70, 0x74, 0x77, 0x7A, 0x7D}; void setup () {Wire.begin (); } void loop () {për (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // zgjo PCF8591 Wire.write (0x40); // byte kontrolli - aktivizo DAC (binar 1000000) Wire.write (sine_wave ); // vlera për t'u dërguar në DAC Wire.endTransmission (); // përfundoj transmetimin}}

Hapi 4:

Imazhi
Imazhi

Për deponinë e mëposhtme të imazhit të DSO, ne ndryshuam Vref në 3.3V - vini re ndryshimin në maksimumin në valën sinus.

Tani mund të eksperimentoni me DAC për të bërë efekte zanore, sinjale ose kontrolloni qarqe të tjera analoge.

Hapi 5: Përdorimi i ADC-ve (konvertuesit analogë-dixhitalë)

Nëse keni përdorur funksionin analogRead () në Arduino tuaj (prapa në Kapitullin e Parë), atëherë tashmë jeni njohur me një ADC. Pa PCF8591 ne mund të lexojmë një tension midis zero dhe Vref dhe do të kthejë një vlerë midis zero dhe 255 e cila është drejtpërdrejt proporcionale me zero dhe Vref.

Për shembull, matja e 3.3V duhet të kthejë 168. Rezolucioni (8-bit) i ADC është më i ulët se Arduino në bord (10-bit) megjithatë PCF8591 mund të bëjë diçka që ADC e Arduino nuk mund. Por ne do ta arrijmë atë në një moment. Së pari, për të lexuar thjesht vlerat e secilës pin ADC ne dërgojmë një bajt kontrolli për t'i treguar PCF8591 cilën ADC duam të lexojmë. Për ADC zero deri në tre, bajti i kontrollit është përkatësisht 0x00, 0x01, ox02 dhe 0x03.

Pastaj ne kërkojmë dy bajt të dhëna mbrapa nga ADC, dhe ruajmë bajtin e dytë për përdorim. Pse dy byte? PCF8591 së pari kthen vlerën e matur më parë - pastaj bajtin aktual. (Shih Figurën 8 në fletën e të dhënave). Së fundi, nëse nuk po përdorni të gjitha kunjat ADC, lidhni ato të papërdorura me GND. Shembulli i mëposhtëm i skicës thjesht merr vlerat nga secila kunj ADC një nga një, pastaj i shfaq ato në monitorin serik:

#përfshi "Wire.h"

#define PCF8591 (0x90 >> 1) // Adresa e autobusit I2C #define ADC0 0x00 // byte kontrolli për leximin e ADC -ve individuale #define ADC1 0x01 #define ADC2 0x02 #define ADC3 0x03 byte value0, value1, value2, value3; void setup () {Wire.begin (); Serial.filloj (9600); } void loop () {Wire.beginTransmission (PCF8591); // zgjo PCF8591 Wire.write (ADC0); // byte kontrolli - lexo ADC0 Wire.endTransmission (); // përfundoni transmetimin Wire.requestFrom (PCF8591, 2); vlera0 = Wire.read (); vlera0 = Wire.read (); Wire.beginTransmission (PCF8591); // zgjo PCF8591 Wire.write (ADC1); // byte kontrolli - lexo ADC1 Wire.endTransmission (); // përfundoni transmetimin Wire.requestFrom (PCF8591, 2); vlera1 = Wire.read (); vlera1 = Wire.read (); Wire.beginTransmission (PCF8591); // zgjo PCF8591 Wire.write (ADC2); // byte kontrolli - lexo ADC2 Wire.endTransmission (); // përfundoni transmetimin Wire.requestFrom (PCF8591, 2); vlera2 = Wire.read (); vlera2 = Wire.read (); Wire.beginTransmission (PCF8591); // zgjohu PCF8591 Wire.write (ADC3); // byte kontrolli - lexo ADC3 Wire.endTransmission (); // përfundoni transmetimin Wire.requestFrom (PCF8591, 2); vlera3 = Wire.read (); vlera3 = Wire.read (); Serial.print (vlera0); Serial.print (""); Serial.print (vlera 1); Serial.print (""); Serial.print (vlera2); Serial.print (""); Serial.print (vlera3); Serial.print (""); Serial.println (); }

Pas ekzekutimit të skicës, do të prezantoheni me vlerat e secilit ADC në monitorin serik. Edhe pse ishte një demonstrim i thjeshtë për t'ju treguar se si të lexoni individualisht çdo ADC, është një metodë e rëndë për të marrë më shumë se një bajt në të njëjtën kohë nga një ADC e veçantë.

Hapi 6:

Për ta bërë këtë, ndryshoni bajtin e kontrollit për të kërkuar rritje automatike, e cila bëhet duke vendosur bitin 2 të bajtit të kontrollit në 1. Pra, për të filluar nga ADC0 ne përdorim një bajt të ri kontrolli binar 00000100 ose hexadecimal 0x04. Pastaj kërkoni pesë byte të dhënash (edhe një herë ne injorojmë bajtin e parë) të cilat do të bëjnë që PCF8591 të kthejë të gjitha vlerat në një zinxhir byte. Ky proces demonstrohet në skicën e mëposhtme:

#përfshi "Wire.h"

#define PCF8591 (0x90 >> 1) // adresa e autobusit I2C byte vlera0, vlera1, vlera2, vlera3; void setup () {Wire.begin (); Serial.filloj (9600); } void loop () {Wire.beginTransmission (PCF8591); // zgjo PCF8591 Wire.write (0x04); // byte kontrolli - lexoni ADC0 pastaj shtoni automatikisht Wire.endTransmission (); // përfundoni transmetimin Wire.requestFrom (PCF8591, 5); vlera0 = Wire.read (); vlera0 = Wire.read (); vlera1 = Wire.read (); vlera2 = Wire.read (); vlera3 = Wire.read (); Serial.print (vlera0); Serial.print (""); Serial.print (vlera 1); Serial.print (""); Serial.print (vlera2); Serial.print (""); Serial.print (vlera3); Serial.print (""); Serial.println (); }

Më parë kemi përmendur se PCF8591 mund të bëjë diçka që ADC e Arduino nuk mundet, dhe kjo është të ofrojë një ADC diferenciale. Për dallim nga Arduino me një fund (domethënë ai kthen ndryshimin midis tensionit pozitiv të sinjalit dhe GND, diferenciali ADC pranon dy sinjale (që jo domosdoshmërisht duhet të referohen në tokë), dhe kthen ndryshimin midis dy sinjaleve Kjo mund të jetë e përshtatshme për matjen e ndryshimeve të vogla të tensioneve për qelizat e ngarkesës dhe kështu me radhë.

Hapi 7:

Imazhi
Imazhi

Vendosja e PCF8591 për ADC diferenciale është një çështje e thjeshtë e ndryshimit të bajtit të kontrollit. Nëse ktheheni në faqen shtatë të fletës së të dhënave, atëherë merrni parasysh llojet e ndryshme të programimit analog të hyrjes. Më parë kemi përdorur modalitetin '00' për katër hyrje, megjithatë ju mund të zgjidhni të tjerat të cilat janë të ilustruara qartë, për shembull imazhin.

Pra, për të vendosur bajtin e kontrollit për dy hyrje diferenciale, përdorni binar 00110000 ose 0x30. Atëherë është një çështje e thjeshtë të kërkosh bajt të të dhënave dhe të punosh me to. Siç mund ta shihni, ekziston gjithashtu një kombinim i vetëm/diferencial dhe një hyrje komplekse tre-diferenciale. Sidoqoftë, ne do t'i lëmë ata për momentin.

Shpresoj se e keni gjetur këtë me interes, qoftë duke shtuar një DAC në eksperimentet tuaja ose duke mësuar pak më shumë rreth ADC -ve. Ju lutemi konsideroni të porosisni PCF8591 tuaj nga PMD Way.

Ky postim ju është sjellë nga pmdway.com - gjithçka për prodhuesit dhe entuziastët e elektronikës, me shpërndarje falas në të gjithë botën.

Recommended: