ARDUINO DUE DAC

Hola, eh estado trabajando con este código lo obtuve navegando por Internet, pero no tiene explicación, pido ayuda, me gustaría saber como obtener el dato de la frecuencia de salida del DAC del arduino DUE.

 /*
  Generador de forma de onda simple con Arduino Due

  * conecta dos botones a los pines digitales 2 y 3
    con una resistencia pulldown de 10 kilohm para elegir la forma
    de onda para enviar a los canales DAC0 y DAC1
  * conecta un potenciómetro de 10 kilohm a A0 para controlar la
    señal frecuencia
 */

#include "Waveforms.h"

#define oneHzSample 1000000/maxSamplesNum  // muestra para la señal de 1Hz expresada en microsegundos

const int button1 = 3;
volatile int wave0 = 0, wave1 = 0;

int i = 0;
int sample;
float k;

void setup() {
   ADC->ADC_MR = 0x10310100;
  analogWriteResolution(12);  // establece la resolución de salida analógica en 12 bits (4096 niveles)
  analogReadResolution(12);   // // establece la resolución de entrada analógica en 12 bits

  attachInterrupt(button1, wave1Select, RISING); // Interrupción conectada al botón conectado al pin 3
}

void loop() {
// Lee el potenciómetro y mapea el valor entre la muestra máxima y mínima disponible
  // 1 Hz es la frecuencia mínima para la onda completa
  // Medido considerando el loop y el tiempo de lectura analogica.
 //Measured considering the loop and the analogRead() time

  k = analogRead(A2);
  k = k/4095;                                         
  sample = map(analogRead(A0), 0, 4095, 0, oneHzSample);
  sample = constrain(sample, 0, oneHzSample);

  analogWrite(DAC1, int (k*waveformsTable[wave1][i]));  // escribe la forma de onda seleccionada en DAC1

  i++;
  if(i == maxSamplesNum)  // Restablece el contador para repetir la onda
    i = 0;
 delayMicroseconds(80000/sample);  // Mantenga el valor de muestra para el tiempo de muestra
}


// función conectada a la interrupción en el pin digital 3
void wave1Select() {
  wave1++;
  if(wave1 == 4)
    wave1 = 0;
}

Esta es la siguiente pagina del código:

#ifndef _Waveforms_h_
#define _Waveforms_h_

#define maxWaveform 4
#define maxSamplesNum 120

static int waveformsTable[maxWaveform][maxSamplesNum] = {
  // Sin wave
  {
    0x7ff, 0x86a, 0x8d5, 0x93f, 0x9a9, 0xa11, 0xa78, 0xadd, 0xb40, 0xba1,
    0xbff, 0xc5a, 0xcb2, 0xd08, 0xd59, 0xda7, 0xdf1, 0xe36, 0xe77, 0xeb4,
    0xeec, 0xf1f, 0xf4d, 0xf77, 0xf9a, 0xfb9, 0xfd2, 0xfe5, 0xff3, 0xffc,
    0xfff, 0xffc, 0xff3, 0xfe5, 0xfd2, 0xfb9, 0xf9a, 0xf77, 0xf4d, 0xf1f,
    0xeec, 0xeb4, 0xe77, 0xe36, 0xdf1, 0xda7, 0xd59, 0xd08, 0xcb2, 0xc5a,
    0xbff, 0xba1, 0xb40, 0xadd, 0xa78, 0xa11, 0x9a9, 0x93f, 0x8d5, 0x86a,
    0x7ff, 0x794, 0x729, 0x6bf, 0x655, 0x5ed, 0x586, 0x521, 0x4be, 0x45d,
    0x3ff, 0x3a4, 0x34c, 0x2f6, 0x2a5, 0x257, 0x20d, 0x1c8, 0x187, 0x14a,
    0x112, 0xdf, 0xb1, 0x87, 0x64, 0x45, 0x2c, 0x19, 0xb, 0x2,
    0x0, 0x2, 0xb, 0x19, 0x2c, 0x45, 0x64, 0x87, 0xb1, 0xdf,
    0x112, 0x14a, 0x187, 0x1c8, 0x20d, 0x257, 0x2a5, 0x2f6, 0x34c, 0x3a4,
    0x3ff, 0x45d, 0x4be, 0x521, 0x586, 0x5ed, 0x655, 0x6bf, 0x729, 0x794
  }
  ,

  // Triangular wave
  {
    0x44, 0x88, 0xcc, 0x110, 0x154, 0x198, 0x1dc, 0x220, 0x264, 0x2a8,
    0x2ec, 0x330, 0x374, 0x3b8, 0x3fc, 0x440, 0x484, 0x4c8, 0x50c, 0x550,
    0x594, 0x5d8, 0x61c, 0x660, 0x6a4, 0x6e8, 0x72c, 0x770, 0x7b4, 0x7f8,
    0x83c, 0x880, 0x8c4, 0x908, 0x94c, 0x990, 0x9d4, 0xa18, 0xa5c, 0xaa0,
    0xae4, 0xb28, 0xb6c, 0xbb0, 0xbf4, 0xc38, 0xc7c, 0xcc0, 0xd04, 0xd48,
    0xd8c, 0xdd0, 0xe14, 0xe58, 0xe9c, 0xee0, 0xf24, 0xf68, 0xfac, 0xff0,
    0xfac, 0xf68, 0xf24, 0xee0, 0xe9c, 0xe58, 0xe14, 0xdd0, 0xd8c, 0xd48,
    0xd04, 0xcc0, 0xc7c, 0xc38, 0xbf4, 0xbb0, 0xb6c, 0xb28, 0xae4, 0xaa0,
    0xa5c, 0xa18, 0x9d4, 0x990, 0x94c, 0x908, 0x8c4, 0x880, 0x83c, 0x7f8,
    0x7b4, 0x770, 0x72c, 0x6e8, 0x6a4, 0x660, 0x61c, 0x5d8, 0x594, 0x550,
    0x50c, 0x4c8, 0x484, 0x440, 0x3fc, 0x3b8, 0x374, 0x330, 0x2ec, 0x2a8,
    0x264, 0x220, 0x1dc, 0x198, 0x154, 0x110, 0xcc, 0x88, 0x44, 0x0
  }
  ,

  // Sawtooth wave
  {
    0x22, 0x44, 0x66, 0x88, 0xaa, 0xcc, 0xee, 0x110, 0x132, 0x154,
    0x176, 0x198, 0x1ba, 0x1dc, 0x1fe, 0x220, 0x242, 0x264, 0x286, 0x2a8,
    0x2ca, 0x2ec, 0x30e, 0x330, 0x352, 0x374, 0x396, 0x3b8, 0x3da, 0x3fc,
    0x41e, 0x440, 0x462, 0x484, 0x4a6, 0x4c8, 0x4ea, 0x50c, 0x52e, 0x550,
    0x572, 0x594, 0x5b6, 0x5d8, 0x5fa, 0x61c, 0x63e, 0x660, 0x682, 0x6a4,
    0x6c6, 0x6e8, 0x70a, 0x72c, 0x74e, 0x770, 0x792, 0x7b4, 0x7d6, 0x7f8,
    0x81a, 0x83c, 0x85e, 0x880, 0x8a2, 0x8c4, 0x8e6, 0x908, 0x92a, 0x94c,
    0x96e, 0x990, 0x9b2, 0x9d4, 0x9f6, 0xa18, 0xa3a, 0xa5c, 0xa7e, 0xaa0,
    0xac2, 0xae4, 0xb06, 0xb28, 0xb4a, 0xb6c, 0xb8e, 0xbb0, 0xbd2, 0xbf4,
    0xc16, 0xc38, 0xc5a, 0xc7c, 0xc9e, 0xcc0, 0xce2, 0xd04, 0xd26, 0xd48,
    0xd6a, 0xd8c, 0xdae, 0xdd0, 0xdf2, 0xe14, 0xe36, 0xe58, 0xe7a, 0xe9c,
    0xebe, 0xee0, 0xf02, 0xf24, 0xf46, 0xf68, 0xf8a, 0xfac, 0xfce, 0xff0
  }
  ,

  // Square wave
  {
    0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
    0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
    0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
    0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
    0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
    0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
  }

};

#endif

efra1905:
Hello, I have been working with this code, I got it browsing the Internet, but it has no explanation

Looks like the code has lots of comments.
If you want to know what the individual instructions do, Google is quite good. e.g.

Google: "Arduino map reference" first hit

https://www.arduino.cc/reference/en/language/functions/math/map/

efra1905:
I would like to know how to obtain the data of the output frequency of the DAC of the arduino DUE.

I attached an oscilloscope and looked at the signal (pretty :slight_smile: ). I suspect you have one, otherwise why would you try to create the signals.

If you could be a little be more specific, maybe I can help you find the answer you are looking for.

Hola Klaus_K muchas gracias por tu respuesta ahora comprendo mejor el código.

Estoy trabajando con Arduino DUE y las ondas se ven bastante bien en el osciloscopio, el problema que encuentro ahora es, que intenté poner una pantalla LCD donde me mostrara el tipo de onda y la frecuencia, solo que al ingresar el código extra, disminuye bastante la frecuencia de mis señales y me gustaría que mi frecuencia fuera hasta los 10000 Hz :slight_smile:

Este es mi nuevo codigo

/*
  Generador de forma de onda simple con Arduino Due
 */

#include "Waveforms.h"  //Incluir pestaña de matrices
#include<Wire.h>        //Incluir librerias  
#include<LiquidCrystal_I2C.h> //Incluir librerias 

#define oneHzSample 1000000/(mult*maxSamplesNum) //Define la Constante OneHzSample
/*#Define "Nombre de la constante a definir" "valor"*/
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27,20,4); // Define el ramaño de la pntalla LCD

const int button1 = 3;
volatile int  wave1 = 0;
float Frec;
double mult;
int i = 0;
int sample;
float k;
String Sen;

void setup() {
   ADC->ADC_MR = 0x10310100;
  LCD.init();    //Inicializa la pantalla
  LCD.backlight();  // Enciende luz de pantalla
  LCD.setCursor(0,0);
  LCD.print("TIPO DE ONDA");
  LCD.setCursor(0,2);
  LCD.print("FRECUENCIA");                              

  analogWriteResolution(12);  // establece la resolución de salida analógica en 12 bits (4096 niveles)
  analogReadResolution(12);   // // establece la resolución de entrada analógica en 12 bits

  attachInterrupt(button1, wave1Select, RISING); // Interrupción conectada al botón conectado al pin 3
}

void loop() {
// Lee el potenciómetro y mapea el valor entre la muestra máxima y mínima disponible
//  edido considerando el loop y el tiempo de lectura analogica.
/* El período de la señal está dado por la frecuencia de muestreo multiplicada por el número de muestras
Teniendo en cuenta el tiempo de ejecución de las instrucciones y sumando el tiempo de la entrada analógica
(alrededor de 40 µS para leer el potenciómetro)
*/
  mult = 1;
  k = analogRead(A1); // 
  k = k/4095;                                   
  sample = map(analogRead(A0), 0, 4095, 0, oneHzSample); // Mapeo 
  sample = constrain(sample, 0, oneHzSample);// Restriccion de valores para sample desde Cero a oneHzSample
  analogWrite(DAC1, int (k*waveformsTable[wave1][i]));  // escribe la forma de onda seleccionada en DAC1
  i++;
    if(i == maxSamplesNum)  // Restablece el contador para repetir la onda
      i = 0;

//*******Escribir en la pantalla el tipo de onda******//
   if (wave1 == 0)
        Sen = "Senoidal        ";
   if (wave1 == 1)
        Sen = "Triangular      ";
   if (wave1 == 2)
        Sen = "Diente de sierra";
   if (wave1 == 3)
        Sen = "Cuadrada        ";
  LCD.setCursor(0,1);
  LCD.print(Sen);
  
  delayMicroseconds(8000/sample);  // Mantenga el valor de muestra para el tiempo de muestra
}


// función conectada a la interrupción en el pin digital 3
void wave1Select() {
  wave1++;
  if(wave1 == 4)
    wave1 = 0;
}

You need to have a look at the following example

File -> Examples -> 02.Digital -> BlinkWithoutDelay

This will teach you how to execute functions periodically without using the delay function. The delay() function just wastes processing cycles. The goal is to execute the loop as often as possible. Every time you run trough loop you do just little things and move on. You never stop for anything.

For the LCD you need to ensure you only send something to the LCD when the information changes. The LCD is connected trough I2C which is very slow. You may need to test each of the LCD functions you use to find out how much time they need and whether they stop the loop function from running (this is called blocking code). If that is the case you may need to send the characters one by one and not printing strings.