Go Down

Topic: ADC y DAC mediante protocolo SPI (Read 300 times) previous topic - next topic

Ing-Apok

Que tal, desde hace tiempo me encuentro desarrollando un DSP para control de señales EEG por medio de un micro ATmega2560, inicialmente desarrollé un PCB con este micro y con conexiones para acoplar un ADC y un DAC externos de 12 bits, todo bien hasta ahí. Después desarrollé los códigos para probar el ADC y DAC individualmente mediante el protocolo SPI, lo cual de esa manera si funcionó a la perfección. Sin embargo, al momento de combinar las funcionalidades de ambos módulos en un solo programa (que haga ambas conversiones) me topo con el detalle que solo me funciona bien el ADC, ya que el DAC manda señales de muy baja tensión y no cambia con los valores del ADC.

A grandes rasgos lo que hace mi código es activar el selector esclavo del ADC para tomar lectura digital de la señal, posteriormente convertirla a un valor de tensión para comparar valores con los reales. Después activo el selector esclavo del DAC y tomo el valor digital obtenido y lo transfiero al DAC (haciendo impresiones en el monitor serial para verificar los datos que se están transfiriendo) sin embargo el DAC no arroja la señal analógica deseada, de hecho no sobrepasa los 350mV.


 Le he dado muchas vueltas al asunto y no logro determinar donde está el problema, he usado librerías, creado las propias y hecho las conversiones directamente dándome el mismo resultado. Necesito ayuda para orientarme y poder trabajar con ambos módulos al mismo tiempo.

Dejo a continuación uno de mis códigos de prueba

Code: [Select]
#include "SPI.h"

#define CS_in 10
#define CS_out 9
#define Baudios 115200
#define VelMax 16000000

int volt=2;
float conversion1=2.0;
int conversion2 =2;
int valBin;
byte dataBin[3];
SPISettings Obj_SPI(VelMax,MSBFIRST, SPI_MODE0);



void setup() {
  Serial.begin(Baudios);
  pinMode(CS_in, OUTPUT);
  pinMode(CS_out, OUTPUT);
  SPI.begin();
  //SPI.setDataMode(SPI_MODE0);
  SPI.setClockDivider(SPI_CLOCK_DIV16);

}

void loop() {
  SPI.beginTransaction(Obj_SPI);
  digitalWrite(CS_in, LOW);
  delayMicroseconds(20);
  for(int i=0; i<2; i++){
      dataBin[i] = SPI.transfer(0);
      delayMicroseconds(20);
  }
  digitalWrite(CS_in,HIGH);
  SPI.endTransaction();
  delayMicroseconds(2000);
  valBin = dataBin[1];
  valBin = (dataBin[0] << 8);
  volt = ((float)valBin*1.220703125);
  Serial.print("datos por Bytes: \t");
  for (int i=0;i<2;i=i+1) // Send in serial monitor
  {
    Serial.print("i");
    Serial.print(i);
    Serial.print("=");
    Serial.print(dataBin[i]);
    Serial.print('\t'); // tabulation
  }
  Serial.println("");
  Serial.print("voltaje reciibdo: ");
  Serial.println(volt);
  conversion1=(float)volt/5000;
  conversion2 =(float)conversion1*4095;
 
  SPI.beginTransaction(Obj_SPI);
  digitalWrite(CS_out, LOW);
  delayMicroseconds(20);
  SPI.transfer(&valBin,sizeof(valBin));
  Serial.print("esto mando al transfer: ");
  Serial.println(conversion2);
  //Serial.print("su direccion en memoria: ");
  //Serial.println(&valBin);
  Serial.print("tamaño de valbin: ");
  Serial.println(sizeof(valBin));
  digitalWrite(CS_out,HIGH);
  SPI.endTransaction();
  delay(1000);
 
}

surbyte

Quote
me topo con el detalle que solo me funciona bien el ADC, ya que el DAC manda señales de muy baja tensión y no cambia con los valores del ADC.
Todo muy lindo pero: no dices que ADC ni que DAC usas.
No muestras el esquema de conexiones.

Es dificil responderte pq solo llega a 350mV.

Tampoco dices si probaste el DAC solo y si supera los 350mV.

Go Up