یکی از پریفرال های کاربردی ماژول های 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]);
}

