Taula de continguts:

IC DAC Arduino i PCF8591 ADC: 7 passos
IC DAC Arduino i PCF8591 ADC: 7 passos

Vídeo: IC DAC Arduino i PCF8591 ADC: 7 passos

Vídeo: IC DAC Arduino i PCF8591 ADC: 7 passos
Vídeo: CIs para fazer o dispositivo para medir curva de impedancia com ARDUINO 2024, Juliol
Anonim
IC DAC Arduino i PCF8591 ADC
IC DAC Arduino i PCF8591 ADC

Alguna vegada heu desitjat més pins d’entrada analògics al vostre projecte Arduino, però no heu volgut treure’n un Mega? O voldríeu generar senyals analògics? A continuació, consulteu l'assumpte del nostre tutorial: l'IC NXP PCF8591.

Resol tots dos problemes ja que té un convertidor DAC (digital a analògic) i quatre ADC (convertidors analògics a digitals), tots accessibles mitjançant el bus I2C. El PCF8591 està disponible en format DIP, muntatge superficial i mòdul, cosa que facilita l'experimentació.

Abans de continuar, descarregueu el full de dades. El PCF8591 pot funcionar tant en 5V com en 3,3V, de manera que si utilitzeu un Arduino Due, Raspberry Pi o una altra placa de desenvolupament de 3,3 V, esteu bé. Ara primer explicarem el DAC i després els ADC.

Pas 1: utilitzar el DAC (convertidor digital-analògic)

Ús del DAC (convertidor digital a analògic)
Ús del DAC (convertidor digital a analògic)

El DAC del PCF8591 té una resolució de 8 bits, de manera que pot generar un senyal teòric d'entre zero volts i la tensió de referència (Vref) en 255 passos. A efectes de demostració, utilitzarem un Vref de 5V i podeu utilitzar un Vref inferior, com ara 3,3V o el que vulgueu que sigui el valor màxim … però ha de ser inferior a la tensió d’alimentació.

Tingueu en compte que quan hi ha una càrrega a la sortida analògica (una situació del món real), la tensió màxima de sortida caurà: el full de dades (que heu descarregat) mostra una caiguda del 10% per a una càrrega de 10 kΩ. Ara pel nostre circuit de demostració.

Tingueu en compte l’ús de resistències pull-up de 10kΩ al bus I2C i el condensador de 10μF entre 5V i GND. L'adreça del bus I2C es defineix mitjançant una combinació de pins A0 ~ A2, i amb tots ells a GND l'adreça és 0x90. La sortida analògica es pot prendre des del pin 15 (i hi ha un GND analògic separat al pin 13. A més, connecteu el pin 13 a GND i el circuit GND a Arduino GND.

Per controlar el DAC hem d’enviar dos bytes de dades. El primer és el byte de control, que simplement activa el DAC i és 1000000 (o 0x40) i el següent byte és el valor entre 0 i 255 (el nivell de sortida). Això es demostra en el següent esbós:

// Exemple 52.1 Demostració PCF8591 DAC

#include "Wire.h" #define PCF8591 (0x90 >> 1) // Configuració nul·la de l'adreça del bus I2C () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // despertar PCF8591 Wire.write (0x40); // byte de control: activeu DAC (binari 1000000) Wire.write (i); // valor per enviar a DAC Wire.endTransmission (); // acabar amb la transmissió}

per a (int i = 255; i> = 0; --i)

{Wire.beginTransmission (PCF8591); // despertar PCF8591 Wire.write (0x40); // byte de control: activeu DAC (binari 1000000) Wire.write (i); // valor per enviar a DAC Wire.endTransmission (); // acabar amb la transmissió}}

Heu notat el canvi de bits de l'adreça del bus a la sentència #define? Arduino envia adreces de 7 bits, però el PCF8591 en vol una de 8, de manera que canviem el byte per un bit.

Pas 2:

Imatge
Imatge

Els resultats de l’esbós es mostren a la imatge, hem connectat el Vref a 5V i la sonda de l’oscil·loscopi i GND a la sortida analògica i GND respectivament.

Pas 3:

Imatge
Imatge

Si us agraden les corbes, podeu generar ones sinusoïdals amb l'esbós següent. Utilitza una taula de cerca en una matriu que conté els punts de dades pre-calculats necessaris:

// Exemple 52.2 Demostració d'ona sinusoïdal PCF8591 DAC

#include "Wire.h" #define PCF8591 (0x90 >> 1) // Adreça del bus I2C 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, 0xD, 0xD, 0xD, 0xD 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC, 0xFC, 0xFC, 0xF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6, 0xF5, 0xF4, 0xFx, 0xFx, 0xED, 0xEB, 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC, 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9, 0xC7, 0xC4, 0xB, 0xB, 0xB 0xB3, 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7D, 0x7A, 0x7, 0x77, 0x7, 0x77, 0x7 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, 0x0, 0x0 0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0x0x01, 0x0x0x0 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x16, 0x18, 0x1A, 0x1C, 0x1x, 0, 0, 0, 0, 0 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37, 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D, 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x61, 0x61, 0x61 0x70, 0x74, 0x77, 0x7A, 0x7D}; void setup () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // despertar PCF8591 Wire.write (0x40); // byte de control: activa DAC (binari 1000000) Wire.write (sine_wave ); // valor per enviar a DAC Wire.endTransmission (); // acabar amb la transmissió}}

Pas 4:

Imatge
Imatge

Per al següent buidatge d’imatges DSO, hem canviat el Vref a 3,3 V: observeu el canvi dels màxims a l’ona sinusoïdal.

Ara podeu experimentar amb el DAC per crear efectes de so, senyals o controlar altres circuits analògics.

Pas 5: utilitzar els ADC (convertidors analògics a digitals)

Si heu utilitzat la funció analogRead () al vostre Arduino (al capítol primer), ja coneixeu un ADC. Amb PCF8591 podem llegir una tensió entre zero i el Vref i retornarà un valor d'entre zero i 255 que és directament proporcional a zero i el Vref.

Per exemple, mesurar 3,3 V hauria de retornar 168. La resolució (8 bits) de l’ADC és inferior a l’Arduino incorporat (10 bits), però el PCF8591 pot fer alguna cosa que l’ADC d’Arduino no pot fer. Però hi arribarem en un moment. En primer lloc, simplement per llegir els valors de cada pin ADC, enviem un byte de control per dir al PCF8591 quin ADC volem llegir. Per als ADC de zero a tres, el byte de control és 0x00, 0x01, ox02 i 0x03 respectivament.

A continuació, demanem dos bytes de dades a l'ADC i emmagatzemem el segon byte per al seu ús. Per què dos bytes? El PCF8591 retorna primer el valor mesurat prèviament, després el byte actual. (Vegeu la figura 8 al full de dades). Finalment, si no utilitzeu tots els pins ADC, connecteu els que no utilitzeu a GND. El següent esbós d’exemple simplement recupera els valors de cada pin ADC d’un en un i els mostra al monitor sèrie:

#include "Wire.h"

#define PCF8591 (0x90 >> 1) // Adreça del bus I2C #define ADC0 0x00 // controlar bytes per llegir ADCs individuals #define ADC1 0x01 #define ADC2 0x02 #define ADC3 0x03 byte value0, value1, value2, value3; void setup () {Wire.begin (); Serial.begin (9600); } void loop () {Wire.beginTransmission (PCF8591); // despertar PCF8591 Wire.write (ADC0); // byte de control: llegiu ADC0 Wire.endTransmission (); // finalitzar la transmissió Wire.requestFrom (PCF8591, 2); valor0 = Wire.read (); valor0 = Wire.read (); Wire.beginTransmission (PCF8591); // despertar PCF8591 Wire.write (ADC1); // byte de control: llegiu ADC1 Wire.endTransmission (); // finalitzar la transmissió Wire.requestFrom (PCF8591, 2); valor1 = Wire.read (); valor1 = Wire.read (); Wire.beginTransmission (PCF8591); // despertar PCF8591 Wire.write (ADC2); // byte de control: llegiu ADC2 Wire.endTransmission (); // finalitzar la transmissió Wire.requestFrom (PCF8591, 2); valor2 = Wire.read (); valor2 = Wire.read (); Wire.beginTransmission (PCF8591); // despertar PCF8591 Wire.write (ADC3); // byte de control: llegiu ADC3 Wire.endTransmission (); // finalitzar la transmissió Wire.requestFrom (PCF8591, 2); valor3 = Wire.read (); valor3 = Wire.read (); Serial.print (valor0); Serial.print (""); Serial.print (valor1); Serial.print (""); Serial.print (valor2); Serial.print (""); Serial.print (valor3); Serial.print (""); Serial.println (); }

En executar l’esbós, se us presentaran els valors de cada ADC al monitor sèrie. Tot i que va ser una demostració senzilla per mostrar-vos com llegir individualment cada ADC, és un mètode feixuc d'obtenir més d'un byte a la vegada d'un ADC concret.

Pas 6:

Per fer-ho, canvieu el byte de control per sol·licitar l’increment automàtic, cosa que es fa establint el bit 2 del byte de control a 1. Així, per començar des de l’ADC0, fem servir un nou byte de control binari 00000100 o 0x04 hexadecimal. A continuació, sol·liciteu cinc bytes de dades (una vegada més ignorem el primer byte) que farà que el PCF8591 torni tots els valors d'una cadena de bytes. Aquest procés es demostra a l'esbós següent:

#include "Wire.h"

#define PCF8591 (0x90 >> 1) // I2C bus address address byte value0, value1, value2, value3; void setup () {Wire.begin (); Serial.begin (9600); } bucle buit () {Wire.beginTransmission (PCF8591); // despertar PCF8591 Wire.write (0x04); // byte de control: llegiu ADC0 i, a continuació, incrementeu automàticament Wire.endTransmission (); // finalitzar la transmissió Wire.requestFrom (PCF8591, 5); valor0 = Wire.read (); valor0 = Wire.read (); valor1 = Wire.read (); valor2 = Wire.read (); valor3 = Wire.read (); Serial.print (valor0); Serial.print (""); Serial.print (valor1); Serial.print (""); Serial.print (valor2); Serial.print (""); Serial.print (valor3); Serial.print (""); Serial.println (); }

Anteriorment, hem esmentat que el PCF8591 pot fer alguna cosa que l'ADC d'Arduino no pot fer, i això ofereix un ADC diferencial. A diferència del punt final d'Arduino (és a dir, retorna la diferència entre la tensió del senyal positiva i el GND, el diferencial ADC accepta dos senyals (que no necessàriament s'han de fer referència a terra) i retorna la diferència entre els dos senyals Això pot ser convenient per mesurar petits canvis en les tensions de les cel·les de càrrega, etc.

Pas 7:

Imatge
Imatge

Configurar el PCF8591 per ADC diferencial és una qüestió senzilla de canviar el byte de control. Si aneu a la pàgina set del full de dades, tingueu en compte els diferents tipus de programació d’entrada analògica. Abans utilitzàvem el mode '00' per a quatre entrades, però podeu seleccionar les altres que estiguin clarament il·lustrades, per exemple la imatge.

Per definir el byte de control per a dues entrades diferencials, utilitzeu el binari 00110000 o 0x30. Aleshores es tracta de sol·licitar els bytes de dades i treballar amb ells. Com podeu veure, també hi ha una combinació simple / diferencial i una entrada complexa de tres diferencials. No obstant això, els deixarem de moment.

Esperem que trobeu això d’interès, ja sigui afegint un DAC als vostres experiments o aprenent una mica més sobre els ADC. Penseu en la possibilitat de demanar el vostre PCF8591 a PMD Way.

Aquest article us el proporciona pmdway.com: tot per a fabricants i aficionats a l'electrònica, amb lliurament gratuït a tot el món.

Recomanat: