Talaan ng mga Nilalaman:

Arduino at PCF8591 ADC DAC IC: 7 Mga Hakbang
Arduino at PCF8591 ADC DAC IC: 7 Mga Hakbang

Video: Arduino at PCF8591 ADC DAC IC: 7 Mga Hakbang

Video: Arduino at PCF8591 ADC DAC IC: 7 Mga Hakbang
Video: How to Interface PCF8591 ADC/DAC Module with Arduino 2024, Nobyembre
Anonim
Arduino at PCF8591 ADC DAC IC
Arduino at PCF8591 ADC DAC IC

Ninanais mo na ba ang higit pang mga analogue input pin sa iyong proyekto ng Arduino, ngunit hindi mo nais na mag-fork out para sa isang Mega? O nais mo bang bumuo ng mga analogue signal? Pagkatapos suriin ang paksa ng aming tutorial - ang NXP PCF8591 IC.

Nalulutas nito ang parehong mga problemang ito dahil mayroon itong solong converter ng DAC (digital hanggang analogue) pati na rin ang apat na ADCs (analogue sa mga digital converter) - lahat ay maa-access sa pamamagitan ng I2C bus. Ang PCF8591 ay magagamit sa DIP, ibabaw na mount at form ng module, na ginagawang madali upang mag-eksperimento.

Bago magpatuloy, i-download ang sheet ng data. Ang PCF8591 ay maaaring gumana sa parehong 5V at 3.3V kaya kung gumagamit ka ng Arduino Due, Raspberry Pi o ibang 3.3 V development board ayos ka lang. Ngayon ay ipapaliwanag muna namin ang DAC, pagkatapos ang mga ADC.

Hakbang 1: Gamit ang DAC (digital-to-analogue Converter)

Gamit ang DAC (digital-to-analogue Converter)
Gamit ang DAC (digital-to-analogue Converter)

Ang DAC sa PCF8591 ay may isang resolusyon ng 8-bits - kaya maaari itong makabuo ng isang teoretikal na signal ng pagitan ng zero volts at ang sanggunian na boltahe (Vref) sa 255 na mga hakbang. Para sa mga layunin ng demonstrasyon gagamitin namin ang isang Vref ng 5V, at maaari mong gamitin ang isang mas mababang Vref tulad ng 3.3V o kung ano man ang nais mong maging maximum na halaga … subalit dapat itong mas mababa sa boltahe ng suplay.

Tandaan na kapag mayroong isang pag-load sa output ng analogue (isang sitwasyon sa totoong mundo), ang maximum na boltahe ng output ay mahuhulog - ang data sheet (na na-download mo) ay nagpapakita ng 10% na drop para sa isang 10kΩ load. Ngayon para sa aming circuit ng demonstrasyon.

Tandaan ang paggamit ng 10kΩ pull-up resistors sa I2C bus, at ang 10μF capacitor sa pagitan ng 5V at GND. Ang I2C bus address ay itinakda ng isang kumbinasyon ng mga pin A0 ~ A2, at sa kanilang lahat sa GND ang address ay 0x90. Ang output ng analogue ay maaaring makuha mula sa pin 15 (at mayroong isang hiwalay na analogue GND sa pin 13. Gayundin, ikonekta ang pin 13 sa GND, at circuit GND sa Arduino GND.

Upang makontrol ang DAC kailangan naming magpadala ng dalawang byte ng data. Ang una ay ang control byte, na pinapagana lang ang DAC at 1000000 (o 0x40) at ang susunod na byte ay ang halaga sa pagitan ng 0 at 255 (antas ng output). Ipinakita ito sa sumusunod na sketch:

// Halimbawa 52.1 PCF8591 DAC demo

# isama ang "Wire.h" #define PCF8591 (0x90 >> 1) // I2C bus address void setup () {Wire.begin (); } void loop () {para sa (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // gisingin ang PCF8591 Wire.write (0x40); // control byte - i-on ang DAC (binary 1000000) Wire.write (i); // halaga upang ipadala sa DAC Wire.endTransmission (); // end tranission}

para sa (int i = 255; i> = 0; --i)

{Wire.beginTransmission (PCF8591); // gisingin ang PCF8591 Wire.write (0x40); // control byte - i-on ang DAC (binary 1000000) Wire.write (i); // halaga upang ipadala sa DAC Wire.endTransmission (); // end tranission}}

Napansin mo ba ang kaunting paglilipat ng address ng bus sa pahayag na # tukuyin? Nagpapadala si Arduino ng 7-bit na mga address ngunit nais ng PCF8591 ng isang 8-bit, kaya inililipat namin ang byte ng isang piraso.

Hakbang 2:

Larawan
Larawan

Ang mga resulta ng sketch ay ipinapakita sa imahe, nakakonekta namin ang Vref sa 5V at ang oscilloscope probe at GND sa output ng analogue at GND ayon sa pagkakabanggit.

Hakbang 3:

Larawan
Larawan

Kung nais mo ang mga curve maaari kang makabuo ng mga sine alon na may sketch sa ibaba. Gumagamit ito ng isang talahanayan ng paghahanap sa isang array na naglalaman ng kinakailangang paunang kalkuladong mga puntos ng data:

// Halimbawa 52.2 PCF8591 DAC demo - sine alon

# isama ang "Wire.h" #define PCF8591 (0x90 >> 1) // I2C bus address 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, 0x, 0x, 0x, 0x, 0x, 0x 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 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6, 0xF5, 0xF4, 0xF, 0xF, 0xF, 0xF 0xED, 0xEB, 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC, 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9, 0xC7, 0xC4, 0xC, 0xC, 0xC, 0xC, 0xC 0xB3, 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7D, 0x7A, 0x77, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74 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, 0x0, 0x0, 0x0 0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x 0 0x04, 0x05, 0x06, 0x 0 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37, 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D, 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x6, 0x6, 0x6 0x70, 0x74, 0x77, 0x7A, 0x7D}; void setup () {Wire.begin (); } void loop () {para sa (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // gisingin ang PCF8591 Wire.write (0x40); // control byte - i-on ang DAC (binary 1000000) Wire.write (sine_wave ); // halaga upang ipadala sa DAC Wire.endTransmission (); // end tranission}}

Hakbang 4:

Larawan
Larawan

Para sa sumusunod na dump ng imahe ng DSO, binago namin ang Vref sa 3.3V - tandaan ang pagbabago sa maxima sa sine wave.

Ngayon ay maaari kang mag-eksperimento sa DAC upang makagawa ng mga sound effects, signal o makontrol ang iba pang mga analogue circuit.

Hakbang 5: Paggamit ng mga ADC (analogue-to-digital Converter)

Kung ginamit mo ang pagpapaandar ng analogRead () sa iyong Arduino (pabalik sa Kabanata Uno) pagkatapos ay pamilyar ka na sa isang ADC. Sa labas ng PCF8591 mababasa natin ang isang boltahe sa pagitan ng zero at ng Vref at ibabalik nito ang halaga na nasa pagitan ng zero at 255 na direktang proporsyonal sa zero at Vref.

Halimbawa, ang pagsukat ng 3.3V ay dapat bumalik 168. Ang resolusyon (8-bit) ng ADC ay mas mababa kaysa sa onboard Arduino (10-bit) subalit ang PCF8591 ay maaaring gumawa ng isang bagay na hindi maaaring hindi maipakita ng ADC ng Arduino. Ngunit makakarating tayo doon. Una, upang basahin lamang ang mga halaga ng bawat ADC pin nagpapadala kami ng isang byte ng kontrol upang sabihin sa PCF8591 kung aling ADC ang nais naming basahin. Para sa mga ADC na zero hanggang tatlo ang control byte ay 0x00, 0x01, ox02 at 0x03 ayon sa pagkakabanggit.

Pagkatapos hihilingin namin ang dalawang byte ng data pabalik mula sa ADC, at iimbak ang pangalawang byte para magamit. Bakit dalawang byte? Ibinabalik muna ng PCF8591 ang dating nasusukat na halaga - pagkatapos ay ang kasalukuyang byte. (Tingnan ang Larawan 8 sa sheet ng data). Panghuli, kung hindi mo ginagamit ang lahat ng mga pin ng ADC, ikonekta ang mga hindi nagamit sa GND. Ang sumusunod na halimbawa ng sketch ay kinukuha lamang ang mga halaga mula sa bawat ADC pin nang paisa-isa, pagkatapos ay ipinapakita ang mga ito sa serial monitor:

# isama ang "Wire.h"

#define PCF8591 (0x90 >> 1) // I2C bus address #define ADC0 0x00 // control bytes para sa pagbabasa ng mga indibidwal na ADC #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); // gisingin ang PCF8591 Wire.write (ADC0); // control byte - basahin ang ADC0 Wire.endTransmission (); // end tranission Wire.requestFrom (PCF8591, 2); halaga0 = Wire.read (); halaga0 = Wire.read (); Wire.beginTransmission (PCF8591); // gisingin ang PCF8591 Wire.write (ADC1); // control byte - basahin ang ADC1 Wire.endTransmission (); // end tranission Wire.requestFrom (PCF8591, 2); halaga1 = Wire.read (); halaga1 = Wire.read (); Wire.beginTransmission (PCF8591); // gisingin ang PCF8591 Wire.write (ADC2); // control byte - basahin ang ADC2 Wire.endTransmission (); // end tranission Wire.requestFrom (PCF8591, 2); halaga2 = Wire.read (); halaga2 = Wire.read (); Wire.beginTransmission (PCF8591); // gisingin ang PCF8591 Wire.write (ADC3); // control byte - basahin ang ADC3 Wire.endTransmission (); // end tranission Wire.requestFrom (PCF8591, 2); halaga3 = Wire.read (); halaga3 = Wire.read (); Serial.print (halaga0); Serial.print (""); Serial.print (halaga1); Serial.print (""); Serial.print (halaga2); Serial.print (""); Serial.print (halaga3); Serial.print (""); Serial.println (); }

Sa pagpapatakbo ng sketch bibigyan ka ng mga halaga ng bawat ADC sa serial monitor. Bagaman ito ay isang simpleng pagpapakita upang maipakita sa iyo kung paano isa-isa na basahin ang bawat ADC, ito ay isang masalimuot na pamamaraan ng pagkuha ng higit sa isang byte sa bawat oras mula sa isang partikular na ADC.

Hakbang 6:

Upang magawa ito, palitan ang control byte upang humiling ng auto-increment, na ginagawa sa pamamagitan ng pagtatakda ng bit 2 ng control byte sa 1. Kaya upang magsimula sa ADC0 gumagamit kami ng isang bagong byte ng kontrol ng binary 00000100 o hexadecimal 0x04. Pagkatapos ay humiling ng limang byte ng data (muli naming binabalewala ang unang byte) na magiging sanhi ng PCF8591 na ibalik ang lahat ng mga halaga sa isang kadena ng mga byte. Ang prosesong ito ay ipinakita sa sumusunod na sketch:

# isama ang "Wire.h"

#define PCF8591 (0x90 >> 1) // I2C bus address byte Value0, Value1, Value2, Value3; void setup () {Wire.begin (); Serial.begin (9600); } void loop () {Wire.beginTransmission (PCF8591); // gisingin ang PCF8591 Wire.write (0x04); // control byte - basahin ang ADC0 pagkatapos ay auto-increment Wire.endTransmission (); // end tranission Wire.requestFrom (PCF8591, 5); halaga0 = Wire.read (); halaga0 = Wire.read (); halaga1 = Wire.read (); halaga2 = Wire.read (); halaga3 = Wire.read (); Serial.print (halaga0); Serial.print (""); Serial.print (halaga1); Serial.print (""); Serial.print (halaga2); Serial.print (""); Serial.print (halaga3); Serial.print (""); Serial.println (); }

Dati ay nabanggit namin na ang PCF8591 ay maaaring gumawa ng isang bagay na hindi maaaring gawin ng Arduino's ADC, at ito ay nag-aalok ng isang kaugalian na ADC. Taliwas sa solong natapos ng Arduino (ibig sabihin, ibinabalik nito ang pagkakaiba sa pagitan ng positibong boltahe ng signal at GND, ang kaugalian na ADC ay tumatanggap ng dalawang signal (na hindi kinakailangang isangguni sa lupa), at ibabalik ang pagkakaiba sa pagitan ng dalawang signal Maaari itong maginhawa para sa pagsukat ng maliliit na pagbabago sa mga voltages para sa mga load cell at iba pa.

Hakbang 7:

Larawan
Larawan

Ang pag-set up ng PCF8591 para sa kaugalian ADC ay isang simpleng bagay ng pagbabago ng byte ng kontrol. Kung babaling ka sa pitong pahina ng data sheet, pagkatapos ay isaalang-alang ang iba't ibang mga uri ng analogue input program. Dati ginamit namin ang mode '00' para sa apat na input, subalit maaari mong piliin ang iba na malinaw na nakalarawan, halimbawa ang imahe.

Kaya upang maitakda ang control byte para sa dalawang kaugalian na input, gumamit ng binary 00110000 o 0x30. Pagkatapos ito ay isang simpleng usapin ng paghingi ng mga byte ng data at pagtatrabaho sa kanila. Tulad ng nakikita mo mayroon ding pinagsamang solong / kaugalian at isang kumplikadong tatlong-kaugalian na input. Gayunpaman iiwan namin sila sa ngayon.

Inaasahan kong natagpuan mo ito ng interes, maging pagdaragdag ng isang DAC sa iyong mga eksperimento o pag-aaral ng kaunti pa tungkol sa mga ADC. Mangyaring isaalang-alang ang pag-order ng iyong PCF8591 mula sa PMD Way.

Ang post na ito ay dinala sa iyo ng pmdway.com - lahat para sa mga tagagawa ng tagahanga at electronics, na may libreng paghahatid sa buong mundo.

Inirerekumendang: