সুচিপত্র:
- সরবরাহ
- ধাপ 1: ব্রেডবোর্ড রাখা
- ধাপ 2: নয়েজ লেভেলে সিগন্যাল মূল্যায়ন করুন
- ধাপ 3: ইন্টিগ্রাল নন -লিনিয়ারিটি এবং ডিফারেনশিয়াল নন -লিনিয়ারিটি
- ধাপ 4: ব্যান্ডউইথ
- ধাপ 5: চিন্তাভাবনা বন্ধ করা
ভিডিও: ESP32: 5 টি ধাপের সাহায্যে কীভাবে একটি ভাল DAC তৈরি এবং পরীক্ষা করবেন
2024 লেখক: John Day | [email protected]. সর্বশেষ পরিবর্তিত: 2024-01-30 07:57
ESP32 এর 2 8-বিট ডিজিটাল টু অ্যানালগ কনভার্টার (DACs) আছে। এই DAC গুলি আমাদের 8 বিট রেজোলিউশন সহ একটি নির্দিষ্ট পরিসরের (0-3.3V) মধ্যে নির্বিচারে ভোল্টেজ উৎপাদনের অনুমতি দেয়। এই নির্দেশনায়, আমি আপনাকে দেখাব কিভাবে একটি DAC তৈরি করতে হয় এবং এর কর্মক্ষমতা চিহ্নিত করার পাশাপাশি ESP32 DAC এর সাথে তুলনা করে। আমি যে পারফরম্যান্স সূচকগুলি দেখব তা অন্তর্ভুক্ত
- শব্দ স্তর
- ব্যান্ডউইথ
- অবিচ্ছেদ্য nonlinearity
- ডিফারেনশিয়াল nonlinearity
এই সূচকগুলি পরীক্ষা করার জন্য আমি ADS1115 ব্যবহার করব।
এটি লক্ষ্য করা গুরুত্বপূর্ণ যে এই সমস্ত সূচকের আপনার মূল্যায়ন শুধুমাত্র আপনার রেফারেন্স ডিভাইসের মতোই সঠিক হবে (এই ক্ষেত্রে ADS115)। উদাহরণস্বরূপ, ADS115 এর ভোল্টেজ অফসেট এবং লাভের ক্ষেত্রে 16-বিট স্পষ্টতা নেই। এই ত্রুটিগুলি 0.1%হিসাবে বড় হতে পারে। অনেক সিস্টেমের জন্য, এই ত্রুটিগুলি উপেক্ষা করা যেতে পারে যখন সম্পূর্ণ নির্ভুলতা সীমিত উদ্বেগের।
সরবরাহ
- ADS1115
- ESP32 বোর্ড
- রুটিবোর্ড
- জাম্পার তার
- 5 kOhm প্রতিরোধক
- 1 মাইক্রো-ফারাদ সিরামিক ক্যাপাসিটর
ধাপ 1: ব্রেডবোর্ড রাখা
নিচের পিনগুলোকে তারে লাগান
ESP32 এবং ADS1115 এর মধ্যে
3v3 ভিডিডি
GND GND
জিপিআইও 22 এসসিএল
জিপিআইও 21 এসডিএ
ADS1115 এ
ADDR GND (ADS115)
DAC তৈরি করা
DAC তৈরির অনেক উপায় আছে। সবচেয়ে সহজ হল একটি প্রতিরোধক এবং একটি ক্যাপাসিটরের সঙ্গে একটি PWM সংকেত কম পাস ফিল্টার করা। আমি এখানে একটি বাফার হিসাবে একটি অপ-amp যোগ করতে পারতাম কিন্তু জিনিসগুলি সহজ রাখতে চেয়েছিলাম। এই নকশাটি সহজ এবং সস্তা যে কোনো মাইক্রোকন্ট্রোলারের সাহায্যে যা PWM সমর্থন করে। আমি এখানে ডিজাইনের তত্ত্ব (গুগল পিডব্লিউএম ডিএসি) দিয়ে যাচ্ছি না।
শুধু GPIO255 KOhm রোধক 1 মাইক্রোফ্রেড ক্যাপাসিটর gnd সংযোগ করুন
এখন একটি বিন্দু থেকে একটি জাম্পার তার সংযুক্ত করুন যেখানে প্রতিরোধক ADS115 এ A0 এর সাথে ক্যাপাসিটরের সাথে মিলিত হয়।
ধাপ 2: নয়েজ লেভেলে সিগন্যাল মূল্যায়ন করুন
গোলমালের মাত্রা নির্ণয় করতে নিচের স্ক্রিপ্টটি চালান। এটি মূল্যায়ন করার জন্য আমরা কেবল একটি নির্দিষ্ট মূল্যে DAC ছেড়ে যাই এবং পরিমাপ করি কিভাবে সময়ের সাথে ভোল্টেজ দোলায়।
DAC এর ডিজাইনের কারণে, PWM সিগন্যাল 50% ডিউটি সাইকেলে হলে গোলমাল সবচেয়ে বেশি হবে। অতএব এখানেই আমরা এটি মূল্যায়ন করব। আমরা এই একই সংকেত স্তরে ESP32 মূল্যায়ন করব। আমরা একই কম পাস ফিল্টারের সাথে ESP32 DAC ফিল্টার করব যাতে পরিমাপ তুলনামূলক করা যায়।
আমার জন্য আউটপুট পরিষ্কার ছিল। PWM ডিজাইনে> 6dB ভাল SNR (এটি 2 গুণ ভাল) ছিল। নতুন DAC এর জন্য একটি স্পষ্ট জয়। একটি সামান্য বিভ্রান্তি হল যে এডিসিতে নির্মিত ফিল্টার রয়েছে যা নিশ্চিতভাবেই এসএনআরকে উন্নত করছে। তাই পরম মান ব্যাখ্যা করা কঠিন হতে পারে। যদি আমি সেকেন্ড-অর্ডার ফিল্টার ব্যবহার করতাম তবে এটি হবে না।
যাই হোক কোড নিচে দেওয়া হল
#অন্তর্ভুক্ত
#Adafruit_ADS1115 বিজ্ঞাপন অন্তর্ভুক্ত করুন; // adc int16_t adc0 এর জন্য adafruit গ্রন্থাগার; // অকার্যকর সেটআপ (অকার্যকর) {Serial.begin (115200); // সিরিয়াল ads.setGain শুরু করুন (GAIN_TWO); // 2x লাভ +/- 2.048V 1 বিট = 0.0625mV ads.begin (); // শুরু adc float M = 0; // প্রাথমিক গড় ভাসা এমপি = 0; // previouos মানে ভাসা S = 0; // প্রাথমিক বৈকল্পিক ভাসা SP = 0; // পূর্ববর্তী প্রকরণ const int reps = 500; // প্রতিস্থাপন সংখ্যা n = 256; // নমুনার সংখ্যা ledcSetup (0, 25000, 8); // সেট pwm frequecny = 25000 Hz 8 বিট রেজোলিউশনে ledcAttachPin (25, 0); // পিন 25 LEDcWrite (0, 128) এ pwm সেট করুন; // এটি অর্ধ ডিউটি চক্র সেট করুন (সবচেয়ে বড় শব্দ) বিলম্ব (3000); // ভাসমান সময় snrPWM [reps] নিষ্পত্তির জন্য অপেক্ষা করুন; // PWM ফ্লোট snrDAC [reps] এর জন্য snrs এর অ্যারে; // DAC- এর জন্য snrs এর অ্যারে = ads.readADC_SingleEnded (0); // M = Mp + (adc0 - Mp) / k পড়ুন; // গণনা রোলিং মানে এমপি = এম; // সেট আগের গড় S = Sp + (adc0 - Mp) * (adc0 - M); // গণনা ঘূর্ণায়মান বৈচিত্র Sp = S; // dB snrPWM = 20 * log10 (3.3 / (sqrt (S / n) *.0625 *.001)); // মান পুনরায় সেট করুন M = 0; এমপি = 0; এস = 0; এসপি = 0; } ledcDetachPin (25); // পিন 25 dacWrite (25, 128) থেকে PWM বিচ্ছিন্ন করুন; // DAC বিলম্ব (3000) লিখুন; // জন্য অপেক্ষা করার জন্য অপেক্ষা করুন); M = Mp + (adc0 - Mp) / k; এমপি = এম; S = Sp + (adc0 - Mp) * (adc0 - M); এসপি = এস; } snrDAC = 20 * log10 (3.3 / (sqrt (S / n) *.0625 *.001)); এম = 0; এমপি = 0; এস = 0; এসপি = 0; } // প্লট SNR গুলি এক গ্রাফে (int i = 1; i <reps; i ++) {Serial.print ("PWM_SNR (dB):"); সিরিয়াল.প্রিন্ট (snrPWM ); সিরিয়াল.প্রিন্ট (","); Serial.print ("ESP32_SNR (dB):"); Serial.println (snrDAC ); }} অকার্যকর লুপ (অকার্যকর) {}
ধাপ 3: ইন্টিগ্রাল নন -লিনিয়ারিটি এবং ডিফারেনশিয়াল নন -লিনিয়ারিটি
অবিচ্ছেদ্য nonlinearity আপনার DAC আউটপুট ভোল্টেজ এবং একটি সরলরেখার মধ্যে কতটা বিচ্যুতি আছে তার একটি পরিমাপ। এটি যত বড়, ততই খারাপ …
ডিফারেনশিয়াল নন -লিনিয়ারিটি হল একটি পরিমাপ যা মোটামুটিভাবে ভোল্টেজে পরিলক্ষিত পরিবর্তন (এক কোড থেকে পরের দিকে) একটি সরল রেখা থেকে যা প্রত্যাশিত হবে তা থেকে বিচ্যুত হয়।
এখানে ফলাফল সত্যিই আকর্ষণীয় ছিল। প্রথমত, উভয়েরই 0.5lsb এর কম ত্রুটি রয়েছে (8-বিট রেজোলিউশনে) যা ভাল কিন্তু PWM এর অনেক ভাল অবিচ্ছেদ্য লিনিয়ারিটি রয়েছে। উভয়েরই তুলনামূলক ডিফারেনশিয়াল নন -লিনিয়ারিটি আছে কিন্তু ESP32 DAC এর কিছু অদ্ভুত স্পাইক রয়েছে। আরো কি, PWM পদ্ধতিতে ত্রুটির কিছু কাঠামো আছে। মূলত এটি একটি বিকল্প ফ্যাশনে সঠিক ভোল্টেজকে ওভারশুট এবং আন্ডারশুট করে।
আমার সন্দেহ হল এটি একটি অদ্ভুত বৃত্তাকার ত্রুটি কিভাবে ESP32 এ 8-বিট PWM সংকেত তৈরি হয়।
এর জন্য সংশোধন করার একটি উপায় হল PWM এর সাথে দুটি সংলগ্ন কোডের (যেমন 128, 129) মধ্যে দ্রুত চক্র। একটি এনালগ লোপাস ফিল্টার দিয়ে, ফলে ত্রুটি গড় থেকে শূন্য হবে। আমি সফটওয়্যারে এটি অনুকরণ করেছি এবং প্রকৃতপক্ষে সমস্ত ত্রুটি অদৃশ্য হয়ে গেছে। এখন PWM পদ্ধতিতে রৈখিকতা রয়েছে যা 16-বিটের জন্য সঠিক!
ডাটা জেনারেট করার জন্য যে কোন কোড নিচে দেওয়া হল। আউটপুট.csv ফরম্যাটে সিরিয়াল মনিটরে থাকবে। আরও প্রক্রিয়াকরণের জন্য এটি কেবল একটি পাঠ্য ফাইলে অনুলিপি করুন।
#অন্তর্ভুক্ত
#Adafruit_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.println (adc0); }} অকার্যকর লুপ (অকার্যকর) {}
ধাপ 4: ব্যান্ডউইথ
আমি এখানে ব্যান্ডউইথ সংজ্ঞায়িত করতে যাচ্ছি যে ফ্রিকোয়েন্সিটিতে DAC এর আউটপুট 3dB কমে যায়। এটি একটি কনভেনশন এবং, একটি ডিগ্রী, নির্বিচারে। উদাহরণস্বরূপ, 6dB পয়েন্টে, DAC এখনও একটি সংকেত আউটপুট করবে এটি মাত্র ~ 50% প্রশস্ততা হবে।
এটি পরিমাপ করার জন্য আমরা কেবল ডিএসি থেকে এডিসিতে ক্রমবর্ধমান ফ্রিকোয়েন্সিতে সাইন ওয়েভ পাস করি এবং তাদের মান বিচ্যুতি পরিমাপ করি। আশ্চর্যজনকভাবে, 3dB পয়েন্ট 30Hz (1/(2*pi*5000*1e-6))।
ESP32 প্রতি সেকেন্ডে 1 মেগা নমুনা করতে পারে। এটি ESP32 এর জন্য একটি হ্যান্ডস ডাউন জয়। 100Hz ব্যান্ডউইথ পরীক্ষা অঞ্চলে এর প্রশস্ততা মোটেও ক্ষয় হয় না।
নীচের কোডটি PWM DAC ব্যান্ডউইথ পরীক্ষা করতে পারে।
#অন্তর্ভুক্ত
#Adafruit_ADS1115 বিজ্ঞাপন অন্তর্ভুক্ত করুন; / * 16-বিট সংস্করণের জন্য এটি ব্যবহার করুন */ int16_t adc0; int16_t adc1; void setup (void) {float M; ভাসমান এমপি = 0; ভাসা S = 0; ভাসমান এসপি = 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 = মিলিস (); এসপি = 0; এস = 0; এম = 0; এমপি = 0; int k = 1; ভাসা আদর্শ; যখন ((T - start) <1000) {int out = 24 * sin (2 * PI * i * (T - start) / 1000.0) + 128; ledcWrite (0, আউট); adc0 = ads.readADC_SingleEnded (0); M = Mp + (adc0 - Mp) / k; এমপি = এম; S = Sp + (adc0 - Mp) * (adc0 - M); এসপি = এস; টি = মিলিস (); k ++; } যদি (i == 1) {আদর্শ = sqrt (S / k); } সিরিয়াল.প্রিন্ট (i); সিরিয়াল.প্রিন্ট (","); Serial.println (sqrt (S / k) / আদর্শ, 3); k = 0; }} অকার্যকর লুপ (অকার্যকর) {}
এবং এই কোডটি ESP32 ব্যান্ডউইথ পরীক্ষা করবে। ক্যাপাসিটরের অপসারণ নিশ্চিত করুন অথবা ফলাফল উভয় পদ্ধতির জন্য একই হবে।
#অন্তর্ভুক্ত
#Adafruit_ADS1115 বিজ্ঞাপন অন্তর্ভুক্ত করুন; / * 16-বিট সংস্করণের জন্য এটি ব্যবহার করুন */ int16_t adc0; int16_t adc1; void setup (void) {float M; ভাসমান এমপি = 0; ভাসা S = 0; ভাসমান এসপি = 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 = মিলিস (); এসপি = 0; এস = 0; এম = 0; এমপি = 0; int k = 1; ভাসা আদর্শ; যখন ((T - start) <1000) {int out = 24 * sin (2 * PI * i * (T - start) / 1000.0) + 128; dacWrite (25, আউট); adc0 = ads.readADC_SingleEnded (0); M = Mp + (adc0 - Mp) / k; এমপি = এম; S = Sp + (adc0 - Mp) * (adc0 - M); এসপি = এস; টি = মিলিস (); k ++; } যদি (i == 1) {আদর্শ = sqrt (S / k); } সিরিয়াল.প্রিন্ট (i); সিরিয়াল.প্রিন্ট (","); Serial.println (sqrt (S / k) / আদর্শ, 3); k = 0; }} অকার্যকর লুপ (অকার্যকর) {}
ধাপ 5: চিন্তাভাবনা বন্ধ করা
নতুন DAC নকশা রৈখিকতা এবং শব্দে জিতেছে কিন্তু ব্যান্ডউইথের উপর হেরেছে। আপনার আবেদনের উপর নির্ভর করে এই সূচকের একটি অন্যটির চেয়ে বেশি গুরুত্বপূর্ণ হতে পারে। এই পরীক্ষার পদ্ধতির সাথে, আপনি বস্তুনিষ্ঠভাবে সেই সিদ্ধান্ত নিতে সক্ষম হবেন!
এছাড়াও, আমি মনে করি এটা এখানে উল্লেখ করা মূল্যবান যে, কারণ PWM আউটপুট কম শব্দ, ব্যতিক্রমী রৈখিকতার সাথে PWM আউটপুট (সম্ভবত 16-বিট নির্ভুলতা) সহ অনেক বেশি রেজোলিউশন DAC তৈরি করা সম্ভব। তাতে কিছু কাজ লাগবে। ততক্ষণ, আমি আপনাকে বিদায় জানাই!
প্রস্তাবিত:
কীভাবে একটি লিনাক্স বুট ড্রাইভ তৈরি করবেন (এবং এটি কীভাবে ব্যবহার করবেন): 10 টি ধাপ
কীভাবে একটি লিনাক্স বুট ড্রাইভ তৈরি করবেন (এবং এটি কীভাবে ব্যবহার করবেন): এটি লিনাক্স, বিশেষ করে উবুন্টুর সাথে কীভাবে শুরু করা যায় তার একটি সহজ ভূমিকা।
রাস্পবেরি পাই 4: 10 ধাপের সাথে কীভাবে একটি স্মার্ট আয়না তৈরি করবেন
কিভাবে রাস্পবেরি পাই 4 দিয়ে স্মার্ট মিরর তৈরি করবেন: এই গাইডে আমরা দেখতে পাবো কিভাবে পুনর্ব্যবহারযোগ্য টুকরা যেমন একটি ছবির ফ্রেম, একটি পুরনো মনিটর এবং একটি ছবির গ্লাস ব্যবহার করে স্মার্টমিরর তৈরি করা যায়। .com
অডুইনো বোর্ডের সাহায্যে কীভাবে একটি কার্যকরী ট্রাফিক লাইট তৈরি করবেন: 5 টি ধাপ
একটি অডুইনো বোর্ডের সাহায্যে কীভাবে একটি কার্যকরী ট্রাফিক লাইট তৈরি করা যায়: ট্রাফিক লাইটগুলি সাধারণভাবে ব্যবহৃত রাস্তার মোড়, পথচারী ক্রসিং এবং অন্যান্য স্থানগুলি ট্রাফিকের প্রবাহ নিয়ন্ত্রণের জন্য ব্যবহৃত হয়। একটি ম্যানুয়ালি চালিত গ্যাস-লাইট ট্রাফিক লাইট ছিল প্রথম ধরনের এবং প্রযুক্তির ব্যাপক উন্নতি হয়েছে
GiggleBot: 8 ধাপের সাহায্যে একটি লিডার-নির্দেশিত রোবট তৈরি করুন
গিগলবট দিয়ে একটি লিডার-গাইডেড রোবট তৈরি করুন: এই টিউটোরিয়ালে, আমরা একটি গোলকধাঁধার সমস্যাগুলি মোকাবেলার জন্য গিগলবট তৈরি করছি। আমরা GiggleBot- এ একটি সার্ভো মাউন্ট করছি যেখানে আমরা একটি দূরত্ব সেন্সর সংযুক্ত করি। চলার সময়, সার্ভোটি পিছনে পিছনে ঘুরতে যাচ্ছে যাতে দূরত্ব সেন্সর
ছবির গল্প 3:16 ধাপের সাহায্যে আপনার স্ন্যাপের একটি ডায়নামিক স্লাইডশো তৈরি করুন
ছবির গল্প 3 দিয়ে আপনার স্ন্যাপের একটি ডায়নামিক স্লাইডশো তৈরি করুন: এটি প্রধানত বিনামূল্যে সফটওয়্যার ব্যবহার করে প্যানিং এবং জুমিং ইফেক্ট সহ একটি চমৎকার.wmv ছবির স্লাইডশো তৈরি করার একটি উপায়। আমি আশা করি সহজ উপায় আছে, কিন্তু আমি এই বিষয়ে একটি নির্দেশযোগ্য খুঁজে পাইনি। আমার পদ্ধতি ঘরের চারপাশে কিছুটা ঘুরে, কিন্তু এটি কাজ করে