INHOUDSOPGAWE:

Arduino en PCF8591 ADC DAC IC: 7 stappe
Arduino en PCF8591 ADC DAC IC: 7 stappe

Video: Arduino en PCF8591 ADC DAC IC: 7 stappe

Video: Arduino en PCF8591 ADC DAC IC: 7 stappe
Video: Модуль ADS1115, 16-Bit АЦП, Обзор 2024, November
Anonim
Arduino en PCF8591 ADC DAC IC
Arduino en PCF8591 ADC DAC IC

Wou u al ooit meer analoog invoerpenne vir u Arduino -projek, maar wou u nie vir 'n Mega vurk nie? Of wil u analoog seine genereer? Kyk dan na die onderwerp van ons tutoriaal - die NXP PCF8591 IC.

Dit los beide hierdie probleme op, aangesien dit 'n enkele DAC (digitaal na analoog) omskakelaar sowel as vier ADC's (analoog na digitale omsetters) het - alles toeganklik via die I2C -bus. Die PCF8591 is beskikbaar in DIP-, oppervlakmonterings- en modulevorm, wat dit maklik maak om mee te eksperimenteer.

Laai die datablad af voordat u verder gaan. Die PCF8591 kan beide op 5V en 3.3V werk, dus as u 'n Arduino Due, Raspberry Pi of ander 3.3V -ontwikkelbord gebruik, is dit goed. Nou verduidelik ons eers die DAC, dan die ADC's.

Stap 1: Gebruik die DAC (digitaal-na-analoog omskakelaar)

Gebruik die DAC (digitaal-na-analoog omskakelaar)
Gebruik die DAC (digitaal-na-analoog omskakelaar)

Die DAC op die PCF8591 het 'n resolusie van 8-bisse-sodat dit in 255 stappe 'n teoretiese sein van tussen nul volt en die verwysingsspanning (Vref) kan genereer. Vir demonstrasiedoeleindes gebruik ons 'n Vref van 5V, en u kan 'n laer Vref gebruik, soos 3.3V of wat u ook al wil hê die maksimum waarde moet wees … dit moet egter minder wees as die voedingsspanning.

Let daarop dat die maksimum uitgangsspanning daal as die analoog-uitset 'n las het ('n werklike situasie)-die gegewensblad (wat u afgelaai het) toon 'n daling van 10% vir 'n 10kΩ-las. Nou vir ons demonstrasiebaan.

Let op die gebruik van 10kΩ optrekweerstands op die I2C-bus en die 10μF-kondensator tussen 5V en GND. Die I2C -busadres word bepaal deur 'n kombinasie van penne A0 ~ A2, en by almal na GND is die adres 0x90. Die analoog uitset kan geneem word uit pen 15 (en daar is 'n aparte analoog GND op pen 13. Koppel ook pen 13 aan GND en skakel GND na Arduino GND.

Om die DAC te beheer, moet ons twee grepe data stuur. Die eerste is die kontrole -byte, wat die DAC eenvoudig aktiveer en 1000000 (of 0x40) is, en die volgende byte is die waarde tussen 0 en 255 (die uitsetvlak). Dit word aangetoon in die volgende skets:

// Voorbeeld 52.1 PCF8591 DAC demo

#sluit "Wire.h" #define PCF8591 (0x90 >> 1) // I2C -busadres ongeldig opstelling () {Wire.begin (); } leemte -lus () {vir (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // word wakker PCF8591 Wire.write (0x40); // beheer -byte - skakel DAC aan (binêre 1000000) Wire.write (i); // waarde om na DAC Wire.endTransmission () te stuur; // einde transmissie}

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

{Wire.beginTransmission (PCF8591); // word wakker PCF8591 Wire.write (0x40); // beheer -byte - skakel DAC aan (binêre 1000000) Wire.write (i); // waarde om na DAC Wire.endTransmission () te stuur; // einde transmissie}}

Het u die bietjie verskuiwing van die busadres in die #define -verklaring opgemerk? Arduino stuur 7-bis adresse, maar die PCF8591 wil 'n 8-bit hê, so ons skuif die byte met 'n bietjie oor.

Stap 2:

Beeld
Beeld

Die resultate van die skets word in die prentjie getoon; ons het die Vref aan 5V en die ossilloskoop sonde en GND gekoppel aan die analoog uitset en GND.

Stap 3:

Beeld
Beeld

As u van kurwes hou, kan u sinusgolwe genereer met die onderstaande skets. Dit gebruik 'n opzoektabel in 'n skikking wat die nodige vooraf berekende datapunte bevat:

// Voorbeeld 52.2 PCF8591 DAC demo - sinusgolf

#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C bus address uint8_t sine_wave [256] = {0x80, 0x83, 0x86, 0x89, 0x8C, 0x90, 0x93, 0x96, 0x99, 0x9C, 0x9F, 0xA2, 0xA5, 0xA8, 0xAB, 0xAE, 0xB1, 0xB3, 0xB6, 0xB9, 0xBC, 0xBF, 0xC1, 0xC4, 0xC7, 0xC9, 0xCC, 0xCE, 0xD1, 0xD3, 0xD 0, 0xD, 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6, 0xF5, 0xF0, 0xF, 0xED, 0xEB, 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC, 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9, 0xC7, 0xB9, 0xB, 0xB, 0xB 0xB3, 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7D, 0x7, 0x7, 0x07 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, 0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0, 0x0, 0x0, 0x3 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x16, 0x18, 0x1A, 0x1C, 0x20, 0x20, 0x, 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37, 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D, 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5, 0x6, 0x6, 0x6 0x70, 0x74, 0x77, 0x7A, 0x7D}; ongeldige opstelling () {Wire.begin (); } leemte -lus () {vir (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // word wakker PCF8591 Wire.write (0x40); // beheer -byte - skakel DAC aan (binêre 1000000) Wire.write (sinus_golf ); // waarde om na DAC Wire.endTransmission () te stuur; // einde transmissie}}

Stap 4:

Beeld
Beeld

Vir die volgende DSO -beeldstorting het ons die Vref verander na 3.3V - let op die verandering in die maksima op die sinusgolf.

Nou kan u met die DAC eksperimenteer om klankeffekte, seine te maak of ander analoog stroombane te beheer.

Stap 5: Gebruik die ADC's (analoog-na-digitale omskakelaars)

As u die analogRead () -funksie op u Arduino (terug in hoofstuk een) gebruik het, dan is u reeds bekend met 'n ADC. Sonder PCF8591 kan ons 'n spanning tussen nul en die Vref lees, en dit gee 'n waarde tussen nul en 255 wat direk eweredig is aan nul en die Vref.

Byvoorbeeld, die meting van 3.3V behoort 168 terug te gee. Die resolusie (8-bis) van die ADC is laer as die ingeboude Arduino (10-bit), maar die PCF8591 kan iets doen wat die Arduino se ADC nie kan doen nie. Maar ons kom binne 'n oomblik daarby. Eerstens, om die waardes van elke ADC -pen eenvoudig te lees, stuur ons 'n beheerbyte om die PCF8591 te vertel watter ADC ons wil lees. Vir ADC's nul tot drie is die kontrole -byte onderskeidelik 0x00, 0x01, ox02 en 0x03.

Dan vra ons twee grepe data terug van die ADC en stoor die tweede byte vir gebruik. Waarom twee grepe? Die PCF8591 gee eers die voorheen gemete waarde terug - dan die huidige byte. (Sien Figuur 8 in die gegewensblad). As u uiteindelik nie al die ADC -penne gebruik nie, koppel die ongebruikte aan GND. Die volgende voorbeeldskets haal eenvoudig een vir een waardes uit elke ADC -pen, en vertoon dit dan in die seriële monitor:

#sluit "Wire.h" in

#define PCF8591 (0x90 >> 1) // I2C busadres #define ADC0 0x00 // beheer grepe vir die lees van individuele ADC's #definieer ADC1 0x01 #definieer ADC2 0x02 #definieer ADC3 0x03 byte waarde0, waarde1, waarde2, waarde3; ongeldige opstelling () {Wire.begin (); Serial.begin (9600); } leemte -lus () {Wire.beginTransmission (PCF8591); // word wakker PCF8591 Wire.write (ADC0); // beheer -byte - lees ADC0 Wire.endTransmission (); // beëindig transmissie Wire.requestFrom (PCF8591, 2); waarde0 = Wire.read (); waarde0 = Wire.read (); Wire.beginTransmission (PCF8591); // maak PCF8591 Wire.write (ADC1) wakker; // beheer -byte - lees ADC1 Wire.endTransmission (); // beëindig transmissie Wire.requestFrom (PCF8591, 2); waarde1 = Wire.read (); waarde1 = Wire.read (); Wire.beginTransmission (PCF8591); // word wakker PCF8591 Wire.write (ADC2); // beheer -byte - lees ADC2 Wire.endTransmission (); // beëindig transmissie Wire.requestFrom (PCF8591, 2); waarde2 = Wire.read (); waarde2 = Wire.read (); Wire.beginTransmission (PCF8591); // word wakker PCF8591 Wire.write (ADC3); // beheer -byte - lees ADC3 Wire.endTransmission (); // beëindig transmissie Wire.requestFrom (PCF8591, 2); waarde3 = Wire.read (); waarde3 = Wire.read (); Serial.print (waarde0); Serial.print (""); Serial.print (waarde1); Serial.print (""); Serial.print (waarde2); Serial.print (""); Serial.print (waarde3); Serial.print (""); Serial.println (); }

As u die skets uitvoer, word die waardes van elke ADC in die seriële monitor voorgestel. Alhoewel dit 'n eenvoudige demonstrasie was om u te wys hoe u elke ADC individueel kan lees, is dit 'n omslagtige metode om meer as een byte tegelyk van 'n spesifieke ADC te kry.

Stap 6:

Om dit te doen, verander die beheerbyte om outomatiese verhoging aan te vra, wat gedoen word deur bit 2 van die beheerbyte in te stel op 1. Om van ADC0 af te begin, gebruik ons 'n nuwe beheerbyte van binêre 00000100 of heksadesimale 0x04. Vra dan vyf grepe data aan (weereens ignoreer ons die eerste byte), wat veroorsaak dat die PCF8591 alle waardes in een ketting grepe terugstuur. Hierdie proses word in die volgende skets getoon:

#sluit "Wire.h" in

#define PCF8591 (0x90 >> 1) // I2C bus adres byte waarde0, waarde1, waarde2, waarde3; ongeldige opstelling () {Wire.begin (); Serial.begin (9600); } leemte -lus () {Wire.beginTransmission (PCF8591); // word wakker PCF8591 Wire.write (0x04); // beheer -byte - lees ADC0, dan verhoog Wire.endTransmission () outomaties; // beëindig transmissie Wire.requestFrom (PCF8591, 5); waarde0 = Wire.read (); waarde0 = Wire.read (); waarde1 = Wire.read (); waarde2 = Wire.read (); waarde3 = Wire.read (); Serial.print (waarde0); Serial.print (""); Serial.print (waarde1); Serial.print (""); Serial.print (waarde2); Serial.print (""); Serial.print (waarde3); Serial.print (""); Serial.println (); }

Voorheen het ons genoem dat die PCF8591 iets kan doen wat die ADC nie van die Arduino kan nie, en dit bied 'n differensiële ADC. In teenstelling met die Arduino se enkelpunt (dws dit gee die verskil tussen die positiewe seinspanning en GND terug, aanvaar die differensiële ADC twee seine (wat nie noodwendig na die grond verwys hoef te word nie), en gee die verskil tussen die twee seine terug Dit kan handig wees vir die meting van klein veranderings in spannings vir lasselle, ens.

Stap 7:

Beeld
Beeld

Die opstel van die PCF8591 vir differensiële ADC is 'n eenvoudige saak om die beheerbyte te verander. As u na bladsy sewe van die gegewensblad gaan, kyk dan na die verskillende tipes analoog -invoerprogrammering. Voorheen het ons modus '00' vir vier insette gebruik, maar u kan die ander kies wat duidelik geïllustreer word, byvoorbeeld die beeld.

Gebruik die binêre 00110000 of 0x30 om die beheerbyte vir twee differensiële insette in te stel. Dan is dit eenvoudig om die grepe data aan te vra en daarmee saam te werk. Soos u kan sien, is daar ook 'n kombinasie enkel/differensiaal en 'n komplekse drie-differensiële invoer. Ons sal hulle egter voorlopig verlaat.

Hopelik vind u dit interessant, of u 'n DAC by u eksperimente voeg of 'n bietjie meer oor ADC's leer. Oorweeg dit om u PCF8591 by PMD Way te bestel.

Hierdie pos word deur pmdway.com aan u gebring - alles vir vervaardigers en elektronika -entoesiaste, met gratis aflewering wêreldwyd.

Aanbeveel: