Мазмуну:

Arduino жана PCF8591 ADC DAC IC: 7 кадам
Arduino жана PCF8591 ADC DAC IC: 7 кадам

Video: Arduino жана PCF8591 ADC DAC IC: 7 кадам

Video: Arduino жана PCF8591 ADC DAC IC: 7 кадам
Video: Как Сделать Робота на Arduino UNO / How to Make a Robot on Arduino UNO 2024, Ноябрь
Anonim
Arduino жана PCF8591 ADC DAC IC
Arduino жана PCF8591 ADC DAC IC

Сиз качандыр бир убакта Arduino проектиңизде аналогдук киргизүү пиндерин каалап, бирок Мегадан баш тартууну каалаган жоксузбу? Же аналогдук сигналдарды чыгаргыңыз келеби? Андан кийин биздин окуу куралыбыздын темасын текшериңиз - NXP PCF8591 IC.

Бул эки көйгөйдү тең чечет, анткени анын бир DAC (санариптен аналогго) конвертери бар, ошондой эле төрт ADC (санариптик алмаштыргычка аналог) бардыгына I2C автобусу аркылуу жетүүгө болот. PCF8591 DIP, бетине орнотуу жана модул түрүндө жеткиликтүү, бул эксперимент жүргүзүүнү оңойлотот.

Улантуудан мурун, маалымат баракчасын жүктөп алыңыз. PCF8591 5V жана 3.3V экөөнө тең иштей алат, андыктан сиз Arduino Due, Raspberry Pi же башка 3.3 V өнүктүрүү тактасын колдонуп жатсаңыз, анда сиз жакшы экенсиз. Эми биз алгач DACти, анан ADCлерди түшүндүрөбүз.

1-кадам: DAC колдонуу (санарип-аналогдук Converter)

DAC (санарип-аналогдук конвертер) колдонуу
DAC (санарип-аналогдук конвертер) колдонуу

PCF8591деги DAC 8 биттик токтомго ээ-андыктан ал нөлдүк вольттон 255 этапта шилтеме чыңалуусунун (Vref) теориялык сигналын түзө алат. Демонстрациялык максаттар үчүн биз 5V Vref колдонобуз, жана сиз төмөнкү Vrefти колдоно аласыз, мисалы 3.3V же максималдуу мааниге ээ болгуңуз келген нерсенин бардыгын … бирок ал камсыздоо чыңалуусунан аз болушу керек.

Көңүл буруңуз, аналогдук чыгууга (реалдуу жагдай) жүк болгондо, максималдуу чыгуу чыңалуусу төмөндөйт-маалымат баракчасы (сиз жүктөп алган) 10кО жүк үчүн 10% га төмөндөшүн көрсөтөт. Эми биздин демонстрация схемасы үчүн.

I2C автобусунда 10 кОм тартма каршылыгынын колдонулушуна жана 5V менен GND ортосундагы 10μF конденсаторго көңүл буруңуз. I2C автобустун дареги A0 ~ A2 төөнөгүчтөрдүн айкалышы менен коюлат жана алардын бардыгы GNDге чейин 0x90 болуп саналат. Аналогдук чыгарууну 15 -пинден алууга болот (жана 13 -пинде өзүнчө GND аналогу бар. Ошондой эле, 13 -пин GND менен GND схемасын Arduino GND менен туташтырыңыз.

DACти көзөмөлдөө үчүн биз эки байт маалыматтарды жөнөтүшүбүз керек. Биринчиси, жөн эле DACти иштетүүчү жана 1000000 (же 0x40) болгон башкаруу байты, кийинки байт 0 менен 255тин ортосундагы маани (чыгаруу деңгээли). Бул төмөнкү эскизде көрсөтүлөт:

// Мисал 52.1 PCF8591 DAC демо

#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C шинасынын дарегин жараксыз орнотуу () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // ойгон PCF8591 Wire.write (0x40); // көзөмөл байт - DAC күйгүзүү (бинардык 1000000) Wire.write (i); // DAC Wire.endTransmission жөнөтүү үчүн мааниси (); // которууну токтотуу}

үчүн (int i = 255; i> = 0; --i)

{Wire.beginTransmission (PCF8591); // ойгон PCF8591 Wire.write (0x40); // башкаруу байты - DACти күйгүзүү (бинардык 1000000) Wire.write (i); // DAC Wire.endTransmission () жөнөтүү үчүн мааниси (); // которууну токтотуу}}

#Define билдирүүсүндө автобустун дарегинин бир аз жылышын байкадыңызбы? Arduino 7-бит даректерин жөнөтөт, бирок PCF8591 8-битти каалайт, ошондуктан биз байтты бир битке жылдырабыз.

2-кадам:

Сүрөт
Сүрөт

Эскиздин жыйынтыктары сүрөттө көрсөтүлгөн, биз Vrefти 5Vга жана осциллографтын зондун жана GNDны тиешелүүлүгүнө жараша аналогдук чыгууга жана GNDге туташтырдык.

3 -кадам:

Сүрөт
Сүрөт

Эгерде сизге ийри сызыктар жакса, сиз төмөндөгү эскиз менен синус толкундарын түзө аласыз. Ал керектүү алдын ала эсептелген маалымат пункттарын камтыган массивдеги издөө таблицасын колдонот:

// Мисал 52.2 PCF8591 DAC демо - синус толкуну

#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C автобустун дареги uint8_t sine_wave [256] = {0x80, 0x83, 0x86, 0x89, 0x8C, 0x90, 0x93, 0x96, 0x99, 0x9C, 0x9C, 0x93 0xA2, 0xA5, 0xA8, 0xAB, 0xAE, 0xB1, 0xB3, 0xB6, 0xB9, 0xBC, 0xBF, 0xC1, 0xC4, 0xC7, 0xC9, 0xCC, 0xCE, 0xD1, 0xDx, 0xD3, 0xD3, 0xD3 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFF, 0xFC, 0xFC, 0xFC. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xFF, 0xF6, 0xF6, 0xFF 0xED, 0xEB, 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC, 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9, 0xCx, 0xB, 0xC7, 0xC7, 0xC7, 0xC7 0xB3, 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7, 0x7, 0x7A, 0x7A, 0x7A, 0x7A 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, 0x0, 0x10, 0x10, 0x10 0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x0x, 0x02, 0x01, 0x01 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x1E, 0x20, 0x0E 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37, 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D, 0x4F, 0x52, 0x55, 0x58, 0x5x, 0x56, 0x5E, 0x5E, 0x3 0x70, 0x74, 0x77, 0x7A, 0x7D}; void setup () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // ойгон PCF8591 Wire.write (0x40); // башкаруу байт - DAC күйгүзүү (бинардык 1000000) Wire.write (sine_wave ); // DAC Wire.endTransmission () жөнөтүү үчүн мааниси (); // которууну токтотуу}}

4 -кадам:

Сүрөт
Сүрөт

Кийинки DSO сүрөт төгүндүлөрү үчүн биз Vrefти 3.3V кылып өзгөрттүк - синус толкундагы максимумдардын өзгөрүшүнө көңүл буруңуз.

Эми сиз DAC менен эксперимент кылып, үн эффекттерин, сигналдарды же башка аналогдук схемаларды башкара аласыз.

5-кадам: ADCs (аналогдук-санариптик которгучтар) колдонуу

Эгерде сиз Arduinoдо analogRead () функциясын колдонгон болсоңуз (Биринчи бөлүмдө), анда сиз ADC менен таанышсыз. PCF8591 менен биз нөл менен Vrefтин ортосундагы чыңалууну окуй алабыз жана нөл менен Vrefке түз пропорционалдуу болгон нөл менен 255тин ортосундагы маанини кайтарып берет.

Мисалы, 3.3V өлчөө 168. кайтып келиши керек. ADCнин чечилиши (8-бит) Arduino бортунан (10-бит) төмөн, бирок PCF8591 Arduino ADC кыла албаган нерсени жасай алат. Бирок биз муну бир аздан кийин алабыз. Биринчиден, ар бир ADC пининин маанилерин окуу үчүн, биз PCF8591ге кайсы ADCди окугубуз келгенин айтуу үчүн башкаруу байтын жөнөтөбүз. ADCs нөлдөн үчкө чейин көзөмөлдөө байты 0x00, 0x01, ox02 жана 0x03 болуп саналат.

Андан кийин биз ADCден кайра эки байт маалымат сурайбыз жана экинчи байтты колдонуу үчүн сактайбыз. Эмне үчүн эки байт? PCF8591 биринчи мурда өлчөнгөн маанини кайтарат - андан кийин учурдагы байт. (Маалымат барагындагы 8 -сүрөттү караңыз). Акыр -аягы, эгер сиз бардык ADC казыктарын колдонбосоңуз, колдонулбагандарды GND менен туташтырыңыз. Төмөнкү мисалдын эскизи ар бир ADC пининен бирден баалуулуктарды алат, анан аларды сериялык монитордо көрсөтөт:

#"Wire.h" кошуу

#define PCF8591 (0x90 >> 1) // I2C автобус дареги #ADC0 0x00 аныктоо // жеке ADCлерди окуу үчүн башкаруу байттары #decine ADC1 0x01 #decine ADC2 0x02 #define ADC3 0x03 байт value0, value1, value2, value3; void setup () {Wire.begin (); Serial.begin (9600); } void loop () {Wire.beginTransmission (PCF8591); // ойгонуу PCF8591 Wire.write (ADC0); // башкаруу байты - ADC0 Wire.endTransmission () окуңуз; // өткөрүүнү токтотуу Wire.requestFrom (PCF8591, 2); value0 = Wire.read (); value0 = Wire.read (); Wire.beginTransmission (PCF8591); // ойгонуу PCF8591 Wire.write (ADC1); // башкаруу байты - ADC1 Wire.endTransmission () окуу; // өткөрүүнү токтотуу Wire.requestFrom (PCF8591, 2); value1 = Wire.read (); value1 = Wire.read (); Wire.beginTransmission (PCF8591); // ойгонуу PCF8591 Wire.write (ADC2); // башкаруу байты - окуу ADC2 Wire.endTransmission (); // өткөрүүнү токтотуу Wire.requestFrom (PCF8591, 2); value2 = Wire.read (); value2 = Wire.read (); Wire.beginTransmission (PCF8591); // ойгон PCF8591 Wire.write (ADC3); // башкаруу байты - ADC3 Wire.endTransmission () окуу; // өткөрүүнү токтотуу Wire.requestFrom (PCF8591, 2); value3 = Wire.read (); value3 = Wire.read (); Serial.print (value0); Serial.print (""); Serial.print (value1); Serial.print (""); Serial.print (value2); Serial.print (""); Serial.print (value3); Serial.print (""); Serial.println (); }

Эскизди иштеткенден кийин сизге сериялык монитордо ар бир ADCтин мааниси көрсөтүлөт. Ар бир ADCди кантип жеке окуу керектигин көрсөтүү үчүн бул жөнөкөй демонстрация болсо да, бул белгилүү бир ADCден бир убакта бир нече байтты алуунун оор ыкмасы.

6 -кадам:

Бул үчүн, көзөмөл байтын автоматтык түрдө көбөйтүүнү сурануу үчүн өзгөртүңүз, ал контролдоо байтынын 2 битин 1ге коюу менен жасалат. Ошентип ADC0дон баштоо үчүн биз экилик 00000100 же он алтылык 0x04 жаңы башкаруу байтын колдонобуз. Андан кийин беш байт маалымат сураңыз (дагы бир жолу биз биринчи байтты этибарга албайбыз), бул PCF8591дин бардык баалуулуктарды бир байт чынжырына кайтарышына алып келет. Бул процесс төмөнкү эскизде көрсөтүлгөн:

#"Wire.h" кошуу

#define PCF8591 (0x90 >> 1) // I2C шинасынын дареги байт мааниси0, мааниси1, мааниси2, мааниси3; void setup () {Wire.begin (); Serial.begin (9600); } void loop () {Wire.beginTransmission (PCF8591); // ойгон PCF8591 Wire.write (0x04); // башкаруу байт - ADC0 анан Wire.endTransmission автоматтык көбөйтүүнү окуңуз (); // өткөрүүнү токтотуу Wire.requestFrom (PCF8591, 5); value0 = Wire.read (); value0 = Wire.read (); value1 = Wire.read (); value2 = Wire.read (); value3 = Wire.read (); Serial.print (value0); Serial.print (""); Serial.print (value1); Serial.print (""); Serial.print (value2); Serial.print (""); Serial.print (value3); Serial.print (""); Serial.println (); }

Буга чейин биз PCF8591 Arduino ADC кыла албаган нерсени жасай ала тургандыгын айтканбыз жана бул дифференциалдуу ADC сунуш кылат. Ардуинонун бир учтуусунан айырмаланып (башкача айтканда, оң сигнал чыңалуусу менен GND ортосундагы айырманы кайтарат), дифференциалдуу ADC эки сигналды кабыл алат (бул сөзсүз түрдө жерге шилтеме кылуунун кажети жок) жана эки сигналдын ортосундагы айырманы кайтарат… Бул жүктөө клеткалары үчүн чыңалуудагы кичинекей өзгөрүүлөрдү өлчөө үчүн ыңгайлуу болушу мүмкүн.

7 -кадам:

Сүрөт
Сүрөт

PCF8591 дифференциалдуу ADC үчүн орнотуу - бул башкаруу байтын өзгөртүү жөнүндөгү маселе. Эгерде сиз маалымат баракчасынын жетинчи бетине кайрылсаңыз, аналогдук программалоонун ар кандай түрлөрүн карап көрүңүз. Буга чейин биз "00" режимин төрт киргизүү үчүн колдонгонбуз, бирок сиз так сүрөттөлгөн башкаларын тандай аласыз, мисалы сүрөт.

Ошентип, контролдук байтты эки дифференциалдуу киргизүү үчүн, бинардык 00110000 же 0x30 колдонуңуз. Андан кийин маалыматтын байттарын сурап, алар менен иштөө жөнөкөй маселе. Көрүнүп тургандай, бирдиктүү/дифференциалдуу жана татаал үч дифференциалдуу киргизүү да бар. Бирок, биз аларды азырынча калтырабыз.

Эксперименттериңизге DAC кошуу же ADCлер жөнүндө бир аз көбүрөөк билүү болобу, бул сизди кызыктырды деп үмүттөнөбүз. Сураныч, PMD Wayден PCF8591ге заказ берүүнү карап көрүңүз.

Бул билдирүү сизге pmdway.com тарабынан келген - бүткүл дүйнө жүзү боюнча бекер жеткирүү менен, өндүрүүчүлөр жана электроника ышкыбоздору үчүн.

Сунушталууда: