Obsah:
- Krok 1: Použití DAC (převodník digitálního signálu na analogový)
- Krok 2:
- Krok 3:
- Krok 4:
- Krok 5: Použití ADC (analogově-digitální převodníky)
- Krok 6:
- Krok 7:
Video: Arduino a PCF8591 ADC DAC IC: 7 kroků
2024 Autor: John Day | [email protected]. Naposledy změněno: 2024-01-30 08:21
Chtěli jste někdy na svém projektu Arduino více analogových vstupních pinů, ale nechtěli jste rozšířit Mega? Nebo chcete generovat analogové signály? Pak se podívejte na předmět našeho tutoriálu - NXP PCF8591 IC.
Řeší oba tyto problémy, protože má jeden převodník DAC (digitální na analogový) a čtyři ADC (analogově digitální převodníky) - to vše přístupné přes sběrnici I2C. PCF8591 je k dispozici ve formátu DIP, povrchové montáži a modulu, což usnadňuje experimentování.
Než budete pokračovat, stáhněte si datový list. PCF8591 může pracovat jak na 5 V, tak na 3,3 V, takže pokud používáte vývojovou desku Arduino Due, Raspberry Pi nebo jinou 3,3 V, jste v pořádku. Nyní nejprve vysvětlíme DAC, pak ADC.
Krok 1: Použití DAC (převodník digitálního signálu na analogový)
DAC na PCF8591 má rozlišení 8 bitů-takže může generovat teoretický signál mezi nulovými volty a referenčním napětím (Vref) v 255 krocích. Pro demonstrační účely použijeme Vref 5 V a můžete použít nižší Vref, jako je 3,3 V nebo cokoli, co chcete, aby maximální hodnota byla … musí však být menší než napájecí napětí.
Všimněte si, že když je na analogovém výstupu zatížení (situace v reálném světě), maximální výstupní napětí klesne-datový list (který jste si stáhli) ukazuje 10% pokles při zátěži 10 kΩ. Nyní k našemu předváděcímu okruhu.
Všimněte si použití 10kΩ pull-up rezistorů na sběrnici I2C a 10μF kondenzátoru mezi 5V a GND. Adresa sběrnice I2C je nastavena kombinací pinů A0 ~ A2 a se všemi na GND je adresa 0x90. Analogový výstup lze odebírat z pinu 15 (a na pinu 13 je samostatný analogový GND. Rovněž připojte pin 13 k GND a obvod GND k Arduino GND.
K ovládání DAC potřebujeme poslat dva bajty dat. První je řídicí bajt, který jednoduše aktivuje DAC a je 1000000 (nebo 0x40) a další bajt je hodnota mezi 0 a 255 (výstupní úroveň). To je ukázáno na následujícím náčrtu:
// Pří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); // probuď PCF8591 Wire.write (0x40); // řídicí bajt - zapněte DAC (binární 10 000 000) Wire.write (i); // hodnota pro odeslání do DAC Wire.endTransmission (); // ukončení přenosu}
pro (int i = 255; i> = 0; --i)
{Wire.beginTransmission (PCF8591); // probuď PCF8591 Wire.write (0x40); // řídicí bajt - zapněte DAC (binární 10 000 000) Wire.write (i); // hodnota pro odeslání do DAC Wire.endTransmission (); // ukončení přenosu}}
Všimli jste si bitového posunu adresy sběrnice v příkazu #define? Arduino posílá 7bitové adresy, ale PCF8591 chce 8bitové, takže byte posuneme o jeden bit.
Krok 2:
Výsledky náčrtu jsou uvedeny na obrázku, připojili jsme Vref k 5V a sondu osciloskopu a GND k analogovému výstupu a GND.
Krok 3:
Pokud máte rádi křivky, můžete pomocí níže uvedeného náčrtu generovat sinusové vlny. Používá vyhledávací tabulku v poli, které obsahuje potřebné předem vypočítané datové body:
// Příklad 52.2 PCF8591 DAC demo - sinusová vlna
#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, 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é nastavení () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // probuď PCF8591 Wire.write (0x40); // řídicí bajt - zapněte DAC (binární 10 000 000) Wire.write (sine_wave ); // hodnota pro odeslání do DAC Wire.endTransmission (); // ukončení přenosu}}
Krok 4:
U následujícího výpisu obrazu DSO jsme změnili Vref na 3,3 V - všimněte si změny maxim na sinusové vlně.
Nyní můžete experimentovat s DAC a vytvářet zvukové efekty, signály nebo ovládat jiné analogové obvody.
Krok 5: Použití ADC (analogově-digitální převodníky)
Pokud jste na svém Arduinu použili funkci analogRead () (zpět v kapitole jedna), již jste s ADC obeznámeni. Bez PCF8591 můžeme přečíst napětí mezi nulou a Vref a vrátí hodnotu mezi nulou a 255, která je přímo úměrná nule a Vref.
Například měření 3,3 V by mělo vrátit 168. Rozlišení (8bitové) ADC je nižší než vestavěné Arduino (10bitové), nicméně PCF8591 dokáže něco, co ADC Arduina nedokáže. Ale k tomu se dostaneme za chvíli. Nejprve, abychom jednoduše přečetli hodnoty každého pinu ADC, pošleme řídicí bajt, abychom sdělili PCF8591, který ADC chceme číst. Pro ADC od nuly do tří je řídicí bajt 0x00, 0x01, ox02 a 0x03.
Poté požádáme o dva bajty dat zpět od ADC a uložíme druhý bajt k použití. Proč dva bajty? PCF8591 vrací nejprve naměřenou hodnotu - poté aktuální byte. (Viz obrázek 8 v datovém listu). Nakonec, pokud nepoužíváte všechny piny ADC, připojte nepoužité k GND. Následující příklad skici jednoduše načte hodnoty z každého pinu ADC po jednom a poté je zobrazí na sériovém monitoru:
#include "Wire.h"
#define PCF8591 (0x90 >> 1) // adresa sběrnice I2C #define ADC0 0x00 // řídicí bajty pro čtení jednotlivých ADC #define ADC1 0x01 #define ADC2 0x02 #define ADC3 0x03 byte value0, value1, value2, value3; neplatné nastavení () {Wire.begin (); Serial.begin (9600); } void loop () {Wire.beginTransmission (PCF8591); // probuzení PCF8591 Wire.write (ADC0); // řídicí bajt - čtení ADC0 Wire.endTransmission (); // ukončení přenosu Wire.requestFrom (PCF8591, 2); hodnota0 = Wire.read (); hodnota0 = Wire.read (); Wire.beginTransmission (PCF8591); // probuď PCF8591 Wire.write (ADC1); // řídicí bajt - čtení ADC1 Wire.endTransmission (); // ukončení přenosu Wire.requestFrom (PCF8591, 2); hodnota1 = Wire.read (); hodnota1 = Wire.read (); Wire.beginTransmission (PCF8591); // probuď PCF8591 Wire.write (ADC2); // řídicí bajt - čtení ADC2 Wire.endTransmission (); // konec přenosu Wire.requestFrom (PCF8591, 2); hodnota2 = Wire.read (); hodnota2 = Wire.read (); Wire.beginTransmission (PCF8591); // probuď PCF8591 Wire.write (ADC3); // řídicí bajt - přečtěte si ADC3 Wire.endTransmission (); // konec přenosu Wire.requestFrom (PCF8591, 2); value3 = Wire.read (); value3 = 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 spuštění náčrtu se vám na sériovém monitoru zobrazí hodnoty jednotlivých ADC. Ačkoli to byla jednoduchá ukázka, která vám ukázala, jak jednotlivě číst každý ADC, je to těžkopádný způsob získání více než jednoho bajtu najednou z konkrétního ADC.
Krok 6:
Chcete-li to provést, změňte řídicí bajt tak, aby požadoval automatické přírůstky, což se provádí nastavením bitu 2 řídicího bajtu na 1. Pro začátek od ADC0 tedy použijeme nový řídicí bajt binárního 00000100 nebo hexadecimálního 0x04. Poté požádejte o pět bajtů dat (opět ignorujeme první bajt), což způsobí, že PCF8591 vrátí všechny hodnoty v jednom řetězci bajtů. Tento proces je ukázán na následujícím náčrtu:
#include "Wire.h"
#define PCF8591 (0x90 >> 1) // I2C bus address byte value0, value1, value2, value3; neplatné nastavení () {Wire.begin (); Serial.begin (9600); } void loop () {Wire.beginTransmission (PCF8591); // probuď PCF8591 Wire.write (0x04); // řídicí bajt - přečtěte ADC0 a poté auto -inkrementujte Wire.endTransmission (); // konec přenosu Wire.requestFrom (PCF8591, 5); hodnota0 = Wire.read (); hodnota0 = Wire.read (); hodnota1 = Wire.read (); hodnota2 = Wire.read (); value3 = Wire.read (); Serial.print (hodnota0); Serial.print (""); Serial.print (hodnota1); Serial.print (""); Serial.print (hodnota2); Serial.print (""); Serial.print (hodnota3); Serial.print (""); Serial.println (); }
Dříve jsme zmínili, že PCF8591 může dělat něco, co ADC Arduina nemůže, a to je nabídka diferenciálního ADC. Na rozdíl od jednoho konce Arduina (tj. Vrací rozdíl mezi kladným napětím signálu a GND, diferenciální ADC přijímá dva signály (které nemusí být nutně vztaženy k zemi) a vrací rozdíl mezi těmito dvěma signály To může být výhodné pro měření malých změn napětí pro snímače zatížení atd.
Krok 7:
Nastavení PCF8591 pro diferenciální ADC je jednoduchá záležitost změny řídicího bajtu. Pokud přejdete na stranu sedm datového listu, zvažte různé typy programování analogového vstupu. Dříve jsme pro čtyři vstupy používali režim „00“, ale můžete vybrat další, které jsou jasně ilustrovány, například obrázek.
Chcete -li tedy nastavit řídicí bajt pro dva diferenciální vstupy, použijte binární 00110000 nebo 0x30. Pak je to jednoduchá záležitost požádat o bajty dat a pracovat s nimi. Jak vidíte, existuje také kombinace jednoduchého/diferenciálního a komplexního třídiferenciálního vstupu. Zatím je však necháme.
Doufejme, že vás toto zaujalo, ať už přidáním DAC do experimentů nebo se dozvíte něco více o ADC. Zvažte prosím objednání svého PCF8591 u PMD Way.
Tento příspěvek vám přinesl web pmdway.com - vše pro výrobce a nadšence do elektroniky s doručením zdarma po celém světě.
Doporučuje:
MicroPython PCF8591 DACtest: 3 kroky (s obrázky)
MicroPython PCF8591 DACtest: Tuto knihu jsem si koupil, abych zlepšil své dovednosti v oblasti Micropython: MicroPython for ESP8266 Development Workshop od Aguse Kurniawana. Tato kniha je velmi dobrým začátkem, projekt I2C využívá modul PCF8591. Ale žádný příklad programování DAC, takže jsem musel přijít na to, že
Jak vytvořit aktuální smysl ADC: 5 kroků
Jak vytvořit smysl pro proud ADC: V tomto Instructable popíšeme, jak implementovat 8bitový převodník analogově-digitálního signálu (ADC) do SLG46855V, který dokáže snímat proud zátěže a rozhraní s MCU přes I2C. Tuto konstrukci lze použít pro různé aplikace snímání proudu, jako je
Arduino a 16bitový ADC TI ADS1110: 6 kroků
Arduino a TI ADS1110 16bitový ADC: V tomto tutoriálu zkoumáme použití Arduina pro práci s Texas Instruments ADS1110-neuvěřitelně malý, ale užitečný 16bitový IC analogově-digitální převodník. Může pracovat mezi 2,7 a 5,5 V, takže je také vhodný pro Arduino Due a další nižší
Dobíjecí digitální voltmetr pomocí ICL7107 ADC: 7 kroků (s obrázky)
Dobíjecí digitální voltmetr pomocí ICL7107 ADC: V tomto tutoriálu vám ukážu, jak vytvořit super jednoduchý digitální voltmetr, který dokáže měřit napětí od 20 mV do 200V. Tento projekt nebude používat žádný mikrokontrolér jako arduino. Místo toho bude použit ADC, tj. ICL7107 s některými
PCF8591 (i2c Analog I/O Expander) Rychlé snadné použití: 9 kroků
PCF8591 (i2c Analog I/O Expander) Rychlé snadné použití: Knihovna pro použití i2c pcf8591 IC s arduino a esp8266. Tento IC může ovládat (až 4) analogový vstup a/nebo 1 analogový výstup, jako je měření napětí, čtení hodnoty termistoru nebo vyblednutí LED. Umí číst analogovou hodnotu a zapisovat analogovou hodnotu pouze pomocí 2 vodičů (perfektní