Generador de señales mediante RAM y DAC

Hola, buena tarde comunidad, esperando que se encuentren bien.

Verán, estoy realizando una práctica de generar señales con microcontrolador, usando la memoria RAM 6116 y un convertidor digital-analógico DAC0800, ahorita estoy con la triangular, sin embargo en el diseño de mi circuito al momento de correrlo en mi osciloscopio me da una señal no deseada, ya revisé las conexiones, así como las hojas de datos e incluso el calculo para generar la onda al grabar los bits en Arduino, pero sigue sin darme la señal.

Espero que alguien tenga la oportunidad de contestarme.

Anexo Circuito en Proteus y Programa de Arduino.
 

Adjuntos

  • Generador de señal triangular.rar
    142.4 KB · Visitas: 4
Mmmmmmm

No sería mejor guardar la forma de onda en bits en la memoria interna del Arduino y ejecutar directamente con el Arduino ?
Y
pruebas de momento con un DAC R2R para ver que la señal sale bien y ya después te peleas con el DAC.
 
mmmmmmm

no seria mejor guardar la forma de onda en bits en la memoria interna del arduino y ejecutar directamente con el arduino
y pruebas de momento con un DAC R2R para ver que la señal sale bien y ya después te peleas con el DAC.
Totalmente posible. Alguna vez lo he hecho, y si la frecuencia no es muy alta, no hace falta complicarse con interrupciones ni nada "raro".

Saludos cordiales,
Aitopes.
 
Arduino, 6116, DAC, algo sobra en esa ecuación.
A mi me sobra la RAM no alcanzo a imaginar su función. Si me apuras me sobra también el DAC.


Si es triangular o diente de sierra tan solo hay que hacer un contador por programa.

Si es una senoidal, entonces no niego que una tabla lookup puede venir muy bien para obtener frecuencias elevadas.
 
Yo
Arduino, 6116, DAC, algo sobra en esa ecuación.
A mi me sobra la RAM no alcanzo a imaginar su función. Si me apuras me sobra también el DAC.


Si es triangular o diente de sierra tan solo hay que hacer un contador por programa.

Si es una senoidal, entonces no niego que una tabla lookup puede venir muy bien para obtener frecuencias elevadas.
La memoria será para almacenar muchas formas de onda, supongo.
El dac que yo use era de 5bits, y las ondas se veian bastante bien en el osciloscopio. No se si tengo alguna captura..... :(

Saludos cordiales,
Aitopes.
No...Solo tengo foto del "DAC" R2R:

WhatsApp Image 2021-11-23 at 4.13.55 PM.jpegWhatsApp Image 2021-11-23 at 4.13.49 PM.jpeg
 
Última edición:
Ya me imagino que la ram es para almacenar formas de onda pero no le veo mucho sentido para triangular o diente de sierra.
Cuando yo era joven propuse el uso de un DAC de 8 bits y me dijeron que no que mínimo 10 bits para cosas serias.

Usé un DAC SPI de 120 bits y dos canales, no recuerdo la referencia.
 

Dr. Zoidberg

Well-known-Papá Pitufo
Vaaamoosssss...que use el buscador!!!!



 
Hola, buena tarde comunidad, esperando que se encuentren bien.

Verán, estoy realizando una práctica de generar señales con microcontrolador, usando la memoria RAM 6116 y un convertidor digital-analógico DAC0800, ahorita estoy con la triangular, sin embargo en el diseño de mi circuito al momento de correrlo en mi osciloscopio me da una señal no deseada, ya revisé las conexiones, así como las hojas de datos e incluso el calculo para generar la onda al grabar los bits en Arduino, pero sigue sin darme la señal.

Espero que alguien tenga la oportunidad de contestarme.

Anexo Circuito en Proteus y Programa de Arduino.
¿Practica de que, para que ? la 6116 es una memoria ya vieja, se la usaba mucho en los 80/90 incluso para electrocardiógrafos portátiles con unidad de reanimación de 400 joule . Si es para aprender OK, pero le juro que si sirve, aunque yo lo acomodaría a 16 bits. ¿Tiene una imagen de como se ve su triangular? no tengo el PROTEUS ese, pero un gráfico podría ayudar a ver que esta mal
 
Esto es el resultado de la forma de onda usando el DAC interno del ESP32:

WhatsApp Image 2021-11-23 at 5.46.43 PM.jpeg

WhatsApp Image 2021-11-23 at 5.46.32 PM.jpeg
WhatsApp Image 2021-11-23 at 5.46.41 PM.jpeg
Y esta, salvo que me equivoque, son fotos que saque del DAC con el Arduino Nano. No es una onda como para tirar cohetes, pero....



WhatsApp Image 2021-11-23 at 5.46.44 PM.jpeg
WhatsApp Image 2021-11-23 at 5.46.44 PM (1).jpegWhatsApp Image 2021-11-23 at 5.46.45 PM.jpeg
 
Esto es el resultado de la forma de onda usando el DAC interno del ESP32:

Ver el archivo adjunto 274700

Ver el archivo adjunto 274699
Ver el archivo adjunto 274691
Y esta, salvo que me equivoque, son fotos que saque del DAC con el Arduino Nano. No es una onda como para tirar cohetes, pero....



Ver el archivo adjunto 274696
Ver el archivo adjunto 274695Ver el archivo adjunto 274693
Bueno, la triangular tiene unos 8 escalones, si esta usando 8 bits (255) , el que hace la cuenta en su circuito, esta aumentando de a 32 por paso, es asi de fácil. :rolleyes: Si quiere 255 escalones tiene que partir de cero y en cada ejemplo aumentar un bit....alguien no lo está haciendo me temo
 
El ESP32 y el arduino DUE tienen DAC incorporado, ambos tienen dos canales. El resto de arduinos no que yo sepa, habría que hacer PWM y filtrar lo cual reduce mucho el ancho de banda.
El del DUE creo recordar que es de 12 bits, el del ESP 32 no me acuerdo, lo usé para generar senoidal y no iba mal, no.
 
Bueno, la triangular tiene unos 8 escalones, si esta usando 8 bits (255) , el que hace la cuenta en su circuito, esta aumentando de a 32 por paso, es asi de fácil. :rolleyes: Si quiere 255 escalones tiene que partir de cero y en cada ejemplo aumentar un bit....alguien no lo está haciendo me temo
Si, tienes razon...esa forma de onda con 8 escalones
El ESP32 y el arduino DUE tienen DAC incorporado, ambos tienen dos canales. El resto de arduinos no que yo sepa, habría que hacer PWM y filtrar lo cual reduce mucho el ancho de banda.
El del DUE creo recordar que es de 12 bits, el del ESP 32 no me acuerdo, lo usé para generar senoidal y no iba mal, no.
El ESP es el que he usado. Si, dos canales de 8 bits.
Es tán simple como hacer esto:

C++:
void setup() {
}

void loop() {
  for (int deg = 0; deg < 360; deg = deg + 1){
    dacWrite(25, int(128 + 127 * (sin (deg*PI/180))));
    dacWrite(26, int(128 + 127 * (sin (deg*PI*4/180))));
  }
}

Y obtienes esto:
whatsapp-image-2021-11-23-at-5-46-32-pm-jpeg.274699

Luego puedes empezar a "jugar" para obtener otras frecuencias o formas de onda. Esto puede darte alguna idea:
C++:
#define Num_Samples  112
#define MaxWaveTypes 4

int i = 0;

static byte WaveFormTable[MaxWaveTypes][Num_Samples] = {
   // Sin wave
   {
    0x80, 0x83, 0x87, 0x8A, 0x8E, 0x91, 0x95, 0x98, 0x9B, 0x9E, 0xA2, 0xA5, 0xA7, 0xAA, 0xAD, 0xAF,
    0xB2, 0xB4, 0xB6, 0xB8, 0xB9, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xBF, 0xBF, 0xC0, 0xBF, 0xBF, 0xBF,
    0xBE, 0xBD, 0xBC, 0xBB, 0xB9, 0xB8, 0xB6, 0xB4, 0xB2, 0xAF, 0xAD, 0xAA, 0xA7, 0xA5, 0xA2, 0x9E,
    0x9B, 0x98, 0x95, 0x91, 0x8E, 0x8A, 0x87, 0x83, 0x80, 0x7C, 0x78, 0x75, 0x71, 0x6E, 0x6A, 0x67,
    0x64, 0x61, 0x5D, 0x5A, 0x58, 0x55, 0x52, 0x50, 0x4D, 0x4B, 0x49, 0x47, 0x46, 0x44, 0x43, 0x42,
    0x41, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x42, 0x43, 0x44, 0x46, 0x47, 0x49, 0x4B,
    0x4D, 0x50, 0x52, 0x55, 0x58, 0x5A, 0x5D, 0x61, 0x64, 0x67, 0x6A, 0x6E, 0x71, 0x75, 0x78, 0x7C
   },
   // Triangular wave
   {
     0x80, 0x84, 0x89, 0x8D, 0x92, 0x96, 0x9B, 0x9F, 0xA4, 0xA8, 0xAD, 0xB2, 0xB6, 0xBB, 0xBF, 0xC4,
     0xC8, 0xCD, 0xD1, 0xD6, 0xDB, 0xDF, 0xE4, 0xE8, 0xED, 0xF1, 0xF6, 0xFA, 0xFF, 0xFA, 0xF6, 0xF1,
     0xED, 0xE8, 0xE4, 0xDF, 0xDB, 0xD6, 0xD1, 0xCD, 0xC8, 0xC4, 0xBF, 0xBB, 0xB6, 0xB2, 0xAD, 0xA8,
     0xA4, 0x9F, 0x9B, 0x96, 0x92, 0x8D, 0x89, 0x84, 0x7F, 0x7B, 0x76, 0x72, 0x6D, 0x69, 0x64, 0x60,
     0x5B, 0x57, 0x52, 0x4D, 0x49, 0x44, 0x40, 0x3B, 0x37, 0x32, 0x2E, 0x29, 0x24, 0x20, 0x1B, 0x17,
     0x12, 0x0E, 0x09, 0x05, 0x00, 0x05, 0x09, 0x0E, 0x12, 0x17, 0x1B, 0x20, 0x24, 0x29, 0x2E, 0x32,
     0x37, 0x3B, 0x40, 0x44, 0x49, 0x4D, 0x52, 0x57, 0x5B, 0x60, 0x64, 0x69, 0x6D, 0x72, 0x76, 0x7B
  },
   // Sawtooth wave
   {
     0x00, 0x02, 0x04, 0x06, 0x09, 0x0B, 0x0D, 0x10, 0x12, 0x14, 0x16, 0x19, 0x1B, 0x1D, 0x20, 0x22,
     0x24, 0x27, 0x29, 0x2B, 0x2D, 0x30, 0x32, 0x34, 0x37, 0x39, 0x3B, 0x3E, 0x40, 0x42, 0x44, 0x47,
     0x49, 0x4B, 0x4E, 0x50, 0x52, 0x54, 0x57, 0x59, 0x5B, 0x5E, 0x60, 0x62, 0x65, 0x67, 0x69, 0x6B,
     0x6E, 0x70, 0x72, 0x75, 0x77, 0x79, 0x7C, 0x7E, 0x80, 0x82, 0x85, 0x87, 0x89, 0x8C, 0x8E, 0x90,
     0x93, 0x95, 0x97, 0x99, 0x9C, 0x9E, 0xA0, 0xA3, 0xA5, 0xA7, 0xA9, 0xAC, 0xAE, 0xB0, 0xB3, 0xB5,
     0xB7, 0xBA, 0xBC, 0xBE, 0xC0, 0xC3, 0xC5, 0xC7, 0xCA, 0xCC, 0xCE, 0xD1, 0xD3, 0xD5, 0xD7, 0xDA,
     0xDC, 0xDE, 0xE1, 0xE3, 0xE5, 0xE8, 0xEA, 0xEC, 0xEE, 0xF1, 0xF3, 0xF5, 0xF8, 0xFA, 0xFC, 0xFE
   },
   // Square wave
   {
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
   }
};

void setup()
{
  //Serial.begin(115200);
}

//TESTE SEM POSICIONAMENTO (MAIOR FREQUENCIA)
/*
void loop()
{
  dacWrite(25, 0xff); //25 ou 26
  dacWrite(25, 0x00); //25 ou 26
  //delayMicroseconds(10);
}
*/

//TESTE COM POSICIONAMENTO (MENOR FREQUENCIA)
void loop()
{
 
  byte wave_type = 0; // Sine
  //byte wave_type = 1; // Triangle
  //byte wave_type = 2; // Sawtooth
  //byte wave_type = 3; // Square
 
  dacWrite(25, WaveFormTable[wave_type][i]); //25 ou 26
  i = i + 1;
 
  if (i >= Num_Samples)
  i = 0;
    
}
(Ese código no es mio, pero lo he probado y funciona)
 
Última edición:
Ya pero a los demás nos apetece hablar de DACs en Arduino y similares.

Creo que los ADCs del DUE son de 10 bits mientras que los DACs son de 12 bits
La pega de los DACS es que creo recordar que llegan solo a 2,8V o por ahí, no llegan a los 3V3
 
Muchas gracias a todos por sus aportaciones!

Sí fue para una practica de dispositivos digitales y descubrí el error: la mala conexión de la DAC, más aparte los bits de grabado en cada localidad que está en el código no eran correctos, por lo que tuve que corregirlos desde la tabla excel para volver a formar la onda y reescribirlos en el código de Arduino. Al final sí logré generar la señal triangular y otras como diente de sierra y senoidal, la señal no fue perfecta, y hay mucho ruido, pero salió después de todo xd

Ahora el verdadero reto es ver si queda en armado físico jejeje

Saludos y excelente día!! :)

1.jpeg
 
¿Hay ruido en el simulador?
Eso no es ruido, es mala programación. Los simuladores no tienen ruido.

¿Ves? Voy a contradecir mi dogma, acabo de encontrar un caso en el que es mejor simular, si sale "ruido" es que está mal el diseño.

Es muy absurdo hacer una tabla para un número que se incrementa 1 a 1, para la del seno si que haría un cuadrante de tabla para los cuatro cuadrantes y listo.
 
Arriba