ዝርዝር ሁኔታ:

አርዱዲኖ እና PCF8591 ADC DAC IC: 7 ደረጃዎች
አርዱዲኖ እና PCF8591 ADC DAC IC: 7 ደረጃዎች

ቪዲዮ: አርዱዲኖ እና PCF8591 ADC DAC IC: 7 ደረጃዎች

ቪዲዮ: አርዱዲኖ እና PCF8591 ADC DAC IC: 7 ደረጃዎች
ቪዲዮ: RADDS - Basics 2024, ህዳር
Anonim
አርዱዲኖ እና PCF8591 ADC DAC IC
አርዱዲኖ እና PCF8591 ADC DAC IC

በአርዱዲኖ ፕሮጀክትዎ ላይ የበለጠ የአናሎግ ግብዓት ፒኖችን ፈልገው ያውቃሉ ፣ ግን ለሜጋ ለመውጣት አልፈለጉም? ወይስ የአናሎግ ምልክቶችን ማመንጨት ይፈልጋሉ? ከዚያ የትምህርታችንን ርዕሰ ጉዳይ ይመልከቱ - NXP PCF8591 IC።

አንድ ነጠላ DAC (ዲጂታል ወደ አናሎግ) መቀየሪያ እንዲሁም አራት ኤዲሲዎች (አናሎግ ለዲጂታል መቀየሪያዎች) ስላለው ሁለቱንም ችግሮች ይፈታል - ሁሉም በ I2C አውቶቡስ በኩል ተደራሽ ናቸው። ፒሲኤፍ8591 በ DIP ፣ በወለል ተራራ እና በሞዱል ቅጽ ውስጥ ይገኛል ፣ ይህም ለመሞከር ቀላል ያደርገዋል።

ከመቀጠልዎ በፊት የውሂብ ሉህ ያውርዱ። PCF8591 በሁለቱም በ 5 ቮ እና በ 3.3 ቪ ላይ ሊሠራ ይችላል ፣ ስለዚህ አርዱinoኖ ዳፕ ፣ Raspberry Pi ወይም ሌላ 3.3 ቮ የልማት ቦርድ የሚጠቀሙ ከሆነ ደህና ነዎት። አሁን በመጀመሪያ DAC ን ፣ ከዚያ ኤዲሲዎችን እናብራራለን።

ደረጃ 1 DAC ን (ዲጂታል ወደ አናሎግ መለወጫ) መጠቀም

DAC ን (ዲጂታል ወደ አናሎግ መለወጫ) መጠቀም
DAC ን (ዲጂታል ወደ አናሎግ መለወጫ) መጠቀም

በ PCF8591 ላይ ያለው DAC የ 8-ቢት ጥራት አለው-ስለዚህ በ 255 ደረጃዎች ውስጥ በዜሮ ቮልት እና በማጣቀሻ ቮልቴጅ (ቪሬፍ) መካከል የንድፈ ሃሳባዊ ምልክት ሊያመነጭ ይችላል። ለሠርቶ ማሳያ ዓላማዎች የ 5 ቪ ቪኤፍ እንጠቀማለን ፣ እና እንደ ዝቅተኛ 3.3 ቪ ወይም ከፍተኛውን እሴት እንዲፈልጉ የሚፈልጉትን ማንኛውንም Vref መጠቀም ይችላሉ… ሆኖም ከአቅርቦቱ voltage ልቴጅ ያነሰ መሆን አለበት።

በአናሎግ ውፅዓት (በእውነተኛው ዓለም ሁኔታ) ላይ ጭነት በሚኖርበት ጊዜ ከፍተኛው የውጤት voltage ልቴጅ እንደሚቀንስ ልብ ይበሉ-የውሂብ ሉህ (ያወረዱት) ለ 10 ኪ.ሜ ጭነት 10% ጠብታ ያሳያል። አሁን ለሠርቶ ማሳያ ወረዳችን።

በ I2C አውቶቡስ ላይ የ 10kΩ መጎተቻ መቆጣጠሪያዎችን ፣ እና በ 5 ቮ እና GND መካከል ያለውን 10μF capacitor መጠቀምን ልብ ይበሉ። የ I2C አውቶቡስ አድራሻ በፒን A0 ~ A2 ጥምር ተዘጋጅቷል ፣ እና ከሁሉም ጋር ወደ GND አድራሻው 0x90 ነው። የአናሎግ ውፅዓት ከፒን 15 ሊወሰድ ይችላል (እና በፒን 13 ላይ የተለየ የአናሎግ GND አለ ፣ እንዲሁም ፒን 13 ን ከ GND ፣ እና ወረዳ GND ን ከአርዲኖ GND ጋር ያገናኙ።

DAC ን ለመቆጣጠር ሁለት ባይት ውሂብ መላክ አለብን። የመጀመሪያው የመቆጣጠሪያ ባይት ነው ፣ እሱ በቀላሉ DAC ን የሚያነቃቃ እና 1000000 (ወይም 0x40) እና ቀጣዩ ባይት በ 0 እና 255 (የውጤት ደረጃ) መካከል ያለው እሴት ነው። ይህ በሚከተለው ንድፍ ውስጥ ይታያል።

// ምሳሌ 52.1 PCF8591 DAC ማሳያ

#"Wire.h" #define PCF8591 (0x90 >> 1) // I2C የአውቶቡስ አድራሻ ባዶ ማዘጋጀት () {Wire.begin (); } ባዶነት loop () {ለ (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 () ለመላክ; // ማስተላለፍን ጨርስ}}

በ #ገላጭ መግለጫው ውስጥ የአውቶቡስ አድራሻውን ትንሽ ለውጥ አስተውለዎታል? አርዱዲኖ ባለ 7-ቢት አድራሻዎችን ይልካል ፣ ግን ፒሲኤፍ 8551 8-ቢት ይፈልጋል ፣ ስለዚህ ባይት በአንድ ቢት እንለውጣለን።

ደረጃ 2

ምስል
ምስል

የስዕሉ ውጤት በምስሉ ላይ ይታያል ፣ እኛ ቪሬፍን ከ 5 ቮ እና ከአ oscilloscope መጠይቅን እና GND ን ከአናሎግ ውፅዓት እና GND ጋር አገናኘን።

ደረጃ 3

ምስል
ምስል

ኩርባዎችን ከወደዱ ከዚህ በታች ካለው ስዕል ጋር የኃይለኛ ማዕበሎችን ማመንጨት ይችላሉ። አስፈላጊውን ቅድመ-የተሰላ የውሂብ ነጥቦችን በያዘ ድርድር ውስጥ የፍለጋ ሰንጠረዥን ይጠቀማል-

// ምሳሌ 52.2 PCF8591 DAC ማሳያ - ሳይን ሞገድ

#“Wire.h” #ን ይግለጹ PCF8591 (0x90 >> 1) // I2C የአውቶቡስ አድራሻ u_8_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 ፣ 0xD ፣ 0xD ፣ 0xDX ፣ 0xDX ፣ 0xDX ፣ 0xDX 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 ፣ 0XF ፣ 0XF, 0XF, 0XF, 0XFX 0xFF ፣ 0xFF ፣ 0xFF ፣ 0xFF ፣ 0xFF ፣ 0xFF ፣ 0xFF ፣ 0xFE ፣ 0xFE ፣ 0xFE ፣ 0xFD ፣ 0xFD ፣ 0xFC ፣ 0xFB ፣ 0xFA ፣ 0xFA ፣ 0xF9 ፣ 0xF8 ፣ 0xF6 ፣ 0FF ፣ 0FF ፣ 0FF 0xED ፣ 0xEB ፣ 0xEA ፣ 0xE8 ፣ 0xE6 ፣ 0xE4 ፣ 0xE2 ፣ 0xE0 ፣ 0xDE ፣ 0xDC ፣ 0xDA ፣ 0xD8 ፣ 0xD5 ፣ 0xD3 ፣ 0xD1 ፣ 0xCE ፣ 0xCC ፣ 0xC9 ፣ 0xC7 ፣ 0xB ፣ 0xC ፣ 0xC ፣ 0 ፣ 0BC 0xB3 ፣ 0xB1 ፣ 0xAE ፣ 0xAB ፣ 0xA8 ፣ 0xA5 ፣ 0xA2 ፣ 0x9F ፣ 0x9C ፣ 0x99 ፣ 0x96 ፣ 0x93 ፣ 0x90 ፣ 0x8C ፣ 0x89 ፣ 0x86 ፣ 0x83 ፣ 0x80 ፣ 0x7D ፣ 0x7x ፣ 0x7x ፣ 0x7 ፣ 0x7 ፣ 0x7 ፣ 0x7 ፣ 0x7 ፣ 0x7 ፣ 0x7 ፣ 0x7 ፣ 0x7 ፣ 0x7 ፣ 0x7 ፣ 0x7 ፣ 0x7 ፣ 0x7 ፣ 0x7 ፣ 0x7 ፣ 0x7 ፣ 0x7 ፣ 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 ፣ 0x11 ፣ 0x10 ፣ 0x10 ፣ 0x10 ፣ 0x10 0x0B ፣ 0x0A ፣ 0x08 ፣ 0x07 ፣ 0x06 ፣ 0x06 ፣ 0x05 ፣ 0x04 ፣ 0x03 ፣ 0x03 ፣ 0x02 ፣ 0x02 ፣ 0x02 ፣ 0x01 ፣ 0x01 ፣ 0x01 ፣ 0x01 ፣ 0x0 ፣ 0x0 ፣ 0x0 ፣ 0x0 0x04 ፣ 0x05 ፣ 0x06 ፣ 0x06 ፣ 0x07 ፣ 0x08 ፣ 0x0A ፣ 0x0B ፣ 0x0C ፣ 0x0D ፣ 0x0F ፣ 0x10 ፣ 0x11 ፣ 0x13 ፣ 0x15 ፣ 0x16 ፣ 0x18 ፣ 0x1A ፣ 0x1C ፣ 0x ፣ 0x ፣ 0x20 ፣ 0x20 0x2B ፣ 0x2D ፣ 0x2F ፣ 0x32 ፣ 0x34 ፣ 0x37 ፣ 0x39 ፣ 0x3C ፣ 0x3F ፣ 0x41 ፣ 0x44 ፣ 0x47 ፣ 0x4A ፣ 0x4D ፣ 0x4F ፣ 0x52 ፣ 0x55 ፣ 0x58 ፣ 0x5 ፣ 0x ፣ 06 ፣ 06 ፣ 06 ፣ 06 0x70 ፣ 0x74 ፣ 0x77 ፣ 0x7A ፣ 0x7D}; ባዶነት ማዋቀር () {Wire.begin (); } ባዶነት loop () {ለ (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // ንቃ PCF8591 Wire.write (0x40); // ቁጥጥር ባይት - DAC ን ያብሩ (ሁለትዮሽ 1000000) Wire.write (sine_wave ); // እሴት ወደ DAC Wire.endTransmission () ለመላክ; // ማስተላለፍን ጨርስ}}

ደረጃ 4

ምስል
ምስል

ለሚከተለው የ DSO ምስል መጣል ፣ ቪሬፉን ወደ 3.3 ቪ ቀይረነዋል - በሲን ሞገድ ላይ በማክስማ ውስጥ ያለውን ለውጥ ልብ ይበሉ።

አሁን የድምፅ ውጤቶችን ፣ ምልክቶችን ወይም ሌሎች የአናሎግ ወረዳዎችን ለመቆጣጠር ከ DAC ጋር ሙከራ ማድረግ ይችላሉ።

ደረጃ 5-ኤዲሲዎችን (ከአናሎግ ወደ ዲጂታል ቀያሪዎች) መጠቀም

በእርስዎ አርዱinoኖ (የአንደኛው መንገድ ተመልሶ) የአናሎግ አንባቢ () ተግባርን ከተጠቀሙ ከዚያ ከኤ.ዲ.ሲ ጋር አስቀድመው ያውቁታል። ከ PCF8591 ውጭ በዜሮ እና በ Vref መካከል ያለውን voltage ልቴጅ እናነባለን እና እሱ ከዜሮ እና ከቪሬፍ ጋር በቀጥታ የሚዛመድ በዜሮ እና በ 255 መካከል ያለውን እሴት ይመልሳል።

ለምሳሌ ፣ 3.3V መለካት 168 መመለስ አለበት። የኤዲሲው ጥራት (8-ቢት) ከመርከቧ አርዱinoኖ (10-ቢት) ያነሰ ቢሆንም PCF8591 የአርዱዲኖ ኤዲሲ የማይችለውን ማድረግ ይችላል። ግን ወደዚያ እንመጣለን። በመጀመሪያ ፣ የእያንዳንዱን የኤዲሲ ፒን እሴቶችን በቀላሉ ለማንበብ የትኛውን ADC ለማንበብ እንደምንፈልግ ለ PCF8591 ለመንገር የቁጥጥር ባይት እንልካለን። ለኤዲሲዎች ከዜሮ እስከ ሶስት የቁጥጥር ባይት 0x00 ፣ 0x01 ፣ ox02 እና 0x03 ነው።

ከዚያ ከኤዲሲ ሁለት ባይት መረጃዎችን እንጠይቃለን ፣ እና ሁለተኛውን ባይት ለአገልግሎት ያከማቻል። ለምን ሁለት ባይት? PCF8591 ቀደም ሲል የሚለካውን እሴት መጀመሪያ ይመልሳል - ከዚያ የአሁኑ ባይት። (በውሂብ ሉህ ውስጥ ስእል 8 ን ይመልከቱ)። በመጨረሻም ፣ ሁሉንም የኤዲሲ ፒኖች ካልተጠቀሙ ፣ ጥቅም ላይ ያልዋሉትን ከ GND ጋር ያገናኙ። የሚከተለው ምሳሌ ንድፍ በቀላሉ ከእያንዳንዱ የኤዲሲ ፒን እሴቶችን አንድ በአንድ ያወጣል ፣ ከዚያ በተከታታይ ማሳያ ውስጥ ያሳያቸዋል

#"Wire.h" ን ያካትቱ

#define PCF8591 (0x90 >> 1) // I2C የአውቶቡስ አድራሻ #ዲፊን ADC0 0x00 // መቆጣጠሪያ ባይት የግለሰብ ኤዲሲዎችን #ጥርት ADC1 0x01 #ዲፊን ADC2 0x02 #መግለፅ ADC3 0x03 ባይት እሴት 0 ፣ እሴት 1 ፣ እሴት 2 ፣ እሴት 3; ባዶነት ማዋቀር () {Wire.begin (); Serial.begin (9600); } ባዶነት loop () {Wire.beginTransmission (PCF8591); // ንቃ PCF8591 Wire.write (ADC0); // ቁጥጥር ባይት - ADC0 Wire.endTransmission () ን ያንብቡ; // ማለቂያ ማስተላለፍ Wire.requestFrom (PCF8591, 2); value0 = Wire.read (); value0 = Wire.read (); Wire.begin ማስተላለፊያ (PCF8591); // ንቃ PCF8591 Wire.write (ADC1); // ቁጥጥር ባይት - ADC1 Wire.endTransmission () ን ያንብቡ; // ማለቂያ ማስተላለፍ Wire.requestFrom (PCF8591, 2); value1 = Wire.read (); value1 = Wire.read (); Wire.begin ማስተላለፊያ (PCF8591); // ንቃ PCF8591 Wire.write (ADC2); // ቁጥጥር ባይት - ADC2 Wire.endTransmission () ን ያንብቡ; // ማለቂያ ማስተላለፍ Wire.requestFrom (PCF8591, 2); value2 = Wire.read (); value2 = Wire.read (); Wire.begin ማስተላለፊያ (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 (እሴት 1); Serial.print (""); Serial.print (እሴት 2); Serial.print (""); Serial.print (እሴት 3); Serial.print (""); Serial.println (); }

ንድፉን በሚሰሩበት ጊዜ በተከታታይ ማሳያ ውስጥ የእያንዳንዱን የኤ.ዲ.ሲ. ምንም እንኳን እያንዳንዱን ኤ.ዲ.ሲ እንዴት በግለሰብ ደረጃ ማንበብ እንደሚችሉ ለማሳየት ቀላል ማሳያ ቢሆንም ፣ ከአንድ ከአንድ ኤ.ዲ.ሲ በአንድ ጊዜ ከአንድ ባይት በላይ የማግኘት አስቸጋሪ ዘዴ ነው።

ደረጃ 6

ይህንን ለማድረግ የቁጥጥር ባይት ለውጥን ለመጠየቅ የቁጥጥር ባይት ይለውጡ ፣ ይህም የሚከናወነው የቁጥጥር ባይት ቢት 2 ን ወደ 1. በማዋቀር ነው። ስለዚህ ከ ADC0 ለመጀመር አዲስ የቁጥጥር ባይት ሁለትዮሽ 00000100 ወይም ሄክሳዴሲማል 0x04 እንጠቀማለን። ከዚያ አምስት ባይት ውሂብን ይጠይቁ (እንደገና የመጀመሪያውን ባይት ችላ እንላለን) ይህም PCF8591 ሁሉንም እሴቶች በአንድ ባይት ሰንሰለት እንዲመልስ ያደርጋል። ይህ ሂደት በሚከተለው ንድፍ ውስጥ ይታያል-

#"Wire.h" ን ያካትቱ

#ጥራት PCF8591 (0x90 >> 1) // I2C የአውቶቡስ አድራሻ ባይት እሴት 0 ፣ እሴት 1 ፣ እሴት 2 ፣ እሴት 3; ባዶነት ማዋቀር () {Wire.begin (); Serial.begin (9600); } ባዶነት 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 (እሴት 1); Serial.print (""); Serial.print (እሴት 2); Serial.print (""); Serial.print (እሴት 3); Serial.print (""); Serial.println (); }

ከዚህ ቀደም ፒሲኤፍ8591 የአርዱዲኖ ኤዲሲ የማይችለውን ነገር ሊያደርግ እንደሚችል ጠቅሰናል ፣ እና ይህ ልዩ ልዩ ኤ.ዲ.ሲ. እንደ አርዱinoኖ ነጠላ-መጨረሻ (ማለትም በአዎንታዊ የምልክት voltage ልቴጅ እና በ GND መካከል ያለውን ልዩነት ይመልሳል ፣ ልዩነቱ ADC ሁለት ምልክቶችን ይቀበላል (የግድ ወደ መሬት መጠቀስ የለባቸውም) ፣ እና በሁለቱ ምልክቶች መካከል ያለውን ልዩነት ይመልሳል።.ይህ ለጭነት ህዋሶች እና በቮልቴጅዎች ውስጥ ትናንሽ ለውጦችን ለመለካት ምቹ ሊሆን ይችላል።

ደረጃ 7

ምስል
ምስል

PCF8591 ን ለልዩነት ኤዲሲ ማዋቀር የቁጥጥር ባይት መለወጥ ቀላል ጉዳይ ነው። ከመረጃ ወረቀቱ ወደ ገጽ ሰባት ካዞሩ ፣ ከዚያ የተለያዩ የአናሎግ ግብዓት ፕሮግራሞችን አይነቶች ያስቡ። ቀደም ሲል ለአራት ግብዓቶች ሁነታን ‹00 ›ን እንጠቀም ነበር ፣ ሆኖም ግን ሌሎቹን በግልፅ የተገለጹትን ፣ ለምሳሌ ምስሉን መምረጥ ይችላሉ።

ስለዚህ የቁጥጥር ባይት ለሁለት ልዩነት ግብዓቶች ለማቀናበር ሁለትዮሽ 00110000 ወይም 0x30 ን ይጠቀሙ። ከዚያ የውሂብ ባይቶችን መጠየቅና ከእነሱ ጋር አብሮ መሥራት ቀላል ጉዳይ ነው። እንደሚመለከቱት ጥምር ነጠላ/ልዩነት እና የተወሳሰበ ባለ ሶስት ልዩነት ግብዓት አለ። ሆኖም ለጊዜው እንተዋቸዋለን።

ለሙከራዎችዎ DAC ማከልም ሆነ ስለ ADC ዎች ትንሽ መማር ፣ ይህንን ፍላጎት እንዳገኙ ተስፋ እናደርጋለን። እባክዎን የእርስዎን PCF8591 ከ PMD Way ለማዘዝ ያስቡበት።

ይህ ልጥፍ በ pmdway.com ወደ እርስዎ አምጥቷል - ሁሉም ነገር ለአዘጋጆች እና ለኤሌክትሮኒክስ አፍቃሪዎች ፣ በዓለም አቀፍ ነፃ መላኪያ።

የሚመከር: