یکی از پریفرال های کاربردی ماژول های ESP32 ، واحد DAC می باشد . DAC قادر می تواند مقادیر دیجیتالی را به سیگنال های آنالوگ تبدیل کند . در ESP32 دو واحد DAC با دقت 8 بیت وجود دارد که هر کدام از این واحد های م یتوانند مقادیر 0 تا 3.3 ولت را بسازند . با تقسیم 3.3 ولت بر 255 می توان دریافت که به ازای هر رقم افزایش ورودی ، خروجی DAC به اندازه 0.013 ولت تغییر خواهد کرد . واحد DAC کاربرد های فراوانی دارد . می توانید از آن برای ایجاد سیگنال های صوتی و یا PAL استفاده کنید . همچنین dac امکان ساخت شکل موج های مختلف را به شما می دهد . در این آموزش به نحوه راه اندازی این واحد در آردوینو IDE خواهیم پرداخت . خوشبختانه با وجود SDK های آردوینو IDE برای ESP32 و کابخانه های متنوع ، نیازی به استفاد مستقیم از API های ESP32 برای راه اندازی قسمت های مختلف آن ندارید . از طریق توابع آماده ای که در کتابخانه های وجود دارند می توانید واحد DAC را راه اندازی کنید (بدون نیاز به کانفیگ های پیچده توسط API ها ) .
از تابع زیر برای راه اندازی DAC استفاده کی شود :
dacWrite(DAC_num, Value);
DAC_num واحد DAC می باشد که می خواهید آن را راه اندازی کنید . ماژول ESP32 دارای دو واحد DAC1 و DAC2 می باشند . بجای DAC_num باید DAC1 یا DAC2 قرار بگیرد .
Value نیز مقداری بین 0 تا 255 است که سیگنال آنالوگ منطبق با آن در خروجی قرار می گیرد .
خروجی DAC1 پین GPIO25 و DAC2 پین GPIO26 می باشد .
در برنامه زیر یک موج سینوسی بر روی پین GPIO25 تولید می شود :
// Create a sine wave on an oscilloscope using a 8 bit DAC // (C) XTronical 2018 // Use in any way you wish! // // As we're using an 8 bit value for the DAC 0-255 (256 parts) that means for us // there are 256 'bits' to a complete circle not 360 (as in degrees) or even 2PI Radians // (There are 2*PI Radians in a circle and computers love to work in Radians!) // The computer works in radians for SIN, COSINE etc. so we must convert our 0 -255 value // to radians, the comments in the code show this. int SineValues[256]; // an array to store our values for sine void setup() { float ConversionFactor=(2*PI)/256; // convert my 0-255 bits in a circle to radians // there are 2 x PI radians in a circle hence the 2*PI // Then divide by 256 to get the value in radians // for one of my 0-255 bits. float RadAngle; // Angle in Radians // calculate sine values for(int MyAngle=0;MyAngle<256;MyAngle++) { RadAngle=MyAngle*ConversionFactor; // 8 bit angle converted to radians SineValues[MyAngle]=(sin(RadAngle)*127)+128; // get the sine of this angle and 'shift' up so // there are no negative values in the data // as the DAC does not understand them and would // convert to positive values. } } void loop() { for(int i=0;i<256;i++) dacWrite(25,SineValues[i]); }