Агуулгын хүснэгт:

Arduino ба PCF8591 ADC DAC IC: 7 алхам
Arduino ба PCF8591 ADC DAC IC: 7 алхам

Видео: Arduino ба PCF8591 ADC DAC IC: 7 алхам

Видео: Arduino ба PCF8591 ADC DAC IC: 7 алхам
Видео: Подключение и настройка nRF24L01 к Arduino (модуль беспроводной связи) 2024, Арваннэгдүгээр
Anonim
Arduino ба PCF8591 ADC DAC IC
Arduino ба PCF8591 ADC DAC IC

Та Arduino төсөл дээрээ илүү аналог оролтын тээглүүр авахыг хүсч байсан боловч Mega -ийг салгахыг хүсээгүй үү? Эсвэл та аналог дохио үүсгэхийг хүсч байна уу? Дараа нь манай хичээлийн сэдэв болох NXP PCF8591 IC -ийг үзээрэй.

Энэ нь ганц DAC (дижиталаас аналог руу) хөрвүүлэгчтэй, мөн дөрвөн ADC (дижитал хөрвүүлэгчийн аналог) байдаг тул эдгээр асуудлыг хоёуланг нь шийддэг бөгөөд бүгд I2C автобусаар дамждаг. PCF8591 нь DIP, гадаргуу дээр суурилуулах, модуль хэлбэрээр байдаг тул туршилт хийхэд хялбар болгодог.

Үргэлжлүүлэхийн өмнө мэдээллийн хуудсыг татаж авна уу. PCF8591 нь 5V ба 3.3V хоёуланд нь ажиллах боломжтой тул хэрэв та Arduino Due, Raspberry Pi эсвэл бусад 3.3V хөгжүүлэлтийн самбар ашиглаж байгаа бол сайн байна. Одоо бид эхлээд DAC, дараа нь ADC -ийг тайлбарлах болно.

Алхам 1: DAC (дижитал-аналог хөрвүүлэгч) ашиглах

DAC (дижитал-аналог хөрвүүлэгч) ашиглах
DAC (дижитал-аналог хөрвүүлэгч) ашиглах

PCF8591 дээрх DAC нь 8 битийн нягтралтай тул тэг вольт ба жишиг хүчдэл (Vref) хооронд онолын дохиог 255 алхамаар үүсгэх боломжтой. Жагсаалтын зорилгоор бид 5V -ийн Vref -ийг ашиглах бөгөөд та 3.3V гэх мэт доод Vref -ийг ашиглаж болно, гэхдээ хамгийн их утга авахыг хүссэн зүйлээ ашиглаж болно … гэхдээ энэ нь тэжээлийн хүчдэлээс бага байх ёстой.

Аналог гаралт дээр ачаалал (бодит нөхцөл байдал) байх үед хамгийн их гаралтын хүчдэл буурах болно гэдгийг анхаарна уу. Одоо бидний жагсаалын тойргийн хувьд.

I2C автобусанд 10 кОм татдаг резистор, 5V ба GND хооронд 10μF конденсатор ашигласан болохыг анхаарна уу. I2C автобусны хаягийг A0 ~ A2 тээглүүрийн хослолоор тохируулсан бөгөөд GND руу хаяг нь 0x90 байна. Аналог гаралтыг 15 -р зүүгээс авах боломжтой (мөн 13 -р pin дээр тусдаа аналог GND байдаг. Мөн 13 -р зүүг GND -тэй холбож, GND хэлхээг Arduino GND -д холбоно уу.

DAC -ийг хянахын тулд бид хоёр байтын өгөгдлийг илгээх шаардлагатай болно. Эхнийх нь DAC -ийг идэвхжүүлдэг 1000000 (эсвэл 0x40) хэмжээтэй дараагийн байт нь 0 -ээс 255 (гаралтын түвшин) хоорондох утга юм. Үүнийг дараах зурган дээр харуулав.

// Жишээ 52.1 PCF8591 DAC демо

#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C автобусны хаягийн хүчингүй тохиргоо () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // сэрэх PCF8591 Wire.write (0x40); // хяналтын байт - DAC (хоёртын 1000000) Wire.write (i) -ийг асаах; // DAC Wire.endTransmission () руу илгээх утга; // дамжуулалтыг дуусгах}

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

{Wire.beginTransmission (PCF8591); // сэрэх PCF8591 Wire.write (0x40); // хяналтын байт - DAC (хоёртын 1000000) Wire.write (i) -ийг асаах; // DAC Wire.endTransmission () руу илгээх утга; // дамжуулалтыг дуусгах}}

Та #define мэдэгдэлд автобусны хаягийн жаахан шилжилтийг анзаарсан уу? Arduino нь 7 битийн хаягийг илгээдэг боловч PCF8591 нь 8 битийг хүсдэг тул бид байтыг нэг битээр солино.

Алхам 2:

Зураг
Зураг

Ноорог үр дүнг зураг дээр харуулав, бид Vref -ийг 5V, осциллограф датчик ба GND -ийг аналог гаралт ба GND -т тус тус холбосон.

Алхам 3:

Зураг
Зураг

Хэрэв та муруйд дуртай бол доорх тоймоор синус долгион үүсгэж болно. Энэ нь шаардлагатай урьдчилсан тооцоолсон өгөгдлийн цэгүүдийг агуулсан массив дахь хайлтын хүснэгтийг ашигладаг.

// Жишээ 52.2 PCF8591 DAC демо - синус долгион

#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C автобусны хаягийг 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 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFF, 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, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xD7 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, 0x0, 0x10, 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, 0x70, 0x74, 0x77, 0x7A, 0x7D}; void setup () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // сэрэх PCF8591 Wire.write (0x40); // хяналтын байт - DAC (binary 1000000) Wire.write (sine_wave ) -ийг асаах; // DAC Wire.endTransmission () руу илгээх утга; // дамжуулалтыг дуусгах}}

Алхам 4:

Зураг
Зураг

Дараах DSO дүрсний овоолгын хувьд бид Vref -ийг 3.3V болгон өөрчилсөн - синус долгионы хамгийн их утгын өөрчлөлтийг анхаарна уу.

Одоо та DAC -ийг ашиглан дууны эффект, дохио хийх эсвэл бусад аналог хэлхээг хянах боломжтой.

Алхам 5: ADC (аналог-тоон хөрвүүлэгч) ашиглах

Хэрэв та Arduino дээрээ analogRead () функцийг ашигласан бол (нэгдүгээр бүлэгт буцаж очсон) та ADC -ийг аль хэдийн мэддэг болсон. PCF8591 -ийг ашигласнаар бид тэг ба Vref хоёрын хоорондох хүчдэлийг унших боломжтой бөгөөд тэг ба Vref -тэй шууд пропорциональ тэгээс 255 хүртэлх утгыг буцаана.

Жишээлбэл, 3.3V хэмжих нь 168-ийг буцааж өгөх ёстой. ADC-ийн нарийвчлал (8 бит) нь Arduino (10 бит) -ээс бага боловч PCF8591 нь Arduino-ийн ADC-ийн хийж чадахгүй зүйлийг хийж чадна. Гэхдээ бид үүнийг хэсэг хугацааны дараа авах болно. Нэгдүгээрт, ADC зүү бүрийн утгыг уншихын тулд бид ямар ADC -ийг уншихыг хүсч байгаагаа PCF8591 -д мэдэгдэхийн тулд хяналтын байт илгээдэг. ADC -ийн тэгээс гурав хүртэл хяналтын байт нь 0x00, 0x01, ox02 ба 0x03 байна.

Дараа нь бид ADC -ээс хоёр байт өгөгдлийг буцааж өгөхийг хүсч, хоёр дахь байтыг ашиглахаар хадгална. Яагаад хоёр байт гэж? PCF8591 нь өмнө нь хэмжсэн утгыг буцааж одоогийн байтыг буцаана. (Мэдээллийн хүснэгтийн 8 -р зургийг үз). Эцэст нь хэлэхэд, хэрэв та бүх ADC тээглүүрийг ашигладаггүй бол ашиглаагүй байгаа хэсгүүдийг GND -тэй холбоно уу. Дараах жишээ ноорог нь ADC зүү тус бүрээс утгыг нэг нэгээр нь аваад дараа нь цуваа монитор дээр харуулна.

#"Wire.h" -ийг оруулна уу

#тодорхойлох PCF8591 (0x90 >> 1) // I2C автобусны хаягийг #тодорхойлох ADC0 0x00 // тус тусдаа ADC -ийг уншихад зориулагдсан байтыг хянах #ADC1 -ийг тодорхойлох 0x01 #ADC2 -ийг тодорхойлох ADC3 0x03 байтын утга0, утга1, утга2, утга3; void setup () {Wire.begin (); Цуваа эхлэх (9600); } void loop () {Wire.beginTransmission (PCF8591); // сэрэх PCF8591 Wire.write (ADC0); // хяналтын байт - ADC0 Wire.endTransmission () -ийг уншина уу; // дамжуулалтыг дуусгах Wire.requestFrom (PCF8591, 2); утга0 = Wire.read (); утга0 = Wire.read (); Wire.beginTransmission (PCF8591); // сэрэх PCF8591 Wire.write (ADC1); // хяналтын байт - ADC1 Wire.endTransmission () -ийг уншина уу; // дамжуулалтыг дуусгах Wire.requestFrom (PCF8591, 2); утга1 = Wire.read (); утга1 = Wire.read (); Wire.beginTransmission (PCF8591); // сэрэх PCF8591 Wire.write (ADC2); // хяналтын байт - ADC2 Wire.endTransmission () -ийг уншина уу; // дамжуулалтыг дуусгах Wire.requestFrom (PCF8591, 2); утга2 = Wire.read (); утга2 = Wire.read (); Wire.beginTransmission (PCF8591); // сэрэх PCF8591 Wire.write (ADC3); // хяналтын байт - ADC3 Wire.endTransmission () -ийг уншина уу; // дамжуулалтыг дуусгах Wire.requestFrom (PCF8591, 2); утга3 = Wire.read (); утга3 = Wire.read (); Serial.print (утга0); Serial.print (""); Serial.print (утга1); Serial.print (""); Serial.print (утга2); Serial.print (""); Serial.print (утга3); Serial.print (""); Serial.println (); }

Ноорогыг ажиллуулсны дараа танд цуврал дэлгэц дээрх ADC бүрийн утгыг танилцуулах болно. Хэдийгээр ADC бүрийг тус тусад нь уншихыг харуулсан энгийн жагсаал байсан боловч энэ нь тодорхой ADC -ээс нэг удаад нэгээс олон байт авах маш төвөгтэй арга юм.

Алхам 6:

Үүнийг хийхийн тулд хяналтын байтыг автоматаар нэмэгдүүлэх хүсэлт гаргахын тулд 2-р битийн удирдлагын байтыг 1 болгож тохируулна. Тиймээс ADC0-ээс эхлэхийн тулд бид хоёртын 00000100 эсвэл арван зургаатын 0x04 гэсэн шинэ хяналтын байтыг ашигладаг. Дараа нь таван байтын өгөгдөл хүсэх (бид дахин эхний байтыг үл тоомсорлодог) бөгөөд энэ нь PCF8591 -ийг нэг байтын гинжин хэлхээнд бүх утгыг буцаахад хүргэдэг. Энэ үйл явцыг дараах зураг дээр харуулав.

#"Wire.h" -ийг оруулна уу

#define PCF8591 (0x90 >> 1) // I2C автобусны хаягийн байтын утга0, утга1, утга2, утга3; void setup () {Wire.begin (); Цуваа эхлэх (9600); } void loop () {Wire.beginTransmission (PCF8591); // сэрэх PCF8591 Wire.write (0x04); // хяналтын байт - ADC0 -ийг уншиж, дараа нь автоматаар нэмэгдүүлэх Wire.endTransmission (); // дамжуулалтыг дуусгах Wire.requestFrom (PCF8591, 5); утга0 = Wire.read (); утга0 = Wire.read (); утга1 = Wire.read (); утга2 = Wire.read (); утга3 = Wire.read (); Serial.print (утга0); Serial.print (""); Serial.print (утга1); Serial.print (""); Serial.print (утга2); Serial.print (""); Serial.print (утга3); Serial.print (""); Serial.println (); }

PCF8591 нь Arduino -ийн ADC -ийн хийж чадахгүй зүйлийг хийж чадна гэж өмнө дурдсан бөгөөд энэ нь дифференциал ADC -ийг санал болгодог. Arduino-ийн нэг үзүүртэй харьцуулахад (өөрөөр хэлбэл энэ нь эерэг дохионы хүчдэл ба GND-ийн зөрүүг буцааж өгдөг), дифференциал ADC нь хоёр дохиог хүлээн авдаг (үүнийг заавал газарт заавал зааж өгөх шаардлагагүй), хоёр дохионы ялгааг буцаана. Энэ нь ачааллын үүр гэх мэт хүчдэлийн бага зэргийн өөрчлөлтийг хэмжихэд тохиромжтой байж болох юм.

Алхам 7:

Зураг
Зураг

PCF8591 -ийг дифференциал ADC -д тохируулах нь хяналтын байтыг өөрчлөх энгийн асуудал юм. Хэрэв та мэдээллийн хуудасны 7 -р хуудсыг үзвэл аналог оролтын програмчлалын янз бүрийн төрлийг анхаарч үзээрэй. Өмнө нь бид '00' горимыг дөрвөн оролтод ашигладаг байсан боловч та тодорхой дүрсэлсэн бусад зүйлийг сонгож болно, жишээ нь зураг.

Тиймээс хяналтын байтыг хоёр дифференциал оролтод тохируулахын тулд хоёртын 00110000 эсвэл 0x30 ашиглана уу. Дараа нь өгөгдлийн байтыг хүсэх, тэдэнтэй ажиллах нь энгийн асуудал юм. Таны харж байгаагаар дан/дифференциал ба гурван дифференциал оролтын хослол байдаг. Гэсэн хэдий ч бид тэднийг одоохондоо орхих болно.

Туршилтанд DAC нэмэх эсвэл ADC -ийн талаар илүү ихийг мэдэх нь танд сонирхолтой байсан гэж найдаж байна. PMD Way -ээс PCF8591 -ийг захиалах талаар бодож үзээрэй.

Энэхүү бичлэгийг pmdway.com танд хүргэсэн бөгөөд энэ нь үйлдвэрлэгч болон цахилгаан бараа сонирхогчдод зориулагдсан бүх зүйлийг дэлхий даяар үнэгүй хүргэж өгөх болно.

Зөвлөмж болгож буй: