Arnemi icon

esp_adc_dac_isr_ino

Arnemi | PRO | 12/14/23 09:27:02 AM UTC | 0 ⭐ | 11406 👁️ | Never ⏰ | []
Arduino |

2.32 KB

|

None

|

0 👍

/

0 👎

/*
 * INFO:
 * This code demonstrates how to use the ESP32 DAC and ADC in an interrupt based configuration.
 * The code samples a signal with the ADC and converts the signal back to analog values with the DAC, 
 * allowing it to be processed digitally. 
 * 
 * The sampling frequency and resolution of the ADC and the DAC can be adjusted and experimented with
 *
 * Note: the ESP32 DAC has a fixed resolution of 8 bits, so the possibility for varying
 * DAC resolution is simulated by representing the desired resolution within an 8 bit range.
 */
 
// Variable for storing the timer properties. Leave it be.
hw_timer_t *timer = NULL;
 
//Change these parameters in order to change the sampling properties of the system
#define SAMPLING_PERIOD 50  //In microseconds, should be at least 50.
#define ADC_RESOLUTION 12   //Resolution of the ADC. Must be between 9 and 12 bits.
#define DAC_RESOLUTION 8    //Resolution of the DAC. Must be between 1 and 8 bits.
 
//Hardware configuration
#define ADC_PIN 27
#define DAC_PIN 26
 
/* 
 * Interrupt service routine that runs every with a period SAMPLING_PERIOD. 
 * Used for sampling, signal processing and digital to analog conversion.
 */
void ARDUINO_ISR_ATTR onTimer() {
  /*
   * Variables for storing the samples from the ADC and the sample to be written to the DAC.
   * Defined as
   */
  static int sampleADC;
  static int sampleDAC;
 
  //Sampling with the ADC from the ADC_PIN
  sampleADC = analogRead(ADC_PIN);
 
  //Changing the resolution of the ADC sample to the resolution of the DAC.
  sampleDAC = sampleADC >> ADC_RESOLUTION - DAC_RESOLUTION;
 
  //Your signal processing code here
  sampleDAC *= 1.2;
 
  //Using the DAC to convert and write the sampleDAC variable on DAC_PIN, while making sure the sample is 8 bits.
  dacWrite(DAC_PIN, (sampleDAC << 8 - DAC_RESOLUTION));
}
 
//--------The code below this point can be left alone--------
 
void setup() {
  // put your setup code here, to run once:
 
  analogReadResolution(ADC_RESOLUTION);
 
  //Initializing timer with 1Mhz frequency
  timer = timerBegin(1000000);
  timerAttachInterrupt(timer, &onTimer);
 
  //Call the onTimer function with the given period (in microseconds), repeating te timer and with unlimited count.
  timerAlarm(timer, SAMPLING_PERIOD, true, 0);
}
 
void loop() {
  //empty loop
}
 

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎