Բովանդակություն:

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 Լեդ լույսերի և ձայնի համակցում 2024, Հուլիսի
Anonim
Arduino և PCF8591 ADC DAC IC
Arduino և PCF8591 ADC DAC IC

Երբևէ ցանկացե՞լ եք ձեր Arduino նախագծի ավելի շատ անալոգային մուտքագրման կապակցումներ, բայց չցանկացե՞լ եք Mega- ի համար: Կամ կցանկանայի՞ք անալոգային ազդանշաններ առաջացնել: Այնուհետեւ ստուգեք մեր ձեռնարկի թեման `NXP PCF8591 IC:

Այն լուծում է և՛ այս խնդիրները, քանի որ ունի մեկ DAC (թվայինից անալոգային) փոխարկիչ, ինչպես նաև չորս ADC (թվային կերպափոխիչների անալոգային) `բոլորը հասանելի I2C ավտոբուսի միջոցով: PCF8591- ը հասանելի է DIP, մակերևույթի ամրացման և մոդուլի տեսքով, ինչը հեշտացնում է դրա հետ փորձարկելը:

Նախքան առաջ շարժվելը, ներբեռնեք տվյալների թերթիկը: PCF8591- ը կարող է աշխատել ինչպես 5 Վ -ի, այնպես էլ 3.3 Վ լարման վրա, այնպես որ, եթե դուք օգտագործում եք Arduino Due, Raspberry Pi կամ 3.3 V զարգացման այլ տախտակ, լավ եք: Այժմ մենք նախ կբացատրենք DAC- ն, այնուհետև ADC- ները:

Քայլ 1: Օգտագործելով DAC (թվային-անալոգային փոխարկիչ)

Օգտագործելով DAC (թվային-անալոգային փոխարկիչ)
Օգտագործելով DAC (թվային-անալոգային փոխարկիչ)

PCF8591- ի DAC- ն ունի 8 բիթ թույլատրելիություն, ուստի այն կարող է առաջացնել զրոյական վոլտի և հղման լարման (Vref) տեսական ազդանշան 255 քայլով: Demonstուցադրական նպատակների համար մենք կօգտագործենք 5 Վ -ի Vref, իսկ դուք կարող եք օգտագործել ավելի ցածր Vref- ը, ինչպիսին է 3.3 Վ -ը կամ այն, ինչ ցանկանում եք, որ լինի առավելագույն արժեքը … սակայն այն պետք է լինի մատակարարման լարումից փոքր:

Նկատի ունեցեք, որ երբ անալոգային ելքի վրա բեռ կա (իրական իրավիճակ), ելքի առավելագույն լարումը կնվազի. Տվյալների թերթիկը (որը դուք ներբեռնել եք) ցույց է տալիս 10% անկում 10kΩ բեռի համար: Հիմա մեր ցուցադրական շրջանի մասին:

Ուշադրություն դարձրեք I2C ավտոբուսի վրա 10kΩ ձգվող դիմադրիչների օգտագործմանը, իսկ 10μF կոնդենսատորին ՝ 5V- ի և GND- ի միջև: I2C ավտոբուսի հասցեն սահմանվում է A0 ~ A2 կապանքների համադրությամբ, և բոլորի հետ GND հասցեով ՝ 0x90: Անալոգային ելքը կարելի է վերցնել 15 -րդ կապից (և 13. առանձին պոչի վրա կա առանձին անալոգային GND: Բացի այդ, 13 -րդ կապը միացրեք GND- ին, իսկ GND- ը միացրեք Arduino GND- ին:

DAC- ը վերահսկելու համար մենք պետք է ուղարկենք երկու բայթ տվյալներ: Առաջինը վերահսկիչ բայթն է, որը պարզապես ակտիվացնում է DAC- ն և կազմում է 1000000 (կամ 0x40), իսկ հաջորդ բայթը 0 -ից մինչև 255 արժեքն է (ելքի մակարդակը): Սա ցուցադրվում է հետևյալ ուրվագծում.

// Օրինակ 52.1 PCF8591 DAC ցուցադրում

#ներառել «Wire.h» #սահմանել PCF8591 (0x90 >> 1) // I2C ավտոբուսի հասցե void setup () {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 (); // ավարտել փոխանցումը}}

Նկատե՞լ եք ավտոբուսի հասցեի փոքր փոփոխությունը #սահմանել հայտարարության մեջ: Arduino- ն ուղարկում է 7-բիթանոց հասցեներ, բայց PCF8591- ը ցանկանում է 8-բիթանոց, այնպես որ մենք բայթը մեկ բիթով փոխում ենք:

Քայլ 2:

Պատկեր
Պատկեր

Էսքիզի արդյունքները ցուցադրվում են նկարում, մենք Vref- ը միացրել ենք 5 Վ -ի, իսկ տատանումների զոնդը և 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, 0x9F, 0xA2, 0xA5, 0xA8, 0xAB, 0xAE, 0xB1, 0xB3, 0xB6, 0xB9, 0xBC, 0xBF, 0xC1, 0xC4, 0xC7, 0xC9, 0xCC, 0xCE, 0xD1, 0xD3, 0xD5, 0xD8, 0xDA, 0xDC, 0xDE, 0xE0, 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC, 0xFD, 0xFD, 0xFE, 0xFE, 0xFE, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6, 0xF5, 0xF4, 0xF3, 0xF1, 0xF0, 0xEF, 0xED, 0xEB, 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC, 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9, 0xC7, 0xC4, 0xC1, 0xBF, 0xBC, 0xB9, 0xB6, 0xB3, 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7D, 0x7A, 0x77, 0x74, 0x70, 0x6D, 0x6A, 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, 0x0F, 0x0D, 0x0C, 0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x24, 0x26, 0x28, 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37, 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D, 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x64, 0x67, 0x6A, 0x6D, 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: ADC- ների օգտագործում (անալոգային-թվային կերպափոխիչներ)

Եթե դուք օգտագործել եք analogRead () գործառույթը ձեր Arduino- ում (վերադարձ առաջին գլխում), ապա արդեն ծանոթ եք ADC- ին: Առանց PCF8591- ի, մենք կարող ենք կարդալ զրոյի և Vref- ի միջև լարումը, և այն կվերադարձնի զրոյից մինչև 255 -ի արժեքը, որն ուղիղ համեմատական է զրոյին և Vref- ին:

Օրինակ, 3.3 Վ չափումը պետք է վերադարձնի 168. ADC- ի լուծաչափը (8 բիթ) ավելի ցածր է, քան ինքնաթիռում գտնվող Arduino- ն (10 բիթ), սակայն PCF8591- ը կարող է անել այն, ինչ Arduino- ի ADC- ն չի կարող: Բայց մենք դրան կհասնենք մի պահ: Նախ, ADC- ի յուրաքանչյուր քորոցի արժեքները պարզապես կարդալու համար մենք վերահսկիչ բայթ ենք ուղարկում ՝ PCF8591- ին ասելու, թե որ ADC- ն ենք ուզում կարդալ: Cրոյից երեք ADC- ների դեպքում կառավարման բայթը համապատասխանաբար 0x00, 0x01, ox02 և 0x03 է:

Այնուհետև մենք ADC- ից հետ ենք պահանջում երկու բայթ տվյալներ, իսկ երկրորդ բայթը պահում ենք օգտագործման համար: Ինչու՞ երկու բայթ: PCF8591- ը նախ վերադարձնում է նախկինում չափված արժեքը, այնուհետև ընթացիկ բայթը: (Տե՛ս Նկար 8 տվյալների թերթիկում): Ի վերջո, եթե դուք չեք օգտագործում բոլոր ADC կապերը, միացրեք չօգտագործվածները GND- ին: Հետևյալ օրինակի ուրվագիծը պարզապես առբերում է արժեքները յուրաքանչյուր ADC կապից մեկ առ մեկ, այնուհետև ցուցադրում դրանք սերիական մոնիտորում.

#ներառել «Wire.h»

#define PCF8591 (0x90 >> 1) // I2C ավտոբուսի հասցե #սահմանել ADC0 0x00 // վերահսկել բայթ առանձին ADC- ներ կարդալու համար #define ADC1 0x01 #define ADC2 0x02 #define ADC3 0x03 բայթ արժեք 0, արժեք 1, արժեք 2, արժեք 3; 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 (արժեք 0); Serial.print (""); Serial.print (value1); Serial.print (""); Serial.print (արժեք 2); Serial.print (""); Serial.print (value3); Serial.print (""); Serial.println (); }

Էսքիզը վարելուց հետո ձեզ կներկայացվեն սերիական մոնիտորի յուրաքանչյուր ADC- ի արժեքները: Թեև դա պարզ ցուցադրում էր ՝ ձեզ ցույց տալու համար, թե ինչպես պետք է առանձին կարդալ յուրաքանչյուր ADC, բայց դա բարդ մեթոդ է ՝ որոշակի ADC- ից միաժամանակ մեկից ավելի բայթ ստանալու համար:

Քայլ 6:

Դա անելու համար փոխեք կառավարման բայթը ՝ ավտոմատ ավելացում պահանջելու համար, ինչը կատարվում է ՝ հսկիչ բայթ 2-ի բիթը սահմանելով 1-ի: Այսպիսով, ADC0- ից սկսելու համար մենք օգտագործում ենք երկուական 00000100 կամ վեցանկյուն 0x04 երկու նոր կառավարման բայթ: Այնուհետև խնդրեք հինգ բայթ տվյալներ (ևս մեկ անգամ մենք անտեսում ենք առաջին բայթը), ինչը կհանգեցնի PCF8591- ի բոլոր արժեքների վերադարձին մեկ շղթայի բայթերում: Այս գործընթացը ցուցադրվում է հետևյալ ուրվագծում.

#ներառել «Wire.h»

#սահմանել 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 (արժեք 0); Serial.print (""); Serial.print (value1); Serial.print (""); Serial.print (արժեք 2); Serial.print (""); Serial.print (value3); Serial.print (""); Serial.println (); }

Նախկինում մենք նշել էինք, որ PCF8591- ը կարող է անել մի բան, ինչ Arduino- ի ADC- ն չի կարող, և սա տարբերակիչ ADC է առաջարկում: Ի տարբերություն Arduino- ի միակողմանի (այսինքն ՝ վերադարձնում է ազդանշանի դրական լարման և GND- ի միջև տարբերությունը, դիֆերենցիալ ADC- ն ընդունում է երկու ազդանշան (որոնք պարտադիր չէ, որ նշվեն գետնին), և վերադարձնում է երկու ազդանշանների միջև եղած տարբերությունը: Սա կարող է հարմար լինել բեռնախցիկների լարման փոքր փոփոխությունները չափելու համար և այլն:

Քայլ 7:

Պատկեր
Պատկեր

PCF8591- ի դիֆերենցիալ ADC- ի տեղադրումը վերահսկման բայթ փոխելու պարզ խնդիր է: Եթե դիմեք տվյալների թերթիկի յոթ էջին, ապա հաշվի առեք անալոգային մուտքի ծրագրավորման տարբեր տեսակներ: Նախկինում մենք օգտագործում էինք «00» ռեժիմը չորս մուտքերի համար, սակայն կարող եք ընտրել մյուսները, որոնք հստակ պատկերված են, օրինակ ՝ պատկերը:

Այսպիսով, երկու դիֆերենցիալ մուտքերի համար հսկողության բայթ սահմանելու համար օգտագործեք երկուական 00110000 կամ 0x30 երկուական: Այնուհետև պարզ հարց է ՝ պահանջել տվյալների բայթեր և աշխատել դրանց հետ: Ինչպես տեսնում եք, կա նաև մեկ/դիֆերենցիալ և բարդ երեք դիֆերենցիալ մուտք: Այնուամենայնիվ, մենք առայժմ կլքենք դրանք:

Հուսով եմ, որ դուք գտել եք սա հետաքրքրություն ՝ անկախ ձեր փորձերին DAC ավելացնելուց, թե ADC- ների մասին մի փոքր ավելին իմանալուց: Խնդրում ենք հաշվի առնել ձեր PCF8591 պատվիրումը PMD Way- ից:

Այս գրառումը ձեզ է բերել pmdway.com- ը `ամեն ինչ արտադրողների և էլեկտրոնիկայի սիրահարների համար` անվճար առաքում ամբողջ աշխարհով:

Խորհուրդ ենք տալիս: