Sisällysluettelo:

Arduino ja PCF8591 ADC DAC IC: 7 vaihetta
Arduino ja PCF8591 ADC DAC IC: 7 vaihetta

Video: Arduino ja PCF8591 ADC DAC IC: 7 vaihetta

Video: Arduino ja PCF8591 ADC DAC IC: 7 vaihetta
Video: 4-БИТНЫЙ АЦП-ЦАП-ПРЕОБРАЗОВАТЕЛЬ НА ОДНОЙ ПЛАТЕ С ИСПОЛЬЗОВАНИЕМ ОУ И ДЕКОДЕРА Электронные проекты 2024, Heinäkuu
Anonim
Arduino ja PCF8591 ADC DAC IC
Arduino ja PCF8591 ADC DAC IC

Oletko koskaan halunnut enemmän analogisia tulonappeja Arduino -projektillesi, mutta et halunnut hakea Megaa? Tai haluatko luoda analogisia signaaleja? Tutustu sitten opetusohjelman aiheeseen - NXP PCF8591 IC.

Se ratkaisee molemmat ongelmat, koska siinä on yksi DAC (digitaalinen analogia) -muunnin ja neljä ADC: tä (analogisesta digitaaliseen muunnin) - kaikki käytettävissä I2C -väylän kautta. PCF8591 on saatavana DIP-, pinta -asennus- ja moduulimuodossa, mikä helpottaa kokeilua.

Lataa tietolomake ennen kuin jatkat. PCF8591 voi toimia sekä 5 V että 3,3 V jännitteellä, joten jos käytät Arduino Due-, Raspberry Pi- tai muuta 3,3 V: n kehityskorttia, olet kunnossa. Selitämme ensin DAC: n ja sitten ADC: t.

Vaihe 1: DAC: n (digitaalinen analogiamuunnin) käyttäminen

DAC: n (digitaalinen analogiamuunnin) käyttäminen
DAC: n (digitaalinen analogiamuunnin) käyttäminen

PCF8591: n DAC: n resoluutio on 8-bittinen-joten se voi tuottaa teoreettisen signaalin nollan voltin ja vertailujännitteen (Vref) välillä 255 vaiheessa. Esittelyä varten käytämme 5 V: n Vref -arvoa ja voit käyttää alempaa Vref -arvoa, kuten 3,3 V tai mitä haluat, että suurin arvo on… mutta sen on oltava pienempi kuin syöttöjännite.

Huomaa, että kun analogialähdössä on kuorma (todellinen tilanne), suurin lähtöjännite laskee-lataamasi tietolomake näyttää 10%: n pudotuksen 10 kΩ: n kuormituksella. Nyt esittelypiirillemme.

Huomaa, että I2C-väylässä on 10 kΩ: n vetovastus ja 10 μF: n kondensaattori 5 V: n ja GND: n välillä. I2C -väyläosoite asetetaan nastojen A0 ~ A2 yhdistelmällä, ja niiden kaikkien ollessa GND -osoite on 0x90. Analogialähtö voidaan ottaa nastasta 15 (ja erillinen analoginen GND on nastassa 13. Liitä myös nasta 13 GND: hen ja piiri GND Arduino GND: hen.

DAC: n hallitsemiseksi meidän on lähetettävä kaksi tavua dataa. Ensimmäinen on ohjaustavu, joka yksinkertaisesti aktivoi DAC: n ja on 1000000 (tai 0x40), ja seuraava tavu on arvo välillä 0-255 (lähtötaso). Tämä näkyy seuraavassa luonnoksessa:

// Esimerkki 52.1 PCF8591 DAC -esittely

#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C -väylän osoite void setup () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // herätys PCF8591 Wire.write (0x40); // control byte - kytke DAC päälle (binaarinen 1000000) Wire.write (i); // arvo lähetettäväksi DAC Wire.endTransmission (); // lopeta siirto}

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

{Wire.beginTransmission (PCF8591); // herätys PCF8591 Wire.write (0x40); // control byte - kytke DAC päälle (binaarinen 1000000) Wire.write (i); // arvo lähetettäväksi DAC Wire.endTransmission (); // lopeta siirto}}

Huomasitko väylän osoitteen bittimuutoksen #define -lauseessa? Arduino lähettää 7-bittisiä osoitteita, mutta PCF8591 haluaa 8-bittisen, joten siirrämme tavua yhdellä bitillä.

Vaihe 2:

Kuva
Kuva

Luonnoksen tulokset näkyvät kuvassa, olemme liittäneet Vrefin 5 V: een ja oskilloskooppianturin ja GND: n analogiseen lähtöön ja GND: hen.

Vaihe 3:

Kuva
Kuva

Jos pidät käyristä, voit luoda siniaaltoja alla olevan luonnoksen avulla. Se käyttää hakutaulukkoa taulukossa, joka sisältää tarvittavat ennalta lasketut datapisteet:

// Esimerkki 52.2 PCF8591 DAC -demo - siniaalto

#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C -väyläosoite 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, 0xD0, 0xD 0, 0xD 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC, 0xF, 0xF, 0xF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF 0xED, 0xEB, 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC, 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9, 0xC7, 0xC0, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4 0xB3, 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7D, 0x7A, 0x7, 0x7 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, Fx 0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x02 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x0 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37, 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D, 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x6, 0x61, 0x6 0x70, 0x74, 0x77, 0x7A, 0x7D}; void setup () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // herätys PCF8591 Wire.write (0x40); // control byte - kytke DAC päälle (binaarinen 1000000) Wire.write (sini_aalto ); // arvo lähetettäväksi DAC Wire.endTransmission (); // lopeta siirto}}

Vaihe 4:

Kuva
Kuva

Seuraavassa DSO -kuvanvedossa muutimme Vref -arvon 3.3V: ksi - huomaa siniaallon maksimien muutos.

Nyt voit kokeilla DAC: ää äänitehosteiden, signaalien tai muiden analogisten piirien ohjaamiseksi.

Vaihe 5: ADC: iden (analogisesta digitaalimuuntimeen) käyttäminen

Jos olet käyttänyt analogRead () -toimintoa Arduinollasi (takaisin luvussa 1), olet jo tutustunut ADC: hen. Ilman PCF8591 voimme lukea jännitteen nollan ja Vref: n välillä ja se palauttaa nollan ja 255: n välisen arvon, joka on suoraan verrannollinen nollaan ja Vref: ään.

Esimerkiksi 3.3 V: n mittauksen pitäisi palauttaa 168. ADC: n resoluutio (8-bittinen) on pienempi kuin sisäinen Arduino (10-bittinen), mutta PCF8591 voi tehdä jotain, mitä Arduinon ADC ei pysty. Mutta siihen päästään hetkessä. Ensinnäkin kunkin ADC -nastan arvojen yksinkertaiseksi lukemiseksi lähetämme ohjaustavu kertomaan PCF8591: lle, minkä ADC: n haluamme lukea. ADC: n nollasta kolmeen ohjaustavu on 0x00, 0x01, ox02 ja 0x03.

Sitten pyydämme kaksi tavua dataa takaisin ADC: ltä ja tallennamme toisen tavun käyttöön. Miksi kaksi tavua? PCF8591 palauttaa ensin aiemmin mitatun arvon - sitten nykyisen tavun. (Katso kuva 8 taulukossa). Lopuksi, jos et käytä kaikkia ADC -nastoja, yhdistä käyttämättömät GND: hen. Seuraava esimerkkihaku yksinkertaisesti hakee arvot kustakin ADC -nastasta yksi kerrallaan ja näyttää ne sitten sarjamonitorissa:

#sisältää "Wire.h"

#define PCF8591 (0x90 >> 1) // I2C -väyläosoite #define ADC0 0x00 // ohjaustavut yksittäisten ADC: iden lukemiseen #define ADC1 0x01 #define ADC2 0x02 #define ADC3 0x03 tavu arvo0, arvo1, arvo2, arvo3; void setup () {Wire.begin (); Sarja.alku (9600); } void loop () {Wire.beginTransmission (PCF8591); // herätys PCF8591 Wire.write (ADC0); // ohjaus tavu - lue ADC0 Wire.endTransmission (); // lopeta siirto Wire.requestFrom (PCF8591, 2); arvo0 = Wire.read (); arvo0 = Wire.read (); Wire.beginTransmission (PCF8591); // herätä PCF8591 Wire.write (ADC1); // ohjaus tavu - lue ADC1 Wire.endTransmission (); // lopeta lähetys Wire.requestFrom (PCF8591, 2); arvo1 = Wire.read (); arvo1 = Wire.read (); Wire.beginTransmission (PCF8591); // herätä PCF8591 Wire.write (ADC2); // ohjaus tavu - lue ADC2 Wire.endTransmission (); // lopeta siirto Wire.requestFrom (PCF8591, 2); arvo2 = Wire.read (); arvo2 = Wire.read (); Wire.beginTransmission (PCF8591); // herätys PCF8591 Wire.write (ADC3); // ohjaus tavu - lue ADC3 Wire.endTransmission (); // lopeta lähetys Wire.requestFrom (PCF8591, 2); value3 = Wire.read (); value3 = Wire.read (); Serial.print (arvo0); Serial.print (""); Serial.print (arvo1); Serial.print (""); Serial.print (arvo2); Serial.print (""); Serial.print (arvo3); Serial.print (""); Sarja.println (); }

Kun luonnos on suoritettu, sinulle näytetään sarjamonitorin kunkin ADC: n arvot. Vaikka se oli yksinkertainen osoitus siitä, kuinka voit lukea kunkin ADC: n erikseen, se on hankala tapa saada useampi kuin yksi tavu kerrallaan tietystä ADC: stä.

Vaihe 6:

Voit tehdä tämän muuttamalla ohjaustavun pyytämään automaattista lisäystä, joka tehdään asettamalla ohjaustavun bitti 2 arvoon 1. Joten aloitettaessa ADC0: sta käytämme uutta ohjaustavu binaarista 00000100 tai heksadesimaalista 0x04. Pyydä sitten viisi tavua dataa (jätämme jälleen huomiotta ensimmäisen tavun), mikä saa PCF8591 palauttamaan kaikki arvot yhdessä tavuketjussa. Tämä prosessi esitetään seuraavassa luonnoksessa:

#sisältää "Wire.h"

#define PCF8591 (0x90 >> 1) // I2C -väyläosoite tavu arvo0, arvo1, arvo2, arvo3; void setup () {Wire.begin (); Sarja.alku (9600); } void loop () {Wire.beginTransmission (PCF8591); // herätä PCF8591 Wire.write (0x04); // ohjaus tavu - lue ADC0 ja lisää sitten automaattisesti Wire.endTransmission (); // lopeta siirto Wire.requestFrom (PCF8591, 5); arvo0 = Wire.read (); arvo0 = Wire.read (); arvo1 = Wire.read (); value2 = Wire.read (); value3 = Wire.read (); Serial.print (arvo0); Serial.print (""); Serial.print (arvo1); Serial.print (""); Serial.print (arvo2); Serial.print (""); Serial.print (arvo3); Serial.print (""); Sarja.println (); }

Aiemmin mainitsimme, että PCF8591 voi tehdä jotain, mitä Arduinon ADC ei voi, ja tämä tarjoaa differentiaalisen ADC: n. Toisin kuin Arduinon yksipäinen (eli se palauttaa positiivisen signaalin jännitteen ja GND: n eron, differentiaali ADC hyväksyy kaksi signaalia (joita ei välttämättä tarvitse viitata maahan) ja palauttaa kahden signaalin välisen eron Tämä voi olla kätevää pienten jännitemuutosten mittaamiseen punnituskennoissa ja niin edelleen.

Vaihe 7:

Kuva
Kuva

PCF8591: n asettaminen differentiaaliselle ADC: lle on yksinkertainen tapa muuttaa ohjaustavu. Jos palaat tietolomakkeen sivulle seitsemän, harkitse analogiatulon eri ohjelmointityyppejä. Aiemmin käytimme tilaa '00' neljää tuloa varten, mutta voit valita muut selkeästi kuvatut, esimerkiksi kuvan.

Jos haluat asettaa ohjaustavu kahdelle differentiaalitulolle, käytä binääristä 00110000 tai 0x30. Sitten on yksinkertaista pyytää datatavuja ja työskennellä niiden kanssa. Kuten näette, siellä on myös yhdistelmä yksi/differentiaali ja monimutkainen kolmen differentiaalin tulo. Jätämme heidät kuitenkin toistaiseksi.

Toivottavasti löysit tämän kiinnostuksen kohteeksi, olitpa lisännyt DAC: n kokeisiisi tai oppinut hieman enemmän ADC: ista. Harkitse PCF8591: n tilaamista PMD Waylta.

Tämän viestin toi sinulle pmdway.com - kaikki valmistajille ja elektroniikan harrastajille, ilmainen toimitus maailmanlaajuisesti.

Suositeltava: