Përmbajtje:
- Hapi 1: Përdorimi i DAC (Konvertuesi dixhital në analog)
- Hapi 2:
- Hapi 3:
- Hapi 4:
- Hapi 5: Përdorimi i ADC-ve (konvertuesit analogë-dixhitalë)
- Hapi 6:
- Hapi 7:
Video: Arduino dhe PCF8591 ADC DAC IC: 7 hapa
2024 Autor: John Day | [email protected]. E modifikuara e fundit: 2024-01-30 12:19
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)
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:
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:
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:
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:
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:
Si të krijoni dhe futni një tabelë dhe shtoni kolona shtesë dhe/ose rreshta në atë tabelë në Microsoft Office Word 2007: 11 hapa
Si të krijoni dhe futni një tabelë dhe shtoni kolona shtesë dhe/ose rreshta në atë tabelë në Microsoft Office Word 2007: A keni pasur ndonjëherë shumë të dhëna me të cilat po punoni dhe keni menduar me veten … " si mund t'i bëj të gjitha nga këto të dhëna duken më mirë dhe janë më të lehta për tu kuptuar? " Nëse është kështu, atëherë një tabelë në Microsoft Office Word 2007 mund të jetë përgjigja juaj
Lidhja e përpunimit dhe Arduino dhe Make 7 Segment dhe Servo GUI Controller: 4 hapa
Lidhja e përpunimit dhe Arduino dhe Make 7 Segment dhe Servo GUI Controller: Për disa projekte që keni bërë duhet të përdorni Arduino pasi siguron një platformë të lehtë prototipimi, por shfaqja e grafikëve në monitorin serik të Arduino mund të zgjasë shumë kohë dhe madje është e vështirë të bëhet. Ju mund të shfaqni grafikët në Arduino Serial Monitor bu
8 Kontrolli i stafetës me NodeMCU dhe Marrës IR duke përdorur WiFi dhe IR Telekomandë dhe Aplikacion Android: 5 hapa (me fotografi)
8 Rele Control me NodeMCU dhe IR Receiver Using WiFi and IR Remote and Android App: Kontrolli i 8 ndërprerësve të stafetave duke përdorur nodemcu dhe marrësin ir mbi wifi dhe ir aplikacionin e largët dhe android. Ir i largët punon pavarësisht nga lidhja wifi. K ISTU ASHT A KLIKIM I VERSIONIT TP PPRDITSUAR KETU
Shfaqja e temperaturës dhe lagështisë dhe mbledhja e të dhënave me Arduino dhe përpunimi: 13 hapa (me fotografi)
Shfaqja e Temperaturës dhe Lagështisë dhe Mbledhja e të Dhënave Me Arduino dhe Përpunimi: Hyrje: Ky është një Projekt që përdor një bord Arduino, një Sensor (DHT11), një kompjuter Windows dhe një Përpunim (një program pa shkarkim falas) për të shfaqur të dhënat e Temperaturës, Lagështisë në dixhital dhe forma e grafikut të shiritit, shfaqja e kohës dhe datës dhe ekzekutimi i kohës së numërimit
Qëndrim për laptopë me 3 hapa dhe 3 hapa (me syze leximi dhe tabaka me stilolaps): 5 hapa
Qëndrim për laptopë me hapa 3 & 3 hapa (me syze leximi dhe tabaka për stilolapsa): Kjo $ 3 & Qëndrimi i laptopit me 3 hapa mund të bëhet brenda 5 minutave. It'sshtë shumë e fortë, me peshë të lehtë dhe mund të paloset për ta marrë kudo që të shkoni