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

 

 

Tags:
About Author: USER_4