ዝርዝር ሁኔታ:

በ ESP32: 5 ደረጃዎች የተሻለ DAC እንዴት እንደሚሰራ እና እንደሚሞክር
በ ESP32: 5 ደረጃዎች የተሻለ DAC እንዴት እንደሚሰራ እና እንደሚሞክር

ቪዲዮ: በ ESP32: 5 ደረጃዎች የተሻለ DAC እንዴት እንደሚሰራ እና እንደሚሞክር

ቪዲዮ: በ ESP32: 5 ደረጃዎች የተሻለ DAC እንዴት እንደሚሰራ እና እንደሚሞክር
ቪዲዮ: ከወሲብ በፊት ይህን ከጠጣህ አለቀላት ! | ማለቂያ ለሌለው የወሲብ ብቃት | 2024, ሀምሌ
Anonim
በ ESP32 አማካኝነት የተሻለ DAC እንዴት እንደሚሰራ እና እንደሚሞክር
በ ESP32 አማካኝነት የተሻለ DAC እንዴት እንደሚሰራ እና እንደሚሞክር
በ ESP32 አማካኝነት የተሻለ DAC እንዴት እንደሚሰራ እና እንደሚሞክር
በ ESP32 አማካኝነት የተሻለ DAC እንዴት እንደሚሰራ እና እንደሚሞክር

ESP32 2 8-ቢት ዲጂታል ወደ አናሎግ ለዋጮች (DACs) አለው። እነዚህ DACs በተወሰነ ክልል (0-3.3V) ውስጥ 8 ቢት ጥራቶች ውስጥ የዘፈቀደ ቮልቴጅን ለማምረት ያስችለናል። በዚህ Instructable ውስጥ ፣ DAC ን እንዴት እንደሚገነቡ እና አፈፃፀሙን ለይተው የሚያሳዩ እንዲሁም ከ ESP32 DAC ጋር ያወዳድሩዎታል። እኔ የምመለከታቸው የአፈጻጸም ጠቋሚዎች ያካትታሉ

  • የጩኸት ደረጃ
  • የመተላለፊያ ይዘት
  • የተዋሃደ ቀጥተኛ ያልሆነ
  • ልዩነት አልባነት

እነዚህን ጠቋሚዎች ለመፈተሽ ADS1115 ን እጠቀማለሁ።

የእነዚህ ሁሉ ጠቋሚዎች ግምገማዎ ልክ እንደ ማጣቀሻ መሣሪያዎ (በዚህ ሁኔታ ADS115) ብቻ ትክክለኛ መሆኑን ልብ ማለት አስፈላጊ ነው። ለምሳሌ ፣ የቮልቴጅ ማካካሻ እና ትርፍ ሲያገኝ ADS115 16-ቢት ትክክለኛነት የለውም። እነዚህ ስህተቶች 0.1%ሊሆኑ ይችላሉ። ለብዙ ሥርዓቶች ፣ ፍጹም ትክክለኛነት ውስን አሳሳቢ በሚሆንበት ጊዜ እነዚህ ስህተቶች ችላ ሊባሉ ይችላሉ።

አቅርቦቶች

  • ADS1115
  • ESP32 ቦርድ
  • የዳቦ ሰሌዳ
  • ዝላይ ሽቦዎች
  • 5 kOhm Resistor
  • 1 ማይክሮ ፋራድ ሴራሚክ capacitor

ደረጃ 1 የዳቦ ሰሌዳውን መዘርጋት

የዳቦ ሰሌዳውን መዘርጋት
የዳቦ ሰሌዳውን መዘርጋት

የሚከተሉትን ካስማዎች ሽቦ

በ ESP32 እና ADS1115 መካከል

3v3 ቪዲዲ

GND GND

GPIO22 SCL

GPIO21 SDA

በ ADS1115

ADDR GND (ADS115)

DAC ማድረግ

DAC ን ለመሥራት ብዙ መንገዶች አሉ። በጣም ቀላሉ የ PWM ምልክትን ከተከላካይ እና ከካፒታተር ጋር ዝቅተኛ ማጣራት ነው። እኔ እንደ ቋት እዚህ ውስጥ ኦፕ-አምፕ ማከል እችል ነበር ነገር ግን ነገሮችን ቀላል ለማድረግ ፈልጌ ነበር። ይህ ንድፍ PWM ን ከሚደግፍ ከማንኛውም ማይክሮ መቆጣጠሪያ ጋር ለመተግበር ቀላል እና ርካሽ ነው። እኔ እዚህ የንድፍ ንድፈ ሀሳብ (google PWM DAC) አልሄድም።

GPIO255 KOhm resistor 1 microFarad Capacitor gnd ን ብቻ ያገናኙ

አሁን ተከላካዩ capacitor ን ወደ ኤ 0 በ ADS115 ከሚገናኝበት ቦታ ላይ የመዝለያ ሽቦን ያገናኙ።

ደረጃ 2 - ወደ ጫጫታ ደረጃ ምልክት ይገምግሙ

ወደ ጫጫታ ደረጃ ምልክት ይገምግሙ
ወደ ጫጫታ ደረጃ ምልክት ይገምግሙ

የድምፅ ደረጃውን ለመገምገም በቀላሉ ከዚህ በታች ያለውን ስክሪፕት ያሂዱ። ይህንን ለመገምገም በቀላሉ DAC ን በቋሚ እሴት እንተወውና ቮልቴጁ በጊዜ ሂደት እንዴት እንደሚወዛወዝ እንለካለን።

በዲኤሲሲ ዲዛይን ምክንያት የ PWM ምልክት በ 50% የቀን ዑደት ላይ በሚሆንበት ጊዜ ጫጫታው ከፍተኛ ይሆናል። ስለዚህ እኛ የምንገመግመው እዚህ ነው። ESP32 ን በዚህ ተመሳሳይ የምልክት ደረጃም እንገመግመዋለን። እንዲሁም መለኪያው ተመጣጣኝ እንዲሆን ESP32 DAC ን በተመሳሳይ ዝቅተኛ ማለፊያ ማጣሪያ እናጣራለን።

ለእኔ ውጤቱ ግልፅ ነበር። የ PWM ንድፍ> 6dB የተሻለ SNR ነበረው (ይህ 2 እጥፍ የተሻለ ነው)። ለአዲሱ DAC ግልፅ ድል። አንድ ትንሽ ግራ የሚያጋባው በ SNC ውስጥ በእርግጠኝነት SNR ን የሚያሻሽሉ ማጣሪያዎች መኖራቸው ነው። ስለዚህ ፍጹም እሴቶች ለመተርጎም አስቸጋሪ ሊሆኑ ይችላሉ። እኔ ሁለተኛ ትዕዛዝ ማጣሪያን ብጠቀም ኖሮ ይህ አይሆንም።

ለማንኛውም ኮድ ከዚህ በታች ነው

#ያካትቱ

#አዳፍሩት_ADS1115 ማስታወቂያዎችን ያካትቱ ፤ // adafruit ቤተ -መጽሐፍት ለ adc int16_t adc0; // ባዶነት ማዋቀር (ባዶ) {Serial.begin (115200); // ተከታታይ ማስታወቂያዎችን ይጀምሩ። setGain (GAIN_TWO); // 2x ትርፍ +/- 2.048V 1 ቢት = 0.0625mV ads.begin (); // ጀምር adc float M = 0; // የመጀመሪያ አማካይ ተንሳፋፊ Mp = 0; // previouos ማለት ተንሳፋፊ S = 0; // የመጀመሪያ ልዩነት ተንሳፋፊ Sp = 0; // ቀዳሚው ልዩነት const int reps = 500; // ድግግሞሾች ብዛት int n = 256; // የናሙናዎች ብዛት ledcSetup (0, 25000, 8); // አዘጋጅ pwm frequecny = 25000 Hz በ 8 ቢት ጥራት ledcAttachPin (25 ፣ 0); // ፒኤም ፒን በ 25 ledc ጻፍ (0 ፣ 128); // ለግማሽ የቀን ዑደት (ትልቁ ጫጫታ) መዘግየት (3000) ያዘጋጁት ፤ // የመጠባበቂያ ጊዜ ተንሳፋፊ ተንሳፋፊ snrPWM [reps]; // የ PWM ተንሳፋፊ snrDAC [reps] የ snrs ድርድር; // ለ DAC (sn i = 0; i <reps; i ++) {// loope over overititions for (int k = 1; k <(n+1); k ++) {// loope over ናሙናዎች adc0 = ads.readADC_SingleEnded (0); // ንባብን ያግኙ M = Mp + (adc0 - Mp) / k; // የማሽከርከር አማካኝ Mp = M; // የቀድሞው አማካይ S = Sp + (adc0 - Mp) * (adc0 - M) ያዘጋጁ ፤ // ስሌት የማሽከርከር ልዩነት Sp = S; // የቀደመውን ልዩነት ያዘጋጁ} // snr በ dB snrPWM = 20 * log10 (3.3 / (sqrt (S / n) *.0625 *.001)); // እሴቶችን ዳግም ያስጀምሩ M = 0; Mp = 0; ኤስ = 0; Sp = 0; } ledcDetachPin (25); // PWM ን ከፒን 25 dacWrite (25 ፣ 128) ያላቅቁ ፤ // ለ DAC መዘግየት (3000) ይፃፉ ፤ // እስኪረጋጋ ይጠብቁ (int i = 0; i <reps; i ++) {// ልክ እንደ PWM loop ለ (int k = 1; k <(n+1) ፣ k ++) {adc0 = ads.readADC_SingleEnded (0); M = Mp + (adc0 - Mp) / k; Mp = M; S = Sp + (adc0 - Mp) * (adc0 - M); Sp = S; } snrDAC = 20 * log10 (3.3 / (sqrt (S / n) *.0625 *.001))); መ = 0; Mp = 0; ኤስ = 0; Sp = 0; } // በአንድ ግራፍ ላይ SNRs ያሴሩ ለ (int i = 1; i <reps; i ++) {Serial.print ("PWM_SNR (dB):"); Serial.print (snrPWM ); Serial.print (","); Serial.print ("ESP32_SNR (dB):"); Serial.println (snrDAC ); }} ባዶነት loop (ባዶ) {}

ደረጃ 3: ያልተዋሃደ ያልተመጣጠነ እና ልዩነት አለመጣጣም

የተዋሃደ ያልተመጣጠነ እና ልዩነት ያልሆነ
የተዋሃደ ያልተመጣጠነ እና ልዩነት ያልሆነ

ዋናው ያልተመጣጠነነት በእርስዎ DAC ውፅዓት ቮልቴጅ እና ቀጥታ መስመር መካከል ምን ያህል መዛባት እንዳለ የሚለካ ነው። ትልቁ ይህ የባሰ ነው…

ልዩነቱ ያልተመጣጠነ ሁኔታ በቮልቴጅ ውስጥ የታየው ለውጥ (ከአንድ ኮድ ወደ ቀጣዩ) ከቀጥታ መስመር ከሚጠበቀው በግምት የሚለካ ነው።

እዚህ ያሉት ውጤቶች በእውነት አስደሳች ነበሩ። በመጀመሪያ ፣ ሁለቱም ከ 0.5lsb ያነሰ ስህተት (በ 8-ቢት ጥራት) ጥሩ ነው ነገር ግን PWM በጣም የተሻሉ የተዋሃደ መስመራዊነት አለው። ሁለቱም ተነፃፃሪ ልዩነት አለመጣጣም አላቸው ፣ ግን ESP32 DAC አንዳንድ በጣም እንግዳ ጫፎች አሉት። ከዚህም በላይ የ PWM ዘዴ ለስህተቶቹ የተወሰነ መዋቅር አለው። በመሰረቱ ትክክለኛውን ቮልቴጅን በተለዋጭ ፋሽን ያቃጥላል እና ያሰላል።

የእኔ ጥርጣሬ ይህ በ ESP32 ላይ ባለ 8-ቢት PWM ምልክት እንዴት እንደሚፈጠር አንዳንድ እንግዳ የሆነ የክብደት ስህተት ነው።

ይህንን ለማስተካከል አንዱ መንገድ በሁለት ተጓዳኝ ኮዶች (ለምሳሌ 128 ፣ 129) ከ PWM ጋር በፍጥነት ማሽከርከር ነው። በአናሎግ ዝቅተኛ ማለፊያ ማጣሪያ ፣ የተከሰቱት ስህተቶች በአማካይ ወደ ዜሮ ይሆናሉ። ይህንን በሶፍትዌር አስመስዬ ነበር እና በእርግጥ ሁሉም ስህተቶች ጠፉ። አሁን የ PWM ዘዴ ለ 16-ቢት ትክክለኛ የሆነ መስመራዊነት አለው!

ውሂቡን ለማመንጨት ኮዱ ማንኛውም ከዚህ በታች ነው። ውጤቱ በ.csv ቅርጸት በተከታታይ ማሳያ ላይ ይሆናል። ለተጨማሪ ሂደት ወደ የጽሑፍ ፋይል ይቅዱ።

#ያካትቱ

#አዳፍሩት_ADS1115 ማስታወቂያዎችን ያካትቱ ፤ / * ይህንን ለ 16-ቢት ስሪት */ int16_t adc0 ይጠቀሙ። ባዶ ማዘጋጀት (ባዶ) {Serial.begin (115200); ads.setGain (GAIN_ONE); // 2x ትርፍ +/- 2.048V 1 ቢት = 1mV 0.0625mV ads.begin (); ledcSetup (0, 25000, 8); ledcAttachPin (25, 0); Serial.println (“የሚጠበቅ ፣ የታዘበ”); ledcWrite (0, 2); መዘግየት (3000); ለ (int i = 2; i <255; i ++) {ledcWrite (0, i); መዘግየት (100); adc0 = ads.readADC_SingleEnded (0); ተንሳፋፊ ይጠበቃል = (i / 256.0 * 3.3) / 4.096 * 32767; Serial.print (የሚጠበቀው); Serial.print (","); Serial.println (adc0); }} ባዶነት loop (ባዶ) {}

ደረጃ 4 - የመተላለፊያ ይዘት

የመተላለፊያ ይዘት
የመተላለፊያ ይዘት

የ DAC ውፅዓት በ 3 ዲቢቢ በሚቀንስበት ድግግሞሽ ልክ የመተላለፊያ ይዘትን እዚህ እገልጻለሁ። ይህ ኮንቬንሽን እና በተወሰነ ደረጃ የዘፈቀደ ነው። ለምሳሌ ፣ በ 6 ዲቢ ነጥብ ላይ ፣ ዲኤሲው አሁንም ~ 50% ስፋት ይሆናል የሚል ምልክት ያወጣል።

ይህንን ለመለካት በቀላሉ ከ DAC ወደ ADC እየጨመረ የሚሄደውን የኃይለኛ ሞገዶችን እናስተላልፋለን እና የእነሱን መደበኛ መዛባት እንለካለን። በሚያስገርም ሁኔታ የ 3 ዲቢ ነጥብ በ 30Hz (1/(2*pi*5000*1e-6)) ላይ ነው።

ESP32 በሰከንድ 1 ሜጋ ናሙና ማድረግ ይችላል። ይህ ለ ESP32 እጅ ወደ ታች ማሸነፍ ነው። በ 100Hz የመተላለፊያ ይዘት የሙከራ ክልል ውስጥ የእሱ ስፋት በጭራሽ አይበላሽም።

ከዚህ በታች ያለው ኮድ የ PWM DAC የመተላለፊያ ይዘትን ሊሞክር ይችላል።

#ያካትቱ

#አዳፍሩት_ADS1115 ማስታወቂያዎችን ያካትቱ ፤ / * ይህንን ለ 16-ቢት ስሪት */ int16_t adc0 ይጠቀሙ። int16_t adc1; ባዶ ማዘጋጀት (ባዶ) {float M; ተንሳፋፊ Mp = 0; ተንሳፋፊ S = 0; ተንሳፋፊ Sp = 0; Serial.begin (115200); ads.setGain (GAIN_ONE); // 1x ትርፍ +/- 4.096V 1 ቢት = 2mV 0.125mV ads.begin (); ledcSetup (0, 25000, 8); ledcAttachPin (25, 0); መዘግየት (5000); Serial.println ("ድግግሞሽ ፣ ስፋት"); ለ (int i = 1; i <100; i ++) {ያልተፈረመ ረጅም ጅምር = ሚሊስ (); ያልተፈረመ ረዥም T = ሚሊስ (); Sp = 0; ኤስ = 0; መ = 0; Mp = 0; int k = 1; ተንሳፋፊ ደንብ; ((T - ጀምር) <1000) {int out = 24 * ኃጢአት (2 * PI * i * (T - ጀምር) / 1000.0) + 128; ledcWrite (0 ፣ ውጭ); adc0 = ads.readADC_SingleEnded (0); M = Mp + (adc0 - Mp) / k; Mp = M; S = Sp + (adc0 - Mp) * (adc0 - M); Sp = S; ቲ = ሚሊስ (); k ++; } ከሆነ (i == 1) {norm = sqrt (S / k); } Serial.print (i); Serial.print (","); Serial.println (sqrt (S / k) / norm, 3); k = 0; }} ባዶነት loop (ባዶ) {}

እና ይህ ኮድ የ ESP32 የመተላለፊያ ይዘቱን ይፈትሻል። መያዣውን ማስወገድዎን ያረጋግጡ ወይም ውጤቶቹ ለሁለቱም ዘዴዎች ተመሳሳይ ይሆናሉ።

#ያካትቱ

#አዳፍሩት_ADS1115 ማስታወቂያዎችን ያካትቱ ፤ / * ይህንን ለ 16-ቢት ስሪት */ int16_t adc0 ይጠቀሙ። int16_t adc1; ባዶ ማዘጋጀት (ባዶ) {float M; ተንሳፋፊ Mp = 0; ተንሳፋፊ S = 0; ተንሳፋፊ Sp = 0; Serial.begin (115200); ads.setGain (GAIN_ONE); // 1x ትርፍ +/- 4.096V 1 ቢት = 2mV 0.125mV ads.begin (); መዘግየት (5000); Serial.println ("ድግግሞሽ ፣ ስፋት"); ለ (int i = 1; i <100; i ++) {ያልተፈረመ ረጅም ጅምር = ሚሊስ (); ያልተፈረመ ረዥም T = ሚሊስ (); Sp = 0; ኤስ = 0; መ = 0; Mp = 0; int k = 1; ተንሳፋፊ ደንብ; ((T - ጀምር) <1000) {int out = 24 * ኃጢአት (2 * PI * i * (T - ጀምር) / 1000.0) + 128; dacWrite (25 ፣ ውጭ); adc0 = ads.readADC_SingleEnded (0); M = Mp + (adc0 - Mp) / k; Mp = M; S = Sp + (adc0 - Mp) * (adc0 - M); Sp = S; ቲ = ሚሊስ (); k ++; } ከሆነ (i == 1) {norm = sqrt (S / k); } Serial.print (i); Serial.print (","); Serial.println (sqrt (S / k) / norm, 3); k = 0; }} ባዶነት loop (ባዶ) {}

ደረጃ 5: ሀሳቦችን መዝጋት

አዲሱ የ DAC ዲዛይን በመስመር እና በጩኸት ያሸንፋል ነገር ግን በመተላለፊያ ይዘት ላይ ያጣል። በማመልከቻዎ ላይ በመመስረት ከእነዚህ ጠቋሚዎች ውስጥ አንዱ ከሌላው የበለጠ አስፈላጊ ሊሆን ይችላል። በእነዚህ የሙከራ ሂደቶች አማካኝነት ያንን ውሳኔ በተጨባጭ መወሰን መቻል አለብዎት!

እንዲሁም ፣ እዚህ መጠቆም ተገቢ ይመስለኛል ምክንያቱም የ PWM ውፅዓት ዝቅተኛ ጫጫታ ስለሆነ ፣ በልዩ መስመራዊነት በ PWM ውፅዓት (ምናልባትም 16 ቢት ትክክለኛነት እንኳን) እጅግ የላቀ ጥራት ያለው DAC መገንባት መቻል አለበት። ያ የተወሰነ ሥራ ይወስዳል። እስከዚያ ድረስ እኔ አዲሱን እጠይቃለሁ!

የሚመከር: