/*
* 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
0 B
|👍
/👎
0 B
|👍
/👎