Mündəricat:

Arduino və PCF8591 ADC DAC IC: 7 addım
Arduino və PCF8591 ADC DAC IC: 7 addım

Video: Arduino və PCF8591 ADC DAC IC: 7 addım

Video: Arduino və PCF8591 ADC DAC IC: 7 addım
Video: Dərs 1 Arduino nədir? Qısa, maraqlı və dolğun 2024, Iyul
Anonim
Arduino və PCF8591 ADC DAC IC
Arduino və PCF8591 ADC DAC IC

Arduino layihənizdə daha çox analoq giriş pinləri istəyirdiniz, ancaq Mega üçün ayrılmaq istəmədinizmi? Yoxsa analoq siqnallar yaratmaq istərdiniz? Sonra dərsimizin mövzusuna nəzər salın - NXP PCF8591 IC.

Hər iki problemi həll edir, çünki tək bir DAC (rəqəmsaldan analoqa) çeviriciyə və dörd ADC -yə (rəqəmsal çeviriciyə analoqu) malikdir - hamısına I2C avtobusu vasitəsilə daxil olmaq mümkündür. PCF8591, DIP, səthə montaj və modul şəklində mövcuddur, bu da təcrübəni asanlaşdırır.

Davam etməzdən əvvəl məlumat cədvəlini yükləyin. PCF8591 həm 5V, həm də 3.3V -də işləyə bilər, buna görə də Arduino Due, Raspberry Pi və ya digər 3.3 V inkişaf lövhəsindən istifadə edirsinizsə yaxşıdır. İndi əvvəlcə DAC -ı, sonra ADC -ləri izah edəcəyik.

Addım 1: DAC-dan istifadə (rəqəmsal-analoq çevirici)

DAC-dan istifadə (rəqəmsal-analoq çevirici)
DAC-dan istifadə (rəqəmsal-analoq çevirici)

PCF8591-dəki DAC 8 bitlik bir qətnaməyə malikdir-beləliklə 255 addımda sıfır volt və istinad gərginliyi (Vref) arasında nəzəri bir siqnal yarada bilər. Nümayiş məqsədləri üçün 5V Vref istifadə edəcəyik və 3.3V kimi daha aşağı bir Vref və ya maksimum dəyərin olmasını istədiyiniz hər şeyi istifadə edə bilərsiniz … ancaq təchizat gərginliyindən az olmalıdır.

Diqqət yetirin ki, analoq çıxışda bir yük olduqda (real vəziyyət), maksimum çıxış gərginliyi düşəcək-məlumat səhifəsində (yüklədiyiniz) 10kΩ yük üçün 10% azalma göstərilir. İndi nümayiş dövrəmiz üçün.

I2C avtobusunda 10kΩ çəkmə rezistorlarının və 5V ilə GND arasındakı 10μF kondansatörün istifadəsinə diqqət yetirin. I2C avtobus ünvanı, A0 ~ A2 sancaqlarının birləşməsi ilə təyin olunur və hamısı ilə GND -yə ünvan 0x90 -dır. Analog çıxış pin 15 -dən götürülə bilər (və pin 13 -də ayrı bir GND analoqu var. Ayrıca, pin 13 -ü GND -yə və GND -ni Arduino GND -yə bağlayın.

DAC -ı idarə etmək üçün iki bayt məlumat göndərməliyik. Birincisi, DAC -ı aktivləşdirən və 1000000 (və ya 0x40) olan növbəti bayt 0 ilə 255 (çıxış səviyyəsi) arasındakı dəyərdir. Bu, aşağıdakı eskizdə göstərilir:

// Misal 52.1 PCF8591 DAC demosu

#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C avtobus ünvanı etibarsız quraşdırma () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // oyan PCF8591 Wire.write (0x40); // nəzarət baytı - DAC (ikili 1000000) Wire.write (i) yandırın; // DAC Wire.endTransmission -a göndəriləcək dəyər (); // köçürməni bitir}

üçün (int i = 255; i> = 0; --i)

{Wire.beginTransmission (PCF8591); // oyan PCF8591 Wire.write (0x40); // nəzarət baytı - DAC (ikili 1000000) Wire.write (i) yandırın; // DAC Wire.endTransmission -a göndəriləcək dəyər (); // köçürməni bitirin}}

#Define ifadəsində avtobus ünvanının bir qədər dəyişdiyini gördünüzmü? Arduino 7-bit ünvanlar göndərir, lakin PCF8591 8-bit istəyir, buna görə də baytı bir bit dəyişdiririk.

Addım 2:

Şəkil
Şəkil

Eskizin nəticələri görüntüdə göstərilir, Vref -i 5V -ə, osiloskop probunu və GND -ni müvafiq olaraq analoq çıxışa və GND -yə qoşduq.

Addım 3:

Şəkil
Şəkil

Döngələri sevirsinizsə, aşağıdakı eskizlə sinus dalğaları yarada bilərsiniz. Lazımi əvvəlcədən hesablanmış məlumat nöqtələrini ehtiva edən bir sıra axtarış cədvəlindən istifadə edir:

// Misal 52.2 PCF8591 DAC demo - sinus dalğası

#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C avtobus ünvanı uint8_t sine_wave [256] = {0x80, 0x83, 0x86, 0x89, 0x8C, 0x90, 0x93, 0x96, 0x9, 0x9C, 0x9C, 0x93 0xA2, 0xA5, 0xA8, 0xAB, 0xAE, 0xB1, 0xB3, 0xB6, 0xB9, 0xBC, 0xBF, 0xC1, 0xC4, 0xC7, 0xC9, 0xCC, 0xCE, 0xD1, 0xDx, 0xD3, 0xD3, 0xD3 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFF, 0xFC, 0xFC, 0xFC 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xFF, 0xF6, 0xF6, 0xFF 0xED, 0xEB, 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC, 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9, 0xC7, 0xB7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xE7 0xB3, 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7D, 0x7D, 0x7A, 0x7A, 0x7A 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, 0x10, 0x10 0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x0x, 0x01, 0x01, 0x01, 0x01 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x24, 22x20 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37, 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D, 0x4F, 0x52, 0x55, 0x58, 0x5x, 0x56, 0x5E, 0x5E 0x70, 0x74, 0x77, 0x7A, 0x7D}; void setup () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // oyan PCF8591 Wire.write (0x40); // nəzarət baytı - DAC -ı yandırın (ikili 1000000) Wire.write (sine_wave ); // DAC Wire.endTransmission -a göndəriləcək dəyər (); // ötürülməni bitirin}}

Addım 4:

Şəkil
Şəkil

Aşağıdakı DSO görüntü boşluğu üçün Vref -i 3.3V -ə dəyişdik - sinus dalğasındakı maksimumların dəyişməsini qeyd edin.

İndi səs effektləri, siqnallar etmək və ya digər analoq sxemləri idarə etmək üçün DAC ilə təcrübə edə bilərsiniz.

Addım 5: ADC-lərdən istifadə etmək (analoq-rəqəmsal çeviricilər)

Arduino'nuzda analogRead () funksiyasından istifadə etmisinizsə (Birinci fəsildə), artıq bir ADC ilə tanışsınız. PCF8591 olmadan sıfır və Vref arasındakı bir gərginliyi oxuya bilərik və sıfır və Vref ilə düz mütənasib olan sıfır ilə 255 arasında bir dəyər qaytaracaq.

Məsələn, 3.3V ölçmə 168-i geri qaytarmalıdır. ADC-nin qətnaməsi (8-bit) Arduino-dan (10-bit) daha aşağıdır, lakin PCF8591, Arduinonun ADC-nin edə bilməyəcəyi bir şeyi edə bilər. Ancaq bir anda buna çatacağıq. Birincisi, hər bir ADC pininin dəyərlərini oxumaq üçün PCF8591 -ə hansı ADC -ni oxumaq istədiyimizi bildirmək üçün bir nəzarət baytı göndəririk. ADC sıfırdan üçə qədər nəzarət baytı sırasıyla 0x00, 0x01, ox02 və 0x03 -dir.

Sonra ADC -dən iki bayt məlumat tələb edirik və ikinci baytı istifadə üçün saxlayırıq. Niyə iki bayt? PCF8591 əvvəl əvvəl ölçülmüş dəyəri - sonra cari baytı qaytarır. (Məlumat vərəqindəki Şəkil 8 -ə baxın). Nəhayət, bütün ADC pinlərindən istifadə etmirsinizsə, istifadə olunmayanları GND -ə qoşun. Aşağıdakı nümunə eskiz, hər bir ADC pinindən dəyərləri bir -bir alır və sonra serial monitorda göstərir:

#"Wire.h" daxil edin

#define PCF8591 (0x90 >> 1) // I2C avtobus ünvanı #ADC0 0x00 təyin edin // fərdi ADC -lərin oxunması üçün nəzarət baytı #ADC1 0x01 müəyyən edin ADC2 0x02 #decine ADC3 0x03 bayt dəyər0, dəyər1, dəyər2, dəyər3; void setup () {Wire.begin (); Serial.begin (9600); } void loop () {Wire.beginTransmission (PCF8591); // oyan PCF8591 Wire.write (ADC0); // nəzarət baytı - ADC0 Wire.endTransmission () oxuyun; // son ötürmə Wire.requestFrom (PCF8591, 2); dəyər0 = Wire.read (); dəyər0 = Wire.read (); Tel.beginTransmission (PCF8591); // oyan PCF8591 Wire.write (ADC1); // nəzarət baytı - ADC1 Wire.endTransmission () oxuyun; // son ötürmə Wire.requestFrom (PCF8591, 2); dəyər1 = Wire.read (); dəyər1 = Wire.read (); Tel.beginTransmission (PCF8591); // oyan PCF8591 Wire.write (ADC2); // nəzarət baytı - ADC2 Wire.endTransmission () oxuyun; // son ötürmə Wire.requestFrom (PCF8591, 2); dəyər2 = Wire.read (); dəyər2 = Wire.read (); Tel.beginTransmission (PCF8591); // oyan PCF8591 Wire.write (ADC3); // nəzarət baytı - ADC3 Wire.endTransmission () oxuyun; // son ötürmə Wire.requestFrom (PCF8591, 2); dəyər3 = Wire.read (); dəyər3 = Wire.read (); Serial.print (dəyər0); Serial.print (""); Serial.print (dəyər1); Serial.print (""); Serial.print (dəyər2); Serial.print (""); Serial.print (dəyər3); Serial.print (""); Serial.println (); }

Eskizi işlədərkən serial monitorda hər bir ADC -nin dəyərləri sizə təqdim olunacaq. Hər bir ADC -ni fərdi olaraq necə oxumağınızı göstərmək sadə bir nümayiş olsa da, müəyyən bir ADC -dən bir anda birdən çox bayt əldə etmək üçün çətin bir üsuldur.

Addım 6:

Bunu etmək üçün, idarə baytının 2 bitini 1 olaraq təyin etməklə edilən avtomatik artım tələb etmək üçün nəzarət baytını dəyişdirin. Beləliklə, ADC0-dan başlamaq üçün ikili 00000100 və ya hexadecimal 0x04 olan yeni bir idarə baytından istifadə edirik. Sonra beş bayt məlumat istəyin (bir daha birinci baytı görməməzliyə vururuq), bu da PCF8591 -in bütün bayt zəncirindəki bütün dəyərləri qaytarmasına səbəb olacaq. Bu proses aşağıdakı eskizdə göstərilir:

#"Wire.h" daxil edin

#define PCF8591 (0x90 >> 1) // I2C avtobus ünvanı bayt dəyəri0, dəyər1, dəyər2, dəyər3; void setup () {Wire.begin (); Serial.begin (9600); } void loop () {Wire.beginTransmission (PCF8591); // oyan PCF8591 Wire.write (0x04); // nəzarət baytı - ADC0 -ı oxuyun, sonra avtomatik artım Wire.endTransmission (); // son ötürmə Wire.requestFrom (PCF8591, 5); dəyər0 = Wire.read (); dəyər0 = Wire.read (); dəyər1 = Wire.read (); dəyər2 = Wire.read (); dəyər3 = Wire.read (); Serial.print (dəyər0); Serial.print (""); Serial.print (dəyər1); Serial.print (""); Serial.print (dəyər2); Serial.print (""); Serial.print (dəyər3); Serial.print (""); Serial.println (); }

Əvvəllər qeyd etmişdik ki, PCF8591, Arduinonun ADC -nin edə bilməyəcəyi bir şeyi edə bilər və bu, diferensial ADC təklif edir. Arduino'nun tək uçlu olmasından fərqli olaraq (yəni müsbət siqnal gərginliyi ilə GND arasındakı fərqi qaytarır), diferensial ADC iki siqnalı qəbul edir (mütləq yerə istinad edilməməlidir) və iki siqnal arasındakı fərqi qaytarır. Bu, yük hüceyrələri üçün gərginlikdəki kiçik dəyişiklikləri ölçmək üçün əlverişli ola bilər və s.

Addım 7:

Şəkil
Şəkil

Diferensial ADC üçün PCF8591 -in qurulması, nəzarət baytının dəyişdirilməsi üçün sadə bir məsələdir. Məlumat vərəqinin yeddinci səhifəsinə keçsəniz, fərqli analoq giriş proqramlaşdırma növlərini nəzərdən keçirin. Əvvəllər dörd giriş üçün '00' rejimindən istifadə edirdik, ancaq aydın şəkildə təsvir olunan digərlərini, məsələn, şəkli seçə bilərsiniz.

Beləliklə, iki fərqli giriş üçün nəzarət baytını təyin etmək üçün ikili 00110000 və ya 0x30 istifadə edin. Sonra məlumat baytlarını istəmək və onlarla işləmək sadə bir məsələdir. Gördüyünüz kimi, tək/diferensial və mürəkkəb üç diferensial bir giriş var. Ancaq hələlik onları tərk edəcəyik.

Ümid edirəm təcrübələrinizə DAC əlavə etməyiniz və ya ADC -lər haqqında bir az daha çox məlumat əldə etməyinizlə maraqlandınız. Zəhmət olmasa PMF Way -dən PCF8591 sifariş verməyi düşünün.

Bu yazı pmdway.com tərəfindən sizə gətirildi - istehsalçılar və elektronika həvəskarları üçün hər şey, bütün dünyada pulsuz çatdırılma.

Tövsiyə: