Sisukord:

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

Video: Arduino ja PCF8591 ADC DAC IC: 7 sammu

Video: Arduino ja PCF8591 ADC DAC IC: 7 sammu
Video: Модуль ADS1115, 16-Bit АЦП, Обзор 2024, Juuli
Anonim
Arduino ja PCF8591 ADC DAC IC
Arduino ja PCF8591 ADC DAC IC

Kas olete kunagi soovinud oma Arduino projekti jaoks rohkem analoogsisendit, kuid pole tahtnud Mega jaoks välja töötada? Või soovite luua analoogsignaale? Seejärel vaadake meie õpetuse teemat - NXP PCF8591 IC.

See lahendab mõlemad probleemid, kuna sellel on üks DAC (digitaal -analoog) muundur ja neli ADC -d (analoog -digitaalmuundurid) - kõik on ligipääsetavad I2C -siini kaudu. PCF8591 on saadaval DIP-, pinnakinnitus- ja moodulvormis, mis muudab katsetamise lihtsaks.

Enne jätkamist laadige andmeleht alla. PCF8591 võib töötada nii 5 V kui ka 3,3 V toitel, nii et kui kasutate Arduino Due, Raspberry Pi või muud 3,3 V arendusplaati, on teil kõik korras. Nüüd selgitame kõigepealt DAC -i, seejärel ADC -sid.

Samm 1: DAC-i (digitaal-analoogmuundur) kasutamine

DAC (digitaal-analoogmuundur) kasutamine
DAC (digitaal-analoogmuundur) kasutamine

PCF8591 DAC-i eraldusvõime on 8-bitine-seega võib see 255 sammuga tekitada teoreetilise signaali nullvolti ja võrdluspinge (Vref) vahel. Näitlikel eesmärkidel kasutame 5 V Vref -i ja võite kasutada madalamat Vref -i, näiteks 3,3 V või mida iganes soovite, et maksimaalne väärtus oleks… kuid see peab olema väiksem kui toitepinge.

Pange tähele, et kui analoogväljund on koormatud (reaalses olukorras), langeb maksimaalne väljundpinge-andmeleht (mille alla laadisite) näitab 10% koormuse 10% langust. Nüüd meie tutvustusskeemist.

Pange tähele, et I2C siinil kasutatakse 10kΩ tõmbetakistusi ja 10μF kondensaatorit 5V ja GND vahel. I2C siiniaadress määratakse tihvtide A0 ~ A2 kombinatsiooni abil ja koos kõigi GND -ga on aadress 0x90. Analoogväljundit saab võtta tihvtist 15 (ja tihvtil 13 on eraldi analoog GND. Samuti ühendage tihvt 13 GND -ga ja ahel GND Arduino GND -ga.

DAC -i juhtimiseks peame saatma kaks baiti andmeid. Esimene on juhtbait, mis lihtsalt aktiveerib DAC ja on 1000000 (või 0x40) ning järgmine bait on väärtus vahemikus 0 kuni 255 (väljundtase). Seda näitab järgmine visand:

// Näide 52.1 PCF8591 DAC demo

#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C siiniaadressi void setup () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // äratus PCF8591 Wire.write (0x40); // juhtbait - lülita sisse DAC (binaarne 1000000) Wire.write (i); // väärtus, mida saata DAC Wire.endTransmission (); // transmissiooni lõpetamine}

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

{Wire.beginTransmission (PCF8591); // äratus PCF8591 Wire.write (0x40); // juhtbait - lülita sisse DAC (binaarne 1000000) Wire.write (i); // väärtus, mida saata DAC Wire.endTransmission (); // lõpeta ülekanne}}

Kas märkasite #define avalduses siiniaadressi bittide nihet? Arduino saadab 7-bitiseid aadresse, kuid PCF8591 soovib 8-bitist, nii et nihutame baiti ühe bitti.

2. samm:

Pilt
Pilt

Visandi tulemused on näidatud pildil, oleme ühendanud Vref 5V ja ostsilloskoobi anduri ning GND vastavalt analoogväljundi ja GND -ga.

3. samm:

Pilt
Pilt

Kui teile meeldivad kõverad, saate alloleva visandiga tekitada siinuslaineid. See kasutab otsingutabelit massiivis, mis sisaldab vajalikke eelnevalt arvutatud andmepunkte:

// Näide 52.2 PCF8591 DAC demo - siinuslaine

#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C siin aadress 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, 0xFx 0xED, 0xEB, 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC, 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9, 0xC7, 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, 0x6, 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 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x20 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 () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // äratus PCF8591 Wire.write (0x40); // juhtbait - lülita sisse DAC (binaarne 1000000) Wire.write (sine_wave ); // väärtus, mida saata DAC Wire.endTransmission (); // lõpeta ülekanne}}

4. samm:

Pilt
Pilt

Järgmise DSO -pildipildi jaoks muutsime Vref -i väärtuseks 3,3 V - pange tähele siinuslaine maksimumide muutumist.

Nüüd saate DAC -iga katsetada, et luua heliefekte, signaale või juhtida muid analooglülitusi.

Samm 5: ADC-de (analoog-digitaalmuundurid) kasutamine

Kui olete oma Arduino -s kasutanud funktsiooni analogRead () (tagasi esimeses peatükis), olete ADC -ga juba tuttav. Ilma PCF8591 -ta saame lugeda pinget nulli ja Vrefi vahel ning see tagastab väärtuse vahemikus 0 kuni 255, mis on otseselt võrdeline nulli ja Vref -iga.

Näiteks 3.3V mõõtmine peaks tagastama 168. ADC eraldusvõime (8-bitine) on madalam kui pardal olev Arduino (10-bitine), kuid PCF8591 saab teha midagi, mida Arduino ADC ei suuda. Aga selleni jõuame hetkega. Esiteks, et lihtsalt lugeda iga ADC tihvti väärtusi, saadame kontrollbaidi, et öelda PCF8591 -le, millist ADC -d me lugeda tahame. ADC -de puhul null kuni kolm on bait vastavalt 0x00, 0x01, ox02 ja 0x03.

Seejärel palume ADC -lt tagasi kaks baiti andmeid ja salvestame teise baidi kasutamiseks. Miks kaks baiti? PCF8591 tagastab kõigepealt eelnevalt mõõdetud väärtuse - seejärel praeguse baidi. (Vt joonis 8 andmelehel). Lõpuks, kui te ei kasuta kõiki ADC tihvte, ühendage kasutamata GND -ga. Järgmine näitejoonistus lihtsalt otsib väärtusi ükshaaval igast ADC -tihvtist ja kuvab need seejärel jadamonitoris:

#include "Wire.h"

#define PCF8591 (0x90 >> 1) // I2C siiniaadress #define ADC0 0x00 // juhtimisbaidid üksikute ADC -de lugemiseks #define ADC1 0x01 #define ADC2 0x02 #define ADC3 0x03 byte value0, value1, value2, value3; void setup () {Wire.begin (); Seriaalne algus (9600); } void loop () {Wire.beginTransmission (PCF8591); // äratus PCF8591 Wire.write (ADC0); // juhtbait - loe ADC0 Wire.endTransmission (); // lõpeta ülekanne Wire.requestFrom (PCF8591, 2); väärtus0 = Wire.read (); väärtus0 = Wire.read (); Wire.beginTransmission (PCF8591); // äratus PCF8591 Wire.write (ADC1); // juhtbait - loe ADC1 Wire.endTransmission (); // lõpeta ülekanne Wire.requestFrom (PCF8591, 2); väärtus1 = Wire.read (); väärtus1 = Wire.read (); Wire.beginTransmission (PCF8591); // äratus PCF8591 Wire.write (ADC2); // juhtbait - loe ADC2 Wire.endTransmission (); // lõpeta ülekanne Wire.requestFrom (PCF8591, 2); väärtus2 = Wire.read (); väärtus2 = Wire.read (); Wire.beginTransmission (PCF8591); // äratus PCF8591 Wire.write (ADC3); // juhtbait - loe ADC3 Wire.endTransmission (); // lõpeta ülekanne Wire.requestFrom (PCF8591, 2); väärtus3 = Wire.read (); väärtus3 = Wire.read (); Serial.print (väärtus0); Serial.print (""); Serial.print (väärtus1); Serial.print (""); Serial.print (väärtus2); Serial.print (""); Serial.print (väärtus3); Serial.print (""); Serial.println (); }

Visandi käivitamisel esitatakse teile jadamonitoris iga ADC väärtused. Kuigi see oli lihtne demonstratsioon, mis näitas teile, kuidas iga ADC -d eraldi lugeda, on see tülikas meetod konkreetse ADC -lt korraga rohkem kui ühe baidi saamiseks.

6. samm:

Selleks muutke juhtimisbaiti, et nõuda automaatset juurdekasvu, mis tehakse, seades juhtbaidi biti 2 väärtuseks 1. Seega alustame ADC0-st uue juhtbaidi binaarset 00000100 või kuueteistkümnendsüsteemi 0x04. Seejärel küsige viit baiti andmeid (jällegi ignoreerime esimest baiti), mis paneb PCF8591 tagastama kõik väärtused ühes baitide ahelas. Seda protsessi demonstreerib järgmine visand:

#include "Wire.h"

#define PCF8591 (0x90 >> 1) // I2C siiniaadressi bait väärtus0, väärtus1, väärtus2, väärtus3; void setup () {Wire.begin (); Seriaalne algus (9600); } void loop () {Wire.beginTransmission (PCF8591); // äratus PCF8591 Wire.write (0x04); // juhtimisbait - loe ADC0 ja seejärel automaatne juurdekasv Wire.endTransmission (); // lõpeta ülekanne Wire.requestFrom (PCF8591, 5); väärtus0 = Wire.read (); väärtus0 = Wire.read (); väärtus1 = Wire.read (); väärtus2 = Wire.read (); väärtus3 = Wire.read (); Serial.print (väärtus0); Serial.print (""); Serial.print (väärtus1); Serial.print (""); Serial.print (väärtus2); Serial.print (""); Serial.print (väärtus3); Serial.print (""); Serial.println (); }

Varem mainisime, et PCF8591 saab teha midagi, mida Arduino ADC ei suuda, ja see pakub diferentsiaalset ADC -d. Vastupidiselt Arduino üheotsaga (st tagastab positiivse signaali pinge ja GND vahelise erinevuse, aktsepteerib diferentsiaal ADC kahte signaali (mida ei pea tingimata maapinnale viitama) ja tagastab kahe signaali erinevuse See võib olla mugav koormusandurite pingete väikeste muutuste mõõtmiseks jne.

7. samm:

Pilt
Pilt

PCF8591 seadistamine diferentsiaalse ADC jaoks on lihtne juhtbaidi muutmine. Kui pöördute andmelehe seitsmenda lehekülje poole, siis kaaluge erinevat tüüpi analoogsisendi programmeerimist. Varem kasutasime režiimi „00” nelja sisendi jaoks, kuid saate valida ka teised, mis on selgelt illustreeritud, näiteks pilt.

Nii et kahe baassisendi juhtbaidi määramiseks kasutage binaarset 00110000 või 0x30. Siis on lihtne andmebaitide taotlemine ja nendega töötamine. Nagu näete, on olemas ka kombinatsioon ühe/diferentsiaaliga ja keeruline kolme diferentsiaaliga sisend. Siiski jätame need esialgu maha.

Loodetavasti leidsite selle huvi, olgu siis DAC -i lisamine oma katsetele või ADC -de kohta lisateabe saamine. Palun kaaluge oma PCF8591 tellimist firmalt PMD Way.

Selle postituse tõi teile pmdway.com - kõik tegijatele ja elektroonikahuvilistele, tasuta kohaletoimetamine kogu maailmas.

Soovitan: