Obsah:

Arduino a PCF8591 ADC DAC IC: 7 krokov
Arduino a PCF8591 ADC DAC IC: 7 krokov

Video: Arduino a PCF8591 ADC DAC IC: 7 krokov

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

Chceli ste niekedy vo svojom projekte Arduino viac pinov analógového vstupu, ale nechceli ste nájsť Mega? Alebo chcete generovať analógové signály? Potom si pozrite predmet nášho tutoriálu - NXP PCF8591 IC.

Rieši oba tieto problémy, pretože má jeden prevodník DAC (digitálny na analógový) a štyri ADC (analógovo -digitálne prevodníky) - to všetko je prístupné po zbernici I2C. PCF8591 je k dispozícii vo formáte DIP, povrchovej montáži a vo forme modulu, čo uľahčuje experimentovanie.

Predtým, ako sa pohnete ďalej, si stiahnite list s údajmi. PCF8591 môže pracovať na 5 V aj 3,3 V, takže ak používate vývojovú dosku Arduino Due, Raspberry Pi alebo inú 3,3 V, ste v poriadku. Teraz najskôr vysvetlíme DAC, potom ADC.

Krok 1: Použitie DAC (prevodník digitálneho signálu na analógový)

Použitie DAC (prevodník digitálneho signálu na analógový)
Použitie DAC (prevodník digitálneho signálu na analógový)

DAC na PCF8591 má rozlíšenie 8 bitov-takže môže generovať teoretický signál medzi nulovým napätím a referenčným napätím (Vref) v 255 krokoch. Na demonštračné účely použijeme Vref 5 V a môžete použiť nižší Vref, napríklad 3,3 V alebo čokoľvek, čo chcete, aby bola maximálna hodnota … musí však byť nižšia ako napájacie napätie.

Všimnite si toho, že keď je na analógovom výstupe záťaž (situácia v reálnom svete), maximálne výstupné napätie klesne-údajový list (ktorý ste stiahli) zobrazuje 10% pokles pri záťaži 10 kΩ. Teraz k nášmu demonštračnému okruhu.

Všimnite si použitia zdvíhacích odporov 10 kΩ na zbernici I2C a kondenzátora 10 μF medzi 5 V a GND. Adresa zbernice I2C je nastavená kombináciou pinov A0 ~ A2 a so všetkými na GND je adresa 0x90. Analógový výstup je možné odoberať z pinu 15 (a na kolíku 13 je samostatný analógový GND. Tiež zapojte pin 13 na GND a obvod GND na Arduino GND.

Na ovládanie DAC potrebujeme odoslať dva bajty údajov. Prvý je riadiaci bajt, ktorý jednoducho aktivuje DAC a je 10 000 000 (alebo 0 x 40) a ďalší bajt je hodnota medzi 0 a 255 (výstupná úroveň). Ukazuje to nasledujúci náčrt:

// Príklad 52.1 DAC demo PCF8591

#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); // zobuď PCF8591 Wire.write (0x40); // riadiaci bajt - zapnite DAC (binárne 10 000 000) Wire.write (i); // hodnota na odoslanie do DAC Wire.endTransmission (); // ukončenie prenosu}

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

{Wire.beginTransmission (PCF8591); // zobuď PCF8591 Wire.write (0x40); // riadiaci bajt - zapnite DAC (binárne 10 000 000) Wire.write (i); // hodnota na odoslanie do DAC Wire.endTransmission (); // ukončenie prenosu}}

Všimli ste si bitový posun adresy zbernice v príkaze #define? Arduino odosiela 7-bitové adresy, ale PCF8591 chce 8-bitový, takže bajt posunieme o jeden bit.

Krok 2:

Obrázok
Obrázok

Výsledky náčrtu sú zobrazené na obrázku, pripojili sme Vref k 5 V a sondu osciloskopu a GND k analógovému výstupu a GND.

Krok 3:

Obrázok
Obrázok

Ak máte radi krivky, môžete si pomocou nižšie uvedeného náčrtu vytvoriť sínusové vlny. Používa vyhľadávaciu tabuľku v poli, ktoré obsahuje potrebné vopred vypočítané dátové body:

// Príklad 52.2 PCF8591 DAC demo - sínusová vlna

#include "Wire.h" #define PCF8591 (0x90 >> 1) // Adresa zbernice 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, 0xD5, 0x 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC, 0x 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6, 0xF5, 0x4 0xED, 0xEB, 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC, 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9, 0xC7, 0xC4, 0xC1 0xB3, 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7D, 0x7A, 0x77, 0x 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 0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37, 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D, 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x61 0x70, 0x74, 0x77, 0x7A, 0x7D}; neplatné nastavenie () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // zobuď PCF8591 Wire.write (0x40); // riadiaci bajt - zapnite DAC (binárne 10 000 000) Wire.write (sine_wave ); // hodnota na odoslanie do DAC Wire.endTransmission (); // ukončenie prenosu}}

Krok 4:

Obrázok
Obrázok

Pre nasledujúci výpis obrazu DSO sme zmenili Vref na 3,3 V - všimnite si zmenu maxím na sínusovej vlne.

Teraz môžete s DAC experimentovať a vytvárať zvukové efekty, signály alebo ovládať ďalšie analógové obvody.

Krok 5: Použitie ADC (analógovo-digitálnych prevodníkov)

Ak ste vo svojom Arduine používali funkciu analogRead () (už v kapitole 1), potom ste s ADC už oboznámení. Bez PCF8591 môžeme prečítať napätie medzi nulou a Vref a vráti hodnotu medzi nulou a 255, ktorá je priamo úmerná nule a Vref.

Napríklad pri meraní 3,3 V by malo byť vrátených 168. Rozlíšenie (8-bitové) ADC je nižšie ako vstavané Arduino (10-bitové), PCF8591 však dokáže niečo, čo ADC Arduina nedokáže. Ale k tomu sa dostaneme o chvíľu. Po prvé, aby sme jednoducho prečítali hodnoty každého pinu ADC, pošleme riadiaci bajt, aby sme PCF8591 oznámili, ktorý ADC chceme čítať. Pre ADC od nuly do troch je riadiaci bajt 0x00, 0x01, ox02 a 0x03.

Potom požiadame ADC o dva bajty údajov a uložíme druhý bajt na použitie. Prečo dva bajty? PCF8591 vráti najskôr predtým nameranú hodnotu - potom aktuálny bajt. (Pozri obrázok 8 v údajovom liste). Nakoniec, ak nepoužívate všetky piny ADC, pripojte nepoužívané piny k GND. Nasledujúci príklad náčrtu jednoducho získa hodnoty z každého kolíka ADC po jednom a potom ich zobrazí na sériovom monitore:

#include "Wire.h"

#define PCF8591 (0x90 >> 1) // adresa zbernice I2C #define ADC0 0x00 // riadiace bajty na čítanie jednotlivých ADC #define ADC1 0x01 #define ADC2 0x02 #define ADC3 0x03 byte value0, value1, value2, value3; neplatné nastavenie () {Wire.begin (); Serial.begin (9600); } prázdna slučka () {Wire.beginTransmission (PCF8591); // prebudenie PCF8591 Wire.write (ADC0); // riadiaci bajt - prečítajte si ADC0 Wire.endTransmission (); // ukončenie prenosu Wire.requestFrom (PCF8591, 2); hodnota0 = Wire.read (); hodnota0 = Wire.read (); Wire.beginTransmission (PCF8591); // prebudenie PCF8591 Wire.write (ADC1); // riadiaci bajt - prečítajte si ADC1 Wire.endTransmission (); // ukončenie prenosu Wire.requestFrom (PCF8591, 2); hodnota1 = Wire.read (); hodnota1 = Wire.read (); Wire.beginTransmission (PCF8591); // prebudenie PCF8591 Wire.write (ADC2); // riadiaci bajt - prečítajte si ADC2 Wire.endTransmission (); // ukončenie prenosu Wire.requestFrom (PCF8591, 2); hodnota2 = Wire.read (); hodnota2 = Wire.read (); Wire.beginTransmission (PCF8591); // prebudenie PCF8591 Wire.write (ADC3); // riadiaci bajt - prečítajte si ADC3 Wire.endTransmission (); // ukončenie prenosu Wire.requestFrom (PCF8591, 2); hodnota3 = Wire.read (); hodnota3 = Wire.read (); Serial.print (hodnota0); Serial.print (""); Serial.print (hodnota1); Serial.print (""); Serial.print (hodnota2); Serial.print (""); Serial.print (hodnota3); Serial.print (""); Serial.println (); }

Po spustení náčrtu sa vám na sériovom monitore zobrazia hodnoty každého ADC. Aj keď to bola jednoduchá ukážka, ktorá vám ukáže, ako jednotlivo čítať jednotlivé ADC, je to ťažkopádna metóda získavania viac ako jedného bajtu naraz z konkrétneho ADC.

Krok 6:

Za týmto účelom zmeňte riadiaci bajt na požiadavku na automatické prírastky, čo sa robí nastavením bitu 2 riadiaceho bajtu na 1. Na začiatok od ADC0 použijeme nový riadiaci bajt binárneho 00000100 alebo hexadecimálneho 0x04. Potom požiadajte o päť bajtov údajov (opäť ignorujeme prvý bajt), čo spôsobí, že PCF8591 vráti všetky hodnoty v jednom reťazci bajtov. Tento proces je znázornený na nasledujúcom náčrte:

#include "Wire.h"

#define PCF8591 (0x90 >> 1) // adresa zbernice I2C byte hodnota0, hodnota1, hodnota2, hodnota3; neplatné nastavenie () {Wire.begin (); Serial.begin (9600); } prázdna slučka () {Wire.beginTransmission (PCF8591); // prebudenie PCF8591 Wire.write (0x04); // riadiaci bajt - prečítajte si ADC0 a potom automaticky prírastok Wire.endTransmission (); // ukončenie prenosu Wire.requestFrom (PCF8591, 5); hodnota0 = Wire.read (); hodnota0 = Wire.read (); hodnota1 = Wire.read (); hodnota2 = Wire.read (); hodnota3 = Wire.read (); Serial.print (hodnota0); Serial.print (""); Serial.print (hodnota1); Serial.print (""); Serial.print (hodnota2); Serial.print (""); Serial.print (hodnota3); Serial.print (""); Serial.println (); }

Predtým sme spomenuli, že PCF8591 dokáže niečo, čo ADC Arduina nemôže, a to je ponuka diferenciálneho ADC. Na rozdiel od Arduino s jedným koncom (tj. Vracia rozdiel medzi napätím kladného signálu a GND, diferenciálny ADC prijíma dva signály (ktoré nemusia byť nevyhnutne vztiahnuté na uzemnenie) a vracia rozdiel medzi týmito dvoma signálmi To môže byť výhodné na meranie malých zmien napätia pre snímače zaťaženia a podobne.

Krok 7:

Obrázok
Obrázok

Nastavenie PCF8591 pre diferenciálny ADC je jednoduchá záležitosť zmeny riadiaceho bajtu. Ak prejdete na stranu sedem údajového listu, zvážte rôzne typy programovania analógového vstupu. Predtým sme pre štyri vstupy používali režim „00“, ale môžete vybrať ďalšie, ktoré sú názorne ilustrované, napríklad obrázok.

Ak chcete nastaviť riadiaci bajt pre dva diferenciálne vstupy, použite binárne 00110000 alebo 0x30. Potom je jednoduchou záležitosťou vyžiadať si bajty údajov a pracovať s nimi. Ako vidíte, existuje aj kombinácia jednoduchého/diferenciálneho a komplexného trojdiferenciálneho vstupu. Zatiaľ ich však necháme.

Našťastie ste našli to, čo vás zaujíma, či už do svojich experimentov pridáte DAC alebo sa naučíte niečo viac o ADC. Zvážte objednanie svojho PCF8591 u PMD Way.

Tento príspevok vám prináša pmdway.com - všetko pre výrobcov a nadšencov elektroniky s bezplatným doručením do celého sveta.

Odporúča: