Mundarija:

Arduino va PCF8591 ADC DAC IC: 7 qadam
Arduino va PCF8591 ADC DAC IC: 7 qadam

Video: Arduino va PCF8591 ADC DAC IC: 7 qadam

Video: Arduino va PCF8591 ADC DAC IC: 7 qadam
Video: PCF8591 AD-DA Converter Demo with AT89S52 2024, Noyabr
Anonim
Arduino va PCF8591 ADC DAC IC
Arduino va PCF8591 ADC DAC IC

Siz hech qachon Arduino loyihangizda ko'proq analog kirish pinlarini xohlaganmisiz, lekin Mega -ni ajratishni xohlamaganmisiz? Yoki siz analog signallarni yaratmoqchimisiz? Keyin bizning darsimizning mavzusi - NXP PCF8591 IC bilan tanishing.

Bu ikkala muammoni ham hal qiladi, chunki u bitta DAC (raqamlidan analoggacha) konvertorga ega, shuningdek to'rtta ADC (raqamli konvertorga analog) - hammasiga I2C avtobusi orqali kirish mumkin. PCF8591 DIP, sirtga o'rnatish va modul shaklida mavjud, bu esa tajriba o'tkazishni osonlashtiradi.

Davom etishdan oldin, ma'lumotlar jadvalini yuklab oling. PCF8591 5V va 3.3V kuchlanishlarida ishlashi mumkin, shuning uchun agar siz Arduino Due, Raspberry Pi yoki boshqa 3.3 V ishlab chiqarish kartasidan foydalansangiz, yaxshi. Endi biz avval DACni, keyin ADClarni tushuntiramiz.

1-qadam: DAC-dan foydalanish (raqamli-analogli konvertor)

DAC (raqamli-analogli konvertor) dan foydalanish
DAC (raqamli-analogli konvertor) dan foydalanish

PCF8591-dagi DAC 8 bitli piksellar soniga ega, shuning uchun u 255 bosqichda nol volts va mos yozuvlar kuchlanish (Vref) o'rtasidagi nazariy signalni yaratishi mumkin. Namoyish maqsadida biz 5V kuchlanishli Vrefdan foydalanamiz, siz esa pastroq Vrefdan foydalanishingiz mumkin, masalan, 3.3V yoki siz xohlagan narsani maksimal qiymatini xohlaysiz … lekin u besleme zo'riqishidan past bo'lishi kerak.

E'tibor bering, analog chiqishda yuk bo'lsa (real vaziyat), maksimal chiqish voltaji pasayadi-ma'lumotlar varag'i (siz yuklagan) 10 kΩ yuk uchun 10% pasayishni ko'rsatadi. Endi bizning namoyish doiramiz uchun.

I2C avtobusida 10kΩ tortish rezistorlari va 5V va GND o'rtasidagi 10kF kondansatör ishlatilishiga e'tibor bering. I2C avtobus manzili A0 ~ A2 pinlari kombinatsiyasi bilan o'rnatiladi va ularning hammasi GND manziliga 0x90 bo'ladi. Analog chiqishni 15 -pindan olish mumkin (va 13 -pinda alohida GND analogi mavjud. Bundan tashqari, 13 -pinni GND ga, GND sxemasini Arduino GND ga ulang.

DACni boshqarish uchun biz ikki baytli ma'lumotlarni yuborishimiz kerak. Birinchisi, DACni faollashtiradigan va 1000000 (yoki 0x40) bo'lgan keyingi bayt - 0 dan 255 gacha (chiqish darajasi). Bu quyidagi eskizda ko'rsatilgan:

// Misol 52.1 PCF8591 DAC demosi

#clude "Wire.h" #define PCF8591 (0x90 >> 1) // I2C avtobus manzili void setup () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // uyg'onish PCF8591 Wire.write (0x40); // boshqaruv bayt - DAC (ikkilik 1000000) Wire.write (i) ni yoqish; // DAC Wire.endTransmission () ga yuboriladigan qiymat; // uzatishni tugatish}

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

{Wire.beginTransmission (PCF8591); // uyg'onish PCF8591 Wire.write (0x40); // boshqaruv bayt - DAC (ikkilik 1000000) Wire.write (i) ni yoqish; // DAC Wire.endTransmission () ga yuboriladigan qiymat; // uzatishni tugatish}}

#Define bayonotida avtobus manzili biroz o'zgarganini payqadingizmi? Arduino 7-bitli manzillarni yuboradi, lekin PCF8591 8-bitli bo'lishni xohlaydi, shuning uchun biz baytni bir bitga almashtiramiz.

2 -qadam:

Rasm
Rasm

Eskiz natijalari rasmda ko'rsatilgan, biz Vrefni 5V ga, osiloskop zondini va GND ni mos ravishda analog chiqish va GND ga uladik.

3 -qadam:

Rasm
Rasm

Agar sizga egri chiziqlar yoqsa, siz quyida eskiz yordamida sinus to'lqinlarni yaratishingiz mumkin. U oldindan hisoblab chiqilgan kerakli ma'lumotlar punktlarini o'z ichiga olgan qatorda qidiruv jadvalidan foydalanadi:

// Misol 52.2 PCF8591 DAC demo - sinus to'lqin

#clude "Wire.h" #define PCF8591 (0x90 >> 1) // I2C avtobus manzili uint8_t sine_wave [256] = {0x80, 0x83, 0x86, 0x89, 0x8C, 0x90, 0x93, 0x96, 0x99, 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, 0xB, 0xC7, 0xC7, 0xC7 0xB3, 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7D, 0x7D, 0x7D, 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, 0x01, 0x01, 0x01, 0x01 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x1E, 0x0E, 26x20 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); // uyg'onish PCF8591 Wire.write (0x40); // boshqaruv bayt - DAC (ikkilik 1000000) Wire.write (sine_wave ) ni yoqish; // DAC Wire.endTransmission () ga yuboriladigan qiymat; // uzatishni tugatish}}

4 -qadam:

Rasm
Rasm

Quyidagi DSO tasvirini yig'ish uchun biz Vref -ni 3.3V ga o'zgartirdik - sinus to'lqinidagi maxima o'zgarishiga e'tibor bering.

Endi siz DAC bilan tajriba o'tkazib, ovoz effektlarini, signallarni yoki boshqa analog sxemalarni boshqarishingiz mumkin.

5-qadam: ADC-dan foydalanish (analog-raqamli konvertorlar)

Agar siz Arduino -da analogRead () funktsiyasidan foydalangan bo'lsangiz (birinchi bobda), siz ADC bilan allaqachon tanishsiz. PCF8591 bilan biz nol va Vref o'rtasidagi kuchlanishni o'qiy olamiz va u nol va Vref bilan to'g'ridan to'g'ri proportsional bo'lgan nol va 255 oralig'idagi qiymatni qaytaradi.

Masalan, 3,3V o'lchov 168 ga qaytishi kerak. ADC ning o'lchamlari (8-bit) Arduino bortidan pastroq (10-bit), lekin PCF8591 Arduino ADC qila olmaydigan ishni qila oladi. Lekin biz bunga bir zumda erishamiz. Birinchidan, har bir ADC pinining qiymatlarini o'qish uchun biz PCF8591ga qaysi ADC o'qishni xohlayotganimizni aytib berish uchun boshqaruv baytini yuboramiz. ADC uchun noldan uchgacha nazorat bayti mos ravishda 0x00, 0x01, ox02 va 0x03 dir.

Keyin biz ADCdan ikki bayt ma'lumotni qaytarib berishni so'raymiz va ikkinchi baytni ishlatish uchun saqlaymiz. Nima uchun ikkita bayt? PCF8591 avval o'lchangan qiymatni qaytaradi - keyin joriy bayt. (Ma'lumotlar varag'idagi 8 -rasmga qarang). Va nihoyat, agar siz barcha ADC pinlarini ishlatmasangiz, ishlatilmaganlarni GND ga ulang. Quyidagi eskiz har bir ADC pinidan birma -bir qiymatlarni oladi va ularni ketma -ket monitorda ko'rsatadi:

#"Wire.h" ni qo'shing

#define PCF8591 (0x90 >> 1) // I2C avtobus manzili #ADC0 0x00 ni belgilash // individual ADClarni o'qish uchun boshqaruv baytlari #ADC1ni belgilash 0x01 #ADC2ni aniqlang 0x02 #ADC3ni belgilang 0x03 baytli qiymat 0, 1 -qiymat, 2 -qiymat, 3 -qiymat; void setup () {Wire.begin (); Serial.begin (9600); } void loop () {Wire.beginTransmission (PCF8591); // uyg'onish PCF8591 Wire.write (ADC0); // boshqaruv bayt - ADC0 Wire.endTransmission () ni o'qing; // uzatishni tugatish Wire.requestFrom (PCF8591, 2); qiymati0 = Wire.read (); qiymati0 = Wire.read (); Wire.beginTransmission (PCF8591); // uyg'onish PCF8591 Wire.write (ADC1); // boshqaruv bayt - ADC1 Wire.endTransmission () ni o'qing; // uzatishni tugatish Wire.requestFrom (PCF8591, 2); qiymat1 = Wire.read (); qiymat1 = Wire.read (); Wire.beginTransmission (PCF8591); // uyg'onish PCF8591 Wire.write (ADC2); // boshqaruv bayt - ADC2 Wire.endTransmission () ni o'qing; // uzatishni tugatish Wire.requestFrom (PCF8591, 2); qiymat2 = Wire.read (); qiymat2 = Wire.read (); Wire.beginTransmission (PCF8591); // uyg'onish PCF8591 Wire.write (ADC3); // boshqaruv bayt - ADC3 Wire.endTransmission () ni o'qing; // uzatishni tugatish Wire.requestFrom (PCF8591, 2); qiymati3 = Wire.read (); qiymati3 = Wire.read (); Serial.print (qiymati 0); Serial.print (""); Serial.print (qiymat 1); Serial.print (""); Serial.print (qiymati 2); Serial.print (""); Serial.print (qiymati 3); Serial.print (""); Serial.println (); }

Eskizni ishga tushirgandan so'ng sizga ketma -ket monitorda har bir ADC qiymatlari ko'rsatiladi. Garchi bu sizga har bir ADCni alohida o'qishni ko'rsatish uchun oddiy namoyish bo'lsa -da, bu ma'lum bir ADCdan bir vaqtning o'zida bir nechta baytni olishning og'ir usuli.

6 -qadam:

Buning uchun boshqaruv baytini avtomatik oshirishni so'rash uchun o'zgartiring, bu nazorat baytining 2-bitini 1 ga o'rnatish orqali amalga oshiriladi, shuning uchun ADC0 dan boshlash uchun biz ikkilik 00000100 yoki o'n oltilik 0x04 boshqaruv baytidan foydalanamiz. Keyin besh bayt ma'lumotni so'rang (biz yana birinchi baytni e'tiborsiz qoldiramiz), bu esa PCF8591 ning barcha baytlar zanjiridagi barcha qiymatlarni qaytarishiga olib keladi. Bu jarayon quyidagi eskizda ko'rsatilgan:

#"Wire.h" ni qo'shing

#define PCF8591 (0x90 >> 1) // I2C avtobus manzili bayt qiymati0, qiymat1, qiymat2, qiymat3; void setup () {Wire.begin (); Serial.begin (9600); } void loop () {Wire.beginTransmission (PCF8591); // uyg'onish PCF8591 Wire.write (0x04); // boshqaruv baytlari - ADC0 ni o'qing, so'ngra avtomatik ravishda Wire.endTransmission (); // uzatishni tugatish Wire.requestFrom (PCF8591, 5); qiymati0 = Wire.read (); qiymati0 = Wire.read (); qiymat1 = Wire.read (); qiymat2 = Wire.read (); qiymati3 = Wire.read (); Serial.print (qiymati 0); Serial.print (""); Serial.print (qiymat 1); Serial.print (""); Serial.print (qiymat2); Serial.print (""); Serial.print (qiymati 3); Serial.print (""); Serial.println (); }

Avval aytib o'tganimizdek, PCF8591 Arduino ADC qila olmaydigan ishni qila oladi va bu differentsial ADCni taklif qiladi. Arduino-ning yagona uchidan farqli o'laroq (ya'ni, u ijobiy signal kuchlanishi va GND o'rtasidagi farqni qaytaradi), differentsial ADC ikkita signalni qabul qiladi (bu albatta erga havola qilinishi shart emas) va ikkita signal orasidagi farqni qaytaradi. Bu yuk xujayralari uchun kuchlanishdagi kichik o'zgarishlarni o'lchash uchun qulay bo'lishi mumkin va hokazo.

7 -qadam:

Rasm
Rasm

PCF8591 -ni differentsial ADC uchun sozlash - bu boshqaruv baytini o'zgartirishning oddiy masalasidir. Agar siz ma'lumotlar varag'ining ettinchi sahifasiga o'tsangiz, analog kirish dasturlarining har xil turlarini ko'rib chiqing. Ilgari biz "00" rejimini to'rtta kirish uchun ishlatardik, lekin siz aniq tasvirlangan boshqalarini tanlashingiz mumkin, masalan rasm.

Shunday qilib, nazorat baytini ikkita differentsial kirish uchun o'rnatish uchun ikkilik 00110000 yoki 0x30 dan foydalaning. Ma'lumotlar baytini so'rash va ular bilan ishlash oddiy masala. Ko'rib turganingizdek, bitta/differentsial va murakkab uch differentsial kirish kombinatsiyasi mavjud. Biroq, biz ularni hozircha tark etamiz.

Umid qilamanki, siz tajribangizga DAC qo'shasizmi yoki ADClar haqida biroz ko'proq ma'lumot olasizmi, bu sizni qiziqtirdi. Iltimos, PMF Way -dan PCF8591 -ga buyurtma bering.

Bu xabar sizga pmdway.com tomonidan olib kelingan - ishlab chiqaruvchilar va elektronika ixlosmandlari uchun hamma narsa, butun dunyo bo'ylab bepul etkazib berish.

Tavsiya: