Orodha ya maudhui:

Arduino na PCF8591 ADC DAC IC: Hatua 7
Arduino na PCF8591 ADC DAC IC: Hatua 7

Video: Arduino na PCF8591 ADC DAC IC: Hatua 7

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

Je! Umewahi kutaka pini zaidi za kuingiza analog kwenye mradi wako wa Arduino, lakini hautaki kutafuta Mega? Au ungependa kutoa ishara za analog? Kisha angalia mada ya mafunzo yetu - NXP PCF8591 IC.

Inasuluhisha shida hizi zote kwa kuwa ina kibadilishaji cha DAC moja (dijiti kwa analog) pamoja na ADC nne (analog kwa waongofu wa dijiti) - zote zinapatikana kupitia basi ya I2C. PCF8591 inapatikana katika DIP, mlima wa uso na fomu ya moduli, ambayo inafanya iwe rahisi kujaribu.

Kabla ya kuendelea, pakua karatasi ya data. PCF8591 inaweza kufanya kazi kwa 5V na 3.3V kwa hivyo ikiwa unatumia Arduino Ngenxa, Raspberry Pi au bodi nyingine ya maendeleo ya 3.3 V uko sawa. Sasa tutaelezea kwanza DAC, halafu ADCs.

Hatua ya 1: Kutumia DAC (Digital-to-Analog Converter)

Kutumia DAC (Digital-to-Analog Converter)
Kutumia DAC (Digital-to-Analog Converter)

DAC kwenye PCF8591 ina azimio la bits-8 - kwa hivyo inaweza kutoa ishara ya kinadharia kati ya volt zero na voltage ya kumbukumbu (Vref) katika hatua 255. Kwa madhumuni ya onyesho tutatumia Vref ya 5V, na unaweza kutumia Vref ya chini kama vile 3.3V au chochote unachotaka kuwa kiwango cha juu zaidi kuwa … hata hivyo lazima iwe chini ya voltage ya usambazaji.

Kumbuka kuwa wakati kuna mzigo kwenye pato la analog (hali halisi ya ulimwengu), kiwango cha juu cha pato la voltage kitashuka - karatasi ya data (ambayo umepakua) inaonyesha kushuka kwa 10% kwa mzigo wa 10kΩ. Sasa kwa mzunguko wetu wa maandamano.

Kumbuka matumizi ya vizuizi vya kuvuta 10kΩ kwenye basi ya I2C, na 10μF capacitor kati ya 5V na GND. Anwani ya basi ya I2C imewekwa na mchanganyiko wa pini A0 ~ A2, na pamoja nao kwa GND anwani ni 0x90. Pato la analojia linaweza kuchukuliwa kutoka kwa pini 15 (na kuna Analog tofauti ya GND kwenye pini ya 13. Pia, unganisha pini ya 13 na GND, na uzungushe GND hadi Arduino GND.

Kudhibiti DAC tunahitaji kutuma kaiti mbili za data. Ya kwanza ni baiti ya kudhibiti, ambayo inamsha DAC tu na ni 1000000 (au 0x40) na baiti inayofuata ni thamani kati ya 0 na 255 (kiwango cha pato). Hii imeonyeshwa katika mchoro ufuatao:

// Mfano 52.1 PCF8591 DAC demo

# pamoja na "Wire.h" #fafanua PCF8591 (0x90 >> 1) // Anwani ya basi ya I2C batili kuanzisha () {Wire.begin (); } kitanzi batili () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // kuamka PCF8591 Wire.write (0x40); // kudhibiti byte - washa DAC (binary 1000000) Wire.write (i); // thamani ya kutuma kwa DAC Wire.endTransmission (); // kumaliza kutuliza}

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

{Wire.beginTransmission (PCF8591); // kuamka PCF8591 Wire.write (0x40); // kudhibiti byte - washa DAC (binary 1000000) Wire.write (i); // thamani ya kutuma kwa DAC Wire.endTransmission (); // kumaliza kutuliza}}

Je! Umeona mabadiliko kidogo ya anwani ya basi katika taarifa ya #fafanua? Arduino hutuma anwani 7-bit lakini PCF8591 inataka 8-bit, kwa hivyo tunahamisha byte kwa kidogo.

Hatua ya 2:

Picha
Picha

Matokeo ya mchoro yanaonyeshwa kwenye picha, tumeunganisha Vref kwa 5V na uchunguzi wa oscilloscope na GND kwa pato la analog na GND mtawaliwa.

Hatua ya 3:

Picha
Picha

Ikiwa unapenda curves unaweza kutoa mawimbi ya sine na mchoro hapa chini. Inatumia meza ya kutafuta katika safu ambayo ina alama muhimu za data zilizohesabiwa hapo awali:

// Mfano 52.2 PCF8591 DAC demo - wimbi la sine

# pamoja na "Wire.h" #fafanua PCF8591 (0x90 >> 1) // Anwani ya basi ya I2C uint8_t sine_wave [256] = {0x80, 0x83, 0x86, 0x89, 0x8C, 0x90, 0x93, 0x96, 0x99, 0x9C, 0x9F, Kupakiwa kwenye tovuti: 0 | Jumla ya kura: 0 | 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC, 0x, 0x 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6, 0xF5, 0xFx, 0xF4, 0 0xED, 0xEB, 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC, 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9, 0xC7, 0xC4, 0xC, 0xC 0xB3, 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7D, 0x7A 0x6 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, 0x0, 0x0 0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0, 0, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x16 0x18 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37, 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D, 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E 0x61 0x70, 0x74, 0x77, 0x7A, 0x7D}; kuanzisha batili () {Wire.begin (); } kitanzi batili () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // kuamka PCF8591 Wire.write (0x40); // kudhibiti byte - washa DAC (binary 1000000) Wire.write (sine_wave ); // thamani ya kutuma kwa DAC Wire.endTransmission (); // kumaliza kutuliza}}

Hatua ya 4:

Picha
Picha

Kwa dampo la picha inayofuata ya DSO, tulibadilisha Vref kuwa 3.3V - angalia mabadiliko katika maxima kwenye wimbi la sine.

Sasa unaweza kujaribu DAC kutoa athari za sauti, ishara au kudhibiti nyaya zingine za analog.

Hatua ya 5: Kutumia ADCs (Analog-to-digital Converters)

Ikiwa umetumia kazi ya AnalogRead () kwenye Arduino yako (nyuma sana katika Sura ya Kwanza) basi tayari umezoea ADC. Kwa nje ya PCF8591 tunaweza kusoma voltage kati ya sifuri na Vref na itarudisha thamani ya kati ya sifuri na 255 ambayo ni sawa sawa na sifuri na Vref.

Kwa mfano, kupima 3.3V inapaswa kurudi 168. Azimio (8-bit) ya ADC iko chini kuliko Arduino ya ndani (10-bit) hata hivyo PCF8591 inaweza kufanya kitu ambacho ADC ya Arduino haiwezi. Lakini tutafika hapo kwa muda mfupi. Kwanza, kusoma tu maadili ya kila pini ya ADC tunatuma nambari ya kudhibiti kuwaambia PCF8591 ambayo ADC tunataka kusoma. Kwa ADCs sifuri hadi tatu baiti ya kudhibiti ni 0x00, 0x01, ox02 na 0x03 mtawaliwa.

Kisha tunaomba data mbili kutoka kwa ADC, na tuhifadhi baiti ya pili kwa matumizi. Kwa nini ka mbili? PCF8591 inarudisha kwanza kipimo kilichopimwa hapo awali - kisha baiti ya sasa. (Tazama Kielelezo 8 kwenye karatasi ya data). Mwishowe, ikiwa hutumii pini zote za ADC, unganisha zile ambazo hazijatumika kwa GND. Mchoro ufuatao hupata tu maadili kutoka kwa kila pini ya ADC moja kwa moja, kisha uwaonyeshe kwenye mfuatiliaji wa serial:

# pamoja na "Wire.h"

#fafanua PCF8591 (0x90 >> 1) // Anwani ya basi ya I2C #fafanua ADC0 0x00 // kudhibiti ka kwa kusoma ADCs binafsi #fafanua ADC1 0x01 #fafanua ADC2 0x02 #fafanua ADC3 0x03 byte value0, value1, value2, value3; kuanzisha batili () {Wire.begin (); Kuanzia Serial (9600); } kitanzi batili () {Wire.beginTransmission (PCF8591); // kuamka PCF8591 Wire.write (ADC0); // kudhibiti byte - soma ADC0 Wire. endTransmission (); // kumaliza tranmission Wire.requestFrom (PCF8591, 2); thamani0 = Kusoma kwa waya (); thamani0 = Kusoma kwa waya (); Uwasilishaji wa waya (PCF8591); // kuamka PCF8591 Wire.write (ADC1); // kudhibiti byte - soma ADC1 Wire. endTrmmission (); // kumaliza tranmission Wire.requestFrom (PCF8591, 2); thamani1 = soma kwa waya (); thamani1 = soma kwa waya (); Uwasilishaji wa waya (PCF8591); // kuamka PCF8591 Wire.write (ADC2); // kudhibiti byte - soma ADC2 Wire. endTrmmission (); // kumaliza tranmission Wire.requestFrom (PCF8591, 2); thamani2 = Kusoma kwa waya (); thamani2 = Kusoma kwa waya (); Uwasilishaji wa waya (PCF8591); // kuamka PCF8591 Wire.write (ADC3); // kudhibiti byte - soma ADC3 Wire. endTrmmission (); // kumaliza tranmission Wire.requestFrom (PCF8591, 2); thamani3 = Soma kwa waya (); thamani3 = Soma kwa waya (); Printa ya serial (thamani0); Serial.print (""); Printa ya serial (thamani1); Serial.print (""); Serial.print (thamani2); Serial.print (""); Printa ya serial (thamani3); Serial.print (""); Serial.println (); }

Baada ya kuendesha mchoro utawasilishwa na maadili ya kila ADC katika mfuatiliaji wa serial. Ingawa ilikuwa maonyesho rahisi kukuonyesha jinsi ya kusoma kila ADC, ni njia ngumu ya kupata zaidi ya moja kwa wakati kutoka kwa ADC fulani.

Hatua ya 6:

Ili kufanya hivyo, badilisha baiti ya kudhibiti ili kuomba nyongeza ya kiotomatiki, ambayo hufanywa kwa kuweka kidogo 2 ya kudhibiti byte hadi 1. Kwa hivyo kuanza kutoka ADC0 tunatumia njia mpya ya kudhibiti ya binary 00000100 au hexadecimal 0x04. Kisha omba ka tano za data (kwa mara nyingine tunapuuza baiti ya kwanza) ambayo itasababisha PCF8591 kurudisha maadili yote katika mlolongo mmoja wa ka. Utaratibu huu umeonyeshwa katika mchoro ufuatao:

# pamoja na "Wire.h"

#fafanua PCF8591 (0x90 >> 1) // Anwani ya basi ya I2C thamani0, value1, value2, value3; kuanzisha batili () {Wire.begin (); Kuanzia Serial (9600); } kitanzi batili () {Wire.beginTransmission (PCF8591); // kuamka PCF8591 Wire.write (0x04); // kudhibiti byte - soma ADC0 kisha kuongeza nyongeza kwa waya.endTransmission (); // kumaliza waya wa utulivu.requestFrom (PCF8591, 5); thamani0 = Kusoma kwa waya (); thamani0 = Kusoma kwa waya (); thamani1 = soma kwa waya (); thamani2 = Kusoma kwa waya (); thamani3 = Soma kwa waya (); Printa ya serial (thamani0); Serial.print (""); Serial.print (thamani1); Serial.print (""); Serial.print (thamani2); Serial.print (""); Printa ya serial (thamani3); Serial.print (""); Serial.println (); }

Hapo awali tulitaja kwamba PCF8591 inaweza kufanya kitu ambacho ADC ya Arduino haiwezi, na hii ni kutoa ADC tofauti. Kinyume na kumalizika kwa moja kwa Arduino (yaani inarudisha tofauti kati ya voltage chanya ya ishara na GND, ADC tofauti inakubali ishara mbili (ambazo sio lazima zirejeshwe ardhini), na kurudisha tofauti kati ya ishara mbili Hii inaweza kuwa rahisi kwa kupima mabadiliko madogo kwa voltages kwa seli za mzigo na kadhalika.

Hatua ya 7:

Picha
Picha

Kuanzisha PCF8591 kwa tofauti ya ADC ni jambo rahisi la kubadilisha baiti ya kudhibiti. Ikiwa utageukia ukurasa wa saba wa karatasi ya data, basi fikiria aina tofauti za programu ya uingizaji wa analog. Hapo awali tulikuwa tukitumia mode '00' kwa pembejeo nne, hata hivyo unaweza kuchagua zingine ambazo zinaonyeshwa wazi, kwa mfano picha.

Kwa hivyo kuweka baiti ya kudhibiti kwa pembejeo mbili tofauti, tumia binary 00110000 au 0x30. Halafu ni jambo rahisi la kuomba ka data na kufanya kazi nao. Kama unaweza kuona pia kuna mchanganyiko wa moja / tofauti na mchango tata wa tofauti tatu. Walakini tutawaacha kwa sasa.

Tunatumahi kuwa umepata hii ya kupendeza, iwe unaongeza DAC kwenye majaribio yako au ujifunze zaidi juu ya ADC. Tafadhali fikiria kuagiza PCF8591 yako kutoka kwa PMD Way.

Chapisho hili limeletwa kwako na pmdway.com - kila kitu kwa watengenezaji na wapenda umeme, na uwasilishaji wa bure ulimwenguni.

Ilipendekeza: