Turinys:

„Arduino“ir PCF8591 ADC DAC IC: 7 žingsniai
„Arduino“ir PCF8591 ADC DAC IC: 7 žingsniai

Video: „Arduino“ir PCF8591 ADC DAC IC: 7 žingsniai

Video: „Arduino“ir PCF8591 ADC DAC IC: 7 žingsniai
Video: Output DC or AC Voltage using MCP4725 DAC with LCD and PWM to Voltage Converter with Arduino 2024, Liepa
Anonim
„Arduino“ir PCF8591 ADC DAC IC
„Arduino“ir PCF8591 ADC DAC IC

Ar kada nors norėjote daugiau analoginių įvesties kaiščių savo „Arduino“projekte, bet nenorėjote įsigyti „Mega“? O gal norėtumėte generuoti analoginius signalus? Tada peržiūrėkite mūsų vadovėlio temą - NXP PCF8591 IC.

Jis išsprendžia abi šias problemas, nes turi vieną DAC (skaitmeninio į analoginį) keitiklį ir keturis ADC (analoginius į skaitmeninius keitiklius) - visa tai pasiekiama per I2C magistralę. PCF8591 yra DIP, montuojamas ant paviršiaus ir modulis, todėl lengva eksperimentuoti.

Prieš tęsdami atsisiųskite duomenų lapą. PCF8591 gali veikti tiek 5 V, tiek 3,3 V įtampa, taigi, jei naudojate „Arduino Due“, „Raspberry Pi“ar kitą 3,3 V kūrimo plokštę, viskas gerai. Dabar pirmiausia paaiškinsime DAC, tada ADC.

1 žingsnis: DAC (skaitmeninio-analoginio keitiklio) naudojimas

DAC (skaitmeninio-analoginio keitiklio) naudojimas
DAC (skaitmeninio-analoginio keitiklio) naudojimas

PCF8591 DAC skiriamoji geba yra 8 bitai, todėl 255 žingsniais jis gali generuoti teorinį signalą tarp nulio voltų ir etaloninės įtampos (Vref). Demonstraciniais tikslais mes naudosime 5 V Vref, o jūs galite naudoti žemesnį Vref, pvz., 3,3 V, arba bet kokią, kurią norite, kad didžiausia vertė būtų … tačiau ji turi būti mažesnė už maitinimo įtampą.

Atminkite, kad esant analoginės išvesties apkrovai (realioje situacijoje), maksimali išėjimo įtampa sumažės-duomenų lape (kurį atsisiuntėte) rodomas 10% sumažėjimas 10 kΩ apkrovai. Dabar apie mūsų demonstracinę grandinę.

Atkreipkite dėmesį, kad I2C magistralėje naudojami 10kΩ traukiamieji rezistoriai, o 10μF kondensatorius-tarp 5V ir GND. I2C magistralės adresą nustato kaiščių derinys A0 ~ A2, o kartu su visais GND adresas yra 0x90. Analoginį išėjimą galima paimti iš 15 kaiščio (o atskiras analoginis GND yra ant 13 kaiščio. Taip pat prijunkite 13 kaištį prie GND, o GND grandinę - prie „Arduino GND“.

Norėdami valdyti DAC, turime išsiųsti du baitus duomenų. Pirmasis yra valdymo baitas, kuris tiesiog suaktyvina DAC ir yra 1000000 (arba 0x40), o kitas baitas yra vertė nuo 0 iki 255 (išvesties lygis). Tai parodo šis eskizas:

// 52.1 pavyzdys PCF8591 DAC demonstracinė versija

#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C magistralės adresas void setup () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // pabusti PCF8591 Wire.write (0x40); // valdymo baitas - įjunkite DAC (dvejetainis 1000000) Wire.write (i); // vertė siųsti į DAC Wire.endTransmission (); // baigti perdavimą}

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

{Wire.beginTransmission (PCF8591); // pabusti PCF8591 Wire.write (0x40); // valdymo baitas - įjunkite DAC (dvejetainis 1000000) Wire.write (i); // vertė siųsti į DAC Wire.endTransmission (); // baigti perdavimą}}

Ar #define teiginyje pastebėjote magistralės adreso bitų poslinkį? „Arduino“siunčia 7 bitų adresus, tačiau PCF8591 nori 8 bitų, todėl mes perkeliame baitą vienu bitu.

2 žingsnis:

Vaizdas
Vaizdas

Eskizo rezultatai parodyti paveikslėlyje, mes prijungėme Vref prie 5 V, o osciloskopo zondą ir GND atitinkamai prie analoginės išvesties ir GND.

3 žingsnis:

Vaizdas
Vaizdas

Jei jums patinka kreivės, galite sukurti sinusines bangas naudodami žemiau pateiktą eskizą. Jame naudojama paieškos lentelė masyve, kurioje yra būtini iš anksto apskaičiuoti duomenų taškai:

// 52.2 pavyzdys PCF8591 DAC demo - sinusinė banga

#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C magistralės adresas 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 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, 0xC0, 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, 0x0 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37, 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D, 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x6, 0x6 0x70, 0x74, 0x77, 0x7A, 0x7D}; void setup () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // pabusti PCF8591 Wire.write (0x40); // valdymo baitas - įjunkite DAC (dvejetainis 1000000) Wire.write (sine_wave ); // vertė siųsti į DAC Wire.endTransmission (); // baigti perdavimą}}

4 žingsnis:

Vaizdas
Vaizdas

Šiam DSO vaizdo iškėlimui mes pakeitėme Vref į 3.3V - atkreipkite dėmesį į sinusų bangos maksimumų pasikeitimą.

Dabar galite eksperimentuoti su DAC, kad sukurtumėte garso efektus, signalus ar valdytumėte kitas analogines grandines.

5 žingsnis: ADC (analoginio-skaitmeninio keitiklio) naudojimas

Jei savo „Arduino“naudojate analogRead () funkciją (dar 1 skyriuje), tada jūs jau esate susipažinę su ADC. Be PCF8591 galime nuskaityti įtampą tarp nulio ir Vref, ir ji grąžins vertę nuo nulio iki 255, kuri yra tiesiogiai proporcinga nuliui ir Vref.

Pavyzdžiui, matuojant 3.3V turėtų grįžti 168. ADC skiriamoji geba (8 bitai) yra mažesnė nei įmontuoto „Arduino“(10 bitų), tačiau PCF8591 gali padaryti tai, ko negali „Arduino“ADC. Bet mes prie to prieisime akimirksniu. Pirma, norėdami tiesiog perskaityti kiekvieno ADC kaiščio reikšmes, mes siunčiame valdymo baitą, kad PCF8591 nurodytų, kurį ADC norime skaityti. ADC nuo 0 iki 3 valdymo baitas yra atitinkamai 0x00, 0x01, ox02 ir 0x03.

Tada mes prašome du baitus duomenų iš ADC ir išsaugome antrąjį baitą naudojimui. Kodėl du baitai? PCF8591 pirmiausia grąžina anksčiau išmatuotą vertę - tada dabartinį baitą. (Žr. 8 paveikslėlį duomenų lape). Galiausiai, jei nenaudojate visų ADC kaiščių, prijunkite nenaudojamus prie GND. Šis eskizo pavyzdys paprasčiausiai nuskaito vertes iš kiekvieno ADC kaiščio po vieną ir parodo jas serijiniame monitoriuje:

#įtraukti „Wire.h“

#define PCF8591 (0x90 >> 1) // I2C magistralės adresas #define ADC0 0x00 // valdymo baitai atskiriems ADC skaitymui #define ADC1 0x01 #define ADC2 0x02 #define ADC3 0x03 baitų vertė0, vertė1, vertė2, vertė3; void setup () {Wire.begin (); Serial.begin (9600); } void loop () {Wire.beginTransmission (PCF8591); // pabusti PCF8591 Wire.write (ADC0); // valdymo baitas - skaityti ADC0 Wire.endTransmission (); // pabaigos transmisija Wire.requestFrom (PCF8591, 2); value0 = Wire.read (); value0 = Wire.read (); Wire.beginTransmission (PCF8591); // pabusti PCF8591 Wire.write (ADC1); // valdymo baitas - skaityti ADC1 Wire.endTransmission (); // pabaigos transmisija Wire.requestFrom (PCF8591, 2); value1 = Wire.read (); value1 = Wire.read (); Wire.beginTransmission (PCF8591); // pabusti PCF8591 Wire.write (ADC2); // valdymo baitas - skaityti ADC2 Wire.endTransmission (); // pabaigos transmisija Wire.requestFrom (PCF8591, 2); value2 = Wire.read (); value2 = Wire.read (); Wire.beginTransmission (PCF8591); // pabusti PCF8591 Wire.write (ADC3); // valdymo baitas - skaityti ADC3 Wire.endTransmission (); // pabaigos transmisija Wire.requestFrom (PCF8591, 2); value3 = Wire.read (); value3 = Wire.read (); Serial.print (vertė0); Serial.print (""); Serial.print (vertė1); Serial.print (""); Serial.print (vertė2); Serial.print (""); Serial.print (vertė3); Serial.print (""); Serial.println (); }

Paleidus eskizą, serijiniame monitoriuje bus pateiktos kiekvieno ADC vertės. Nors tai buvo paprastas demonstravimas, parodantis, kaip individualiai perskaityti kiekvieną ADC, tai yra sudėtingas būdas vienu metu gauti daugiau nei vieną baitą iš tam tikro ADC.

6 žingsnis:

Norėdami tai padaryti, pakeiskite valdymo baitą ir paprašykite automatinio padidinimo, kuris atliekamas nustatant 2 baito bitą į 1. Taigi, norėdami pradėti nuo ADC0, naudojame naują dvejetainio 00000100 arba šešioliktainį 0x04 valdymo baitą. Tada paprašykite penkių baitų duomenų (dar kartą ignoruojame pirmąjį baitą), todėl PCF8591 grąžins visas reikšmes vienoje baitų grandinėje. Šis procesas parodytas šiame eskize:

#įtraukti „Wire.h“

#define PCF8591 (0x90 >> 1) // I2C magistralės adresas baitas vertė0, vertė1, vertė2, vertė3; void setup () {Wire.begin (); Serial.begin (9600); } void loop () {Wire.beginTransmission (PCF8591); // pabusti PCF8591 Wire.write (0x04); // valdymo baitas - skaitykite ADC0, tada automatiškai padidinkite Wire.endTransmission (); // pabaigos transmisija Wire.requestFrom (PCF8591, 5); value0 = Wire.read (); value0 = Wire.read (); value1 = Wire.read (); value2 = Wire.read (); value3 = Wire.read (); Serial.print (vertė0); Serial.print (""); Serial.print (vertė1); Serial.print (""); Serial.print (vertė2); Serial.print (""); Serial.print (vertė3); Serial.print (""); Serial.println (); }

Anksčiau minėjome, kad PCF8591 gali padaryti tai, ko negali „Arduino“ADC, ir tai siūlo diferencinį ADC. Priešingai nei „Arduino“vienpusis (ty jis grąžina skirtumą tarp teigiamo signalo įtampos ir GND, diferencialinis ADC priima du signalus (kurie nebūtinai turi būti susieti su žeme) ir grąžina skirtumą tarp dviejų signalų Tai gali būti patogu matuoti nedidelius apkrovos elementų įtampos pokyčius ir pan.

7 žingsnis:

Vaizdas
Vaizdas

PCF8591 nustatymas diferenciniam ADC yra paprastas valdymo baito pakeitimas. Jei pereinate prie septintojo duomenų lapo puslapio, apsvarstykite įvairių tipų analoginio įvesties programavimą. Anksčiau keturiems įėjimams naudojome režimą „00“, tačiau galite pasirinkti kitus, kurie yra aiškiai iliustruoti, pavyzdžiui, vaizdą.

Taigi, norėdami nustatyti dviejų diferencinių įėjimų valdymo baitą, naudokite dvejetainį 00110000 arba 0x30. Tada paprasta paprašyti duomenų baitų ir dirbti su jais. Kaip matote, taip pat yra vieno/diferencinio ir sudėtingo trijų diferencialų įvestis. Tačiau kol kas juos paliksime.

Tikimės, kad tai jus sudomino, nesvarbu, ar pridėjote DAC prie savo eksperimentų, ar sužinojote šiek tiek daugiau apie ADC. Apsvarstykite galimybę užsisakyti savo PCF8591 iš „PMD Way“.

Šį įrašą jums pateikė pmdway.com - viskas gamintojams ir elektronikos entuziastams, nemokamas pristatymas visame pasaulyje.

Rekomenduojamas: