Orodha ya maudhui:
- Hatua ya 1: Kutumia DAC (Digital-to-Analog Converter)
- Hatua ya 2:
- Hatua ya 3:
- Hatua ya 4:
- Hatua ya 5: Kutumia ADCs (Analog-to-digital Converters)
- Hatua ya 6:
- Hatua ya 7:
Video: Arduino na PCF8591 ADC DAC IC: Hatua 7
2024 Mwandishi: John Day | [email protected]. Mwisho uliobadilishwa: 2024-01-30 12:51
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)
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:
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:
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:
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:
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:
MicroPython PCF8591 DACtest: 3 Hatua (na Picha)
MicroPython PCF8591 DACtest: Nilinunua kitabu hiki ili kuboresha ujuzi wangu wa Micropython: MicroPython kwa Warsha ya Maendeleo ya ESP8266 na Agus Kurniawan. Kitabu hiki ni mwanzo mzuri sana, mradi wa I2C hutumia moduli ya PCF8591. Lakini hakuna mfano wa programu ya DAC kwa hivyo ilibidi nigundue hiyo
Sehemu ya 7 ya kuonyesha Maadili ya ADC #Arduino, #Arduino: Hatua 4
Sehemu ya 7 ya Onyesha Thamani za ADC #Arduino, #Arduino: Katika nakala hii nitafanya mradi ambao bado unahusiana na nakala iliyopita. Yaani kusindika data ya ADC. Kwa hivyo hauitaji mfuatiliaji wa serial kuona thamani ya data ya adc. katika nakala hii nitafanya onyesho la mtazamaji wa Thamani ya ADC. kwa hivyo huna
Arduino na TI ADS1110 16-bit ADC: 6 Hatua
Arduino na TI ADS1110 16-bit ADC: Katika mafunzo haya tunachunguza kutumia Arduino kufanya kazi na Texas Instruments ADS1110 - kibadilishaji kidogo sana lakini muhimu 16-bit analog-to-digital converter IC. Inaweza kufanya kazi kati ya 2.7 na 5.5 V kwa hivyo ni nzuri pia kwa Arduino Ngenxa na zingine za chini
Cheza Nyimbo na Arduino Kutumia ADC kwa PWM kwenye Flyback Transformer au Spika: Hatua 4
Cheza Nyimbo na Arduino Kutumia ADC kwa PWM kwenye Flyback Transformer au Spika: Hello Guys, Hii ni sehemu ya pili ya mwingine anayefundishwa (ambayo ilikuwa ngumu sana), Kimsingi, Katika Mradi huu, nimetumia ADC na TIMERS kwenye Arduino yangu kwenda kubadilisha Saini ya Sauti kuwa Ishara ya PWM. Hii ni rahisi zaidi kuliko Maagizo yangu ya awali
PCF8591 (i2c Analog I / O Expander) Matumizi rahisi ya haraka: Hatua 9
PCF8591 (i2c Analog I / O Expander) Matumizi Rahisi: Maktaba ya kutumia i2c pcf8591 IC na arduino na esp8266. IC hii inaweza kudhibiti (hadi 4) pembejeo ya analog na / au 1 pato la analog kama voltage ya kipimo, soma thamani ya thermistor au fade led. Can kusoma thamani ya analog na kuandika thamani ya analog na waya 2 tu (perfec