Мазмұны:

Arduino және PCF8591 ADC DAC IC: 7 қадам
Arduino және PCF8591 ADC DAC IC: 7 қадам

Бейне: Arduino және PCF8591 ADC DAC IC: 7 қадам

Бейне: Arduino және PCF8591 ADC DAC IC: 7 қадам
Бейне: Arduino ҚАЗАҚША [2] Ардуино және Макеталық тақта 2024, Шілде
Anonim
Arduino және PCF8591 ADC DAC IC
Arduino және PCF8591 ADC DAC IC

Сіз өзіңіздің Arduino жобаңызда аналогтық кіріс түйреуіштерін көбірек алғыңыз келді ме, бірақ Мегадан айырылғыңыз келмеді ме? Немесе аналогтық сигналдарды шығарғыңыз келе ме? Содан кейін біздің оқулықтың тақырыбын қараңыз - NXP PCF8591 IC.

Ол бұл екі мәселені де шешеді, себебі оның бір DAC (цифрлықтан аналогты) түрлендіргіші бар, сонымен қатар төрт ADC (цифрлық түрлендіргішке аналогты) барлығына I2C шинасы арқылы қол жетімді. PCF8591 DIP, беттік бекіту және модуль түрінде қол жетімді, бұл тәжірибе жасауды жеңілдетеді.

Көшпес бұрын, мәліметтер парағын жүктеп алыңыз. PCF8591 5V мен 3.3V -де жұмыс істей алады, сондықтан егер сіз Arduino Due, Raspberry Pi немесе басқа 3.3 В даму тақтасын қолдансаңыз, жақсы. Енді біз алдымен DAC, содан кейін ADC түсіндіреміз.

1-қадам: DAC (сандық-аналогтық түрлендіргіш) пайдалану

DAC (сандық-аналогтық түрлендіргіш) қолдану
DAC (сандық-аналогтық түрлендіргіш) қолдану

PCF8591-дегі DAC ажыратымдылығы 8 битті құрайды, сондықтан ол нөлдік вольт пен эталондық кернеудің (Vref) арасындағы теориялық сигналды 255 қадаммен жасай алады. Демонстрациялық мақсатта біз 5В Vref қолданамыз, ал сіз 3.3V сияқты төменгі Vref қолдана аласыз немесе максималды мәнді қалаған нәрсені қолдана аласыз … бірақ ол кернеудің кернеуінен аз болуы керек.

Назар аударыңыз, аналогтық шығысқа жүктеме болған кезде (нақты жағдай), максималды шығыс кернеуі төмендейді-деректер парағында (сіз жүктеген) 10кО жүктеме үшін 10% төмендеуді көрсетеді. Енді біздің демонстрациялық схемаға.

I2C шинасында 10 кОм тартылатын резисторлар мен 5V мен GND арасындағы 10 мкФ конденсатордың қолданылуына назар аударыңыз. I2C шинасының адресі A0 ~ A2 түйреуіштерінің комбинациясы арқылы орнатылады және олардың барлығымен GND мекенжайы 0x90 болады. Аналогтық шығыс 15 -ші түйреуіштен алынуы мүмкін (және 13 -істе бөлек GND аналогы бар. Сонымен қатар, 13 -істікті GND -ге, ал GND тізбегін Arduino GND -ге қосыңыз.

DAC басқару үшін бізге екі байт деректер жіберу керек. Біріншісі - бұл DAC -ты белсендіретін және 1000000 (немесе 0x40) болатын келесі байт: 0 мен 255 арасындағы мән (шығыс деңгейі). Бұл келесі эскизде көрсетілген:

// Мысал 52.1 PCF8591 DAC демо

#include «Wire.h» #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 жіберілетін мән (); // таратуды аяқтау}

үшін (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 -ті 5В -қа, осциллограф пен зондты сәйкесінше аналогтық шығысқа және GND -ге қостық.

3 -қадам:

Кескін
Кескін

Егер сізге қисықтар ұнайтын болса, сіз төмендегі эскизбен синусоидалық толқындар жасай аласыз. Ол қажетті алдын ала есептелген деректер нүктелерін қамтитын массивте іздеу кестесін пайдаланады:

// Мысал 52.2 PCF8591 DAC демо - синусоиды

#қосу «Wire.h» #PCF8591 (0x90 >> 1) // I2C шинасының адресін uine8_t sine_wave [256] = {0x80, 0x83, 0x86, 0x89, 0x8C, 0x90, 0x93, 0x96, 0x99, 0x9C, 0x9C, 02 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, 0xFx, 0xF6, 0xF6, 0xFF 0xED, 0xEB, 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC, 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9, 0xCx, 0xB, 0xC7, 0xC7, 0xC7, 0xC7 0xB3, 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7, 0x7, 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, 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, 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 қосу (екілік 1000000) Wire.write (sine_wave ); // DAC Wire.endTransmission жіберілетін мән (); // таратуды тоқтату}}

4 -қадам:

Кескін
Кескін

Келесі DSO кескін демпті үшін біз Vref -ті 3.3V -ке өзгерттік - синусоиданың максимумдарының өзгеруін ескеріңіз.

Енді сіз дыбыстық эффектілерді, сигналдарды шығару немесе басқа аналогтық схемаларды басқару үшін DAC -пен тәжірибе жасай аласыз.

5-қадам: ADC (аналогты-цифрлық түрлендіргіштер) қолдану

Егер сіз Arduino -да analogRead () функциясын қолдансаңыз (бірінші тарауда), онда сіз ADC -пен таныссыз. PCF8591 көмегімен біз нөл мен Vref арасындағы кернеуді оқи аламыз және ол нөл мен Vref -ке тура пропорционалды нөл мен 255 арасындағы мәнді қайтарады.

Мысалы, 3,3В өлшеу 168 қайтаруы тиіс. ADC ажыратымдылығы (8 биттік) Arduino бортына (10 биттік) қарағанда төмен, бірақ PCF8591 Arduino ADC жасай алмайтын нәрсені жасай алады. Бірақ біз бұған бір сәтте жетеміз. Біріншіден, әрбір ADC түйреуішінің мәндерін оқу үшін біз PCF8591 -ге қандай ADC оқығымыз келетінін айту үшін басқару байтын жібереміз. ADC нөлден үшке дейін басқару байты сәйкесінше 0x00, 0x01, ox02 және 0x03 құрайды.

Содан кейін біз ADC -тен деректердің екі байтын сұраймыз және екінші байтты пайдалану үшін сақтаймыз. Неліктен екі байт? PCF8591 алдымен бұрын өлшенген мәнді қайтарады - содан кейін ағымдағы байт. (Деректер парағындағы 8 -суретті қараңыз). Ақырында, егер сіз барлық ADC түйреуіштерін пайдаланбасаңыз, пайдаланылмағандарды GND -ге қосыңыз. Келесі мысал эскизі әрбір ADC түйреуішінен мәндерді бір -бірден алады, содан кейін оларды сериялық мониторда көрсетеді:

#«Wire.h» қосыңыз

#define PCF8591 (0x90 >> 1) // I2C шинасының адресі #ADC0 0x00 анықтаңыз // жеке АДК оқуға арналған бақылау байттары #анықтаңыз ADC1 0x01 #анықтаңыз ADC2 0x02 #анықтаңыз ADC3 0x03 байт мәні0, мән1, мән2, мән3; void setup () {Wire.begin (); Serial.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 (); Serial.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 ұсынады. Ардуиноның бір ұшынан айырмашылығы (яғни ол оң сигнал кернеуі мен GND арасындағы айырмашылықты қайтарады) дифференциалды ADC екі сигналды қабылдайды (міндетті түрде жерге сілтеме жасау қажет емес) және екі сигнал арасындағы айырмашылықты қайтарады… Бұл жүктеме ұяшықтары үшін кернеудің шамалы өзгеруін өлшеуге ыңғайлы болуы мүмкін.

7 -қадам:

Кескін
Кескін

PCF8591 дифференциалды ADC үшін реттеу - бұл басқару байтын өзгертудің қарапайым мәселесі. Егер сіз деректер парағының жетінші бетіне жүгінсеңіз, аналогты енгізу бағдарламалаудың әр түрін қарастырыңыз. Бұрын біз төрт енгізу үшін '00' режимін қолдандық, алайда сіз нақты суреттелген басқаларын таңдай аласыз, мысалы, сурет.

Басқару байтын екі дифференциалды енгізу үшін орнату үшін екілік 00110000 немесе 0x30 пайдаланыңыз. Содан кейін деректердің байттарын сұрау және олармен жұмыс істеу қарапайым мәселе. Көріп отырғаныңыздай, жалғыз/дифференциалды және үш дифференциалды кірістің комбинациясы бар. Дегенмен, біз оларды әзірге қалдырамыз.

Тәжірибелеріңізге DAC қосу немесе ADCs туралы көбірек білу сізге қызықты болды деп үміттенеміз. PMD Way -ден PCF8591 -ге тапсырыс беруді қарастырыңыз.

Бұл хабарламаны pmdway.com сізге жеткізді - бұл өндірушілер мен электроникаға әуесқойлар үшін, бүкіл әлем бойынша ақысыз жеткізу.

Ұсынылған: