Innholdsfortegnelse:
- Trinn 1: Bruke DAC (digital-til-analog omformer)
- Steg 2:
- Trinn 3:
- Trinn 4:
- Trinn 5: Bruke ADC-er (analoge til digitale omformere)
- Trinn 6:
- Trinn 7:
Video: Arduino og PCF8591 ADC DAC IC: 7 trinn
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:23
Har du noen gang ønsket deg flere analoge inngangspinner på Arduino -prosjektet ditt, men ikke ønsket å punge ut for en Mega? Eller vil du generere analoge signaler? Sjekk deretter emnet for opplæringen vår - NXP PCF8591 IC.
Den løser begge disse problemene da den har en enkelt DAC (digital til analog) omformer samt fire ADC (analoge til digitale omformere) - alle tilgjengelige via I2C -bussen. PCF8591 er tilgjengelig i DIP, overflatemontering og modulform, noe som gjør det enkelt å eksperimentere med.
Last ned databladet før du går videre. PCF8591 kan fungere på både 5V og 3.3V, så hvis du bruker en Arduino Due, Raspberry Pi eller et annet 3.3V utviklingskort, har du det bra. Nå skal vi først forklare DAC, deretter ADC.
Trinn 1: Bruke DAC (digital-til-analog omformer)
DAC på PCF8591 har en oppløsning på 8-bits-så den kan generere et teoretisk signal på mellom null volt og referansespenningen (Vref) i 255 trinn. For demonstrasjonsformål bruker vi en Vref på 5V, og du kan bruke en lavere Vref som 3.3V eller hva du vil at maksimalverdien skal være … men den må være mindre enn forsyningsspenningen.
Vær oppmerksom på at når det er en belastning på den analoge utgangen (en situasjon i virkeligheten), vil den maksimale utgangsspenningen falle-databladet (som du lastet ned) viser et 10% fall for en 10kΩ belastning. Nå til demonstrasjonskretsen vår.
Legg merke til bruken av 10kΩ opptrekksmotstander på I2C-bussen, og 10μF kondensatoren mellom 5V og GND. I2C -bussadressen er satt av en kombinasjon av pinnene A0 ~ A2, og med dem alle til GND er adressen 0x90. Den analoge utgangen kan tas fra pin 15 (og det er en separat analog GND på pin 13. Koble også pin 13 til GND, og krets GND til Arduino GND.
For å kontrollere DAC må vi sende to byte med data. Den første er kontrollbyten, som ganske enkelt aktiverer DAC og er 1000000 (eller 0x40), og den neste byten er verdien mellom 0 og 255 (utgangsnivået). Dette er demonstrert i følgende skisse:
// Eksempel 52.1 PCF8591 DAC -demo
#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C bus address void setup () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // våkne opp PCF8591 Wire.write (0x40); // kontrollbyte - slå på DAC (binær 1000000) Wire.write (i); // verdi som skal sendes til DAC Wire.endTransmission (); // avslutte overføring}
for (int i = 255; i> = 0; --i)
{Wire.beginTransmission (PCF8591); // våkne opp PCF8591 Wire.write (0x40); // kontrollbyte - slå på DAC (binær 1000000) Wire.write (i); // verdi som skal sendes til DAC Wire.endTransmission (); // avslutte overføring}}
La du merke til bitskiftet til bussadressen i #define -setningen? Arduino sender 7-biters adresser, men PCF8591 vil ha en 8-bit, så vi bytter byte med en bit.
Steg 2:
Resultatene av skissen er vist på bildet, vi har koblet Vref til 5V og oscilloskopproben og GND til henholdsvis den analoge utgangen og GND.
Trinn 3:
Hvis du liker kurver, kan du generere sinusbølger med skissen nedenfor. Den bruker en oppslagstabell i en matrise som inneholder de nødvendige forhåndsberegnede datapunktene:
// Eksempel 52.2 PCF8591 DAC demo - sinusbølge
#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, 0xD 0, 0xD 0, 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 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, 0xB, 0xB, 0xB, 0xB 0xB3, 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7D, 0x7, 0x6, 0x6 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, 0x0, 0x0, 0x0 0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0, 0x0, 0x0, 0x0, 0x3 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x16, 0x18, 0x1A, 0x1C, 0x0, 0x, 0x, 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37, 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D, 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6 0x70, 0x74, 0x77, 0x7A, 0x7D}; ugyldig oppsett () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // våkne opp PCF8591 Wire.write (0x40); // kontrollbyte - slå på DAC (binær 1000000) Wire.write (sinus_bølge ); // verdi som skal sendes til DAC Wire.endTransmission (); // avslutte overføring}}
Trinn 4:
For den følgende DSO -bildedumpen endret vi Vref til 3.3V - merk endringen i maksima på sinusbølgen.
Nå kan du eksperimentere med DAC for å lage lydeffekter, signaler eller kontrollere andre analoge kretser.
Trinn 5: Bruke ADC-er (analoge til digitale omformere)
Hvis du har brukt analogRead () -funksjonen på Arduino (helt tilbake i kapittel én), er du allerede kjent med en ADC. Uten PCF8591 kan vi lese en spenning mellom null og Vref, og den vil returnere en verdi på mellom null og 255 som er direkte proporsjonal med null og Vref.
For eksempel bør måling av 3.3V returnere 168. Oppløsningen (8-bit) til ADC er lavere enn innebygd Arduino (10-bit), men PCF8591 kan gjøre noe Arduino's ADC ikke kan. Men vi kommer til det om et øyeblikk. For det første, for å bare lese verdiene for hver ADC -pin sender vi en kontrollbyte for å fortelle PCF8591 hvilken ADC vi vil lese. For ADCs null til tre er kontrollbyten henholdsvis 0x00, 0x01, ox02 og 0x03.
Deretter ber vi om to byte med data tilbake fra ADC, og lagrer den andre byten for bruk. Hvorfor to byte? PCF8591 returnerer den tidligere målte verdien først - deretter gjeldende byte. (Se figur 8 i databladet). Til slutt, hvis du ikke bruker alle ADC -pinnene, kobler du de ubrukte til GND. Følgende eksempelskisse henter ganske enkelt verdier fra hver ADC -pinne en om gangen, og viser dem deretter i den serielle skjermen:
#inkludere "Wire.h"
#define PCF8591 (0x90 >> 1) // I2C bussadresse #definere ADC0 0x00 // kontrollbyte for å lese individuelle ADCer #definere ADC1 0x01 #define ADC2 0x02 #define ADC3 0x03 byte verdi0, verdi1, verdi2, verdi3; ugyldig oppsett () {Wire.begin (); Serial.begin (9600); } void loop () {Wire.beginTransmission (PCF8591); // våkne opp PCF8591 Wire.write (ADC0); // kontrollbyte - les ADC0 Wire.endTransmission (); // sluttransmission Wire.requestFrom (PCF8591, 2); verdi0 = Wire.read (); verdi0 = Wire.read (); Wire.beginTransmission (PCF8591); // våkne opp PCF8591 Wire.write (ADC1); // kontrollbyte - les ADC1 Wire.endTransmission (); // sluttransmission Wire.requestFrom (PCF8591, 2); verdi1 = Wire.read (); verdi1 = Wire.read (); Wire.beginTransmission (PCF8591); // våkne opp PCF8591 Wire.write (ADC2); // kontrollbyte - les ADC2 Wire.endTransmission (); // sluttransmission Wire.requestFrom (PCF8591, 2); verdi2 = Wire.read (); verdi2 = Wire.read (); Wire.beginTransmission (PCF8591); // våkne opp PCF8591 Wire.write (ADC3); // kontrollbyte - les ADC3 Wire.endTransmission (); // sluttransmission Wire.requestFrom (PCF8591, 2); verdi3 = Wire.read (); verdi3 = Wire.read (); Serial.print (verdi0); Serial.print (""); Serial.print (verdi1); Serial.print (""); Serial.print (verdi2); Serial.print (""); Serial.print (verdi3); Serial.print (""); Serial.println (); }
Når du kjører skissen, vil du bli presentert med verdiene for hver ADC i den serielle skjermen. Selv om det var en enkel demonstrasjon for å vise deg hvordan du leser hver ADC individuelt, er det en tungvint metode for å få mer enn en byte om gangen fra en bestemt ADC.
Trinn 6:
For å gjøre dette, endre kontrollbyten for å be om automatisk økning, noe som gjøres ved å sette bit 2 i kontrollbyten til 1. Så for å starte fra ADC0 bruker vi en ny kontrollbyte på binær 00000100 eller heksadesimalt 0x04. Be deretter om fem byte med data (nok en gang ignorerer vi den første byten), noe som får PCF8591 til å returnere alle verdiene i en kjede med byte. Denne prosessen er demonstrert i følgende skisse:
#inkludere "Wire.h"
#define PCF8591 (0x90 >> 1) // I2C bussadresse byte verdi0, verdi1, verdi2, verdi3; ugyldig oppsett () {Wire.begin (); Serial.begin (9600); } void loop () {Wire.beginTransmission (PCF8591); // våkne opp PCF8591 Wire.write (0x04); // kontrollbyte - les ADC0 og deretter automatisk øke Wire.endTransmission (); // sluttransmission Wire.requestFrom (PCF8591, 5); verdi0 = Wire.read (); verdi0 = Wire.read (); verdi1 = Wire.read (); verdi2 = Wire.read (); verdi3 = Wire.read (); Serial.print (verdi0); Serial.print (""); Serial.print (verdi1); Serial.print (""); Serial.print (verdi2); Serial.print (""); Serial.print (verdi3); Serial.print (""); Serial.println (); }
Tidligere nevnte vi at PCF8591 kan gjøre noe som Arduino ADC ikke kan, og dette er å tilby en differensiell ADC. I motsetning til Arduino-enden (dvs. den returnerer differansen mellom den positive signalspenningen og GND, godtar differensial ADC to signaler (som ikke nødvendigvis må refereres til bakken), og returnerer forskjellen mellom de to signalene Dette kan være praktisk for å måle små endringer i spenninger for lastceller og så videre.
Trinn 7:
Å sette opp PCF8591 for differensial ADC er et enkelt spørsmål om å endre kontrollbyten. Hvis du går til side sju i databladet, bør du vurdere de forskjellige typene analog inngangsprogrammering. Tidligere brukte vi modus '00' for fire innganger, men du kan velge de andre som er tydelig illustrert, for eksempel bildet.
Så for å angi kontrollbyten for to differensialinnganger, bruk binær 00110000 eller 0x30. Da er det enkelt å be om databyte og jobbe med dem. Som du kan se er det også kombinasjon enkelt/differensial og en kompleks tre-differensial inngang. Imidlertid forlater vi dem foreløpig.
Forhåpentligvis fant du dette interessant, enten du legger til en DAC i eksperimentene dine eller lærer litt mer om ADC -er. Vennligst vurder å bestille PCF8591 fra PMD Way.
Dette innlegget ble brakt til deg av pmdway.com - alt for produsenter og elektronikkentusiaster, med gratis levering over hele verden.
Anbefalt:
MicroPython PCF8591 DACtest: 3 trinn (med bilder)
MicroPython PCF8591 DACtest: Jeg kjøpte denne boken for å forbedre mine Micropython-ferdigheter: MicroPython for ESP8266 Development Workshop av Agus Kurniawan. Denne boken er en veldig god start, I2C -prosjektet bruker en PCF8591 -modul. Men ingen DAC -programmeringseksempel, så jeg måtte finne ut at du
7-segment for å vise ADC #Arduino-verdier, #Arduino: 4 trinn
7-segment for å vise ADC #Arduino-verdier, #Arduino: I denne artikkelen vil jeg lage et prosjekt som fremdeles er relatert til den forrige artikkelen. Nemlig å behandle ADC -data. Så du trenger ikke en seriell skjerm for å se verdien av ADC -dataene. i denne artikkelen vil jeg lage en ADC Value viewer -visning. så du ikke
Arduino og TI ADS1110 16-biters ADC: 6 trinn
Arduino og TI ADS1110 16-bit ADC: I denne opplæringen undersøker vi hvordan du bruker Arduino for å jobbe med Texas Instruments ADS1110-en utrolig liten, men nyttig 16-biters analog til digital omformer IC. Den kan fungere mellom 2,7 og 5,5 V, så det er også fint for Arduino Due og andre lavere volum
Spill sanger med Arduino ved å bruke ADC til PWM på Flyback Transformer eller høyttaler: 4 trinn
Spill sanger med Arduino ved å bruke ADC til PWM på Flyback Transformer eller Speaker: Hello Guys, Dette er den andre delen av min andre instruerbare (det var mye vanskelig), I utgangspunktet har jeg i dette prosjektet brukt ADC og TIMERS på min Arduino for å konverter lydsignal til et PWM -signal. Dette er mye enklere enn min forrige Instructa
PCF8591 (i2c Analog I/O Expander) Rask enkel bruk: 9 trinn
PCF8591 (i2c Analog I/O Expander) Rask enkel bruk: Bibliotek for bruk av i2c pcf8591 IC med arduino og esp8266. Denne IC kan kontrollere (inntil 4) analog inngang og/eller 1 analog utgang som målespenning, lese termistorverdi eller fade en lysdiode. Kan lese analog verdi og skrive analog verdi med bare 2 ledninger (perfekt