Página principal


ARDUINO - OSCILOSCOPIO 66K MUESTRAS


Quizás el título puede ser un poco pretencioso, mejor hubiera sido digitalizador de 66418 muestras/segundo.
La idea original la he sacado de:
 http://real2electronics.blogspot.com/2011/09/arduino-adc-muestreo-alta-velocidad.html
 siempre me gusta poner las fuentes, hay que reconocer los méritos de cada uno.
En la mencionada página explica como se puede aumentar la velocidad de muestreo bajando la resolución a 8 bits.
Modificando el registro ADCSRA – ADC Control and Status Register A  , se modifica la velocidad de muestreo.
He utilizado el divisor 16 para la conversión, dando un muestreo de 66418 muestras /segundo.


A continuación se muestra el código fuente del arduino.

//seta43
//17/01/2012
 

byte datos[800];
  int x;
  int z;
  int zz;
  int analogValue;
  byte xx;
  int retardo;


 void setup() {
  Serial.begin(115200);
 
  bitWrite(ADCSRA,ADPS2,1);
  bitWrite(ADCSRA,ADPS1,0);
  bitWrite(ADCSRA,ADPS0,0);
 
  //Analog Input A0
  ADMUX=(1<<ADLAR)|(0<<REFS1)|(1<<REFS0)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
 
 }
 
 void loop() {
 
 if (Serial.available() > 0)
     { 
      xx = Serial.read();
       switch (xx)
       {
// 1  1ms   
         case 49:
           retardo=27;
           break;     
// 2ms          
         case 50:
           retardo=80;
           break;                 
// 4ms
         case 51:
           retardo=185;
           break;            
//10ms          
         case 52:
           retardo=520;
           break; 
//50ms                      
         case 54:
           retardo=2650;
           break;          
//100ms                     
         case 55:
           retardo=5300;
           break;          
           
//9
        //a
         case 97:
             Serial.println(analogReadFast());  
             break;                
         //s  
         case 115:
            for (x=0;x<800;x++) datos[x]=analogReadFast(); 
            for (x=0;x<800;x++)
             {
               analogValue=datos[x];
               Serial.println(analogValue);
             }
             break;
         //t
         case 116:         
             for (x=0;x<800;x++)
               {
                 datos[x]=analogReadFast(); 
                 for(z=0;z<retardo;z++)zz=0;
               }
            for (x=0;x<800;x++)
             {
               analogValue=datos[x];
               Serial.println(analogValue);
             }            
         break;
        
       }
    
     }

 }
 
 
 //Read ADC
int analogReadFast()
{
 ADCSRA|=(1<<ADSC);
 // ADSC is cleared when the conversion finishes
 while (bit_is_set(ADCSRA, ADSC));
        return ADCH;
}

El programa en Arduino funciona bajo demanda de otro programa hecho en gambas. Gambas es una especie de Visual Basic para Linux.
El programa en gambas manda a través del puerto serie una orden mediante un carácter. Una vez recibido el carácter la placa Arduino, lo procesa y según sea el carácter hace una cosa u otra, mandando las muestras a través del puerto serie al PC. En el PC se dibuja en una gráfica la onda digitalizada.
Programa para Gambas3 osciv1G3.zip
Programa para Gambas2 ardu_os.zip  



Seleccionamos el puerto serie donde tenemos colocado el Arduino.


Vemos una onda de 4 KHz.


También podemos utilizarlo de voltímetro con registro de variaciones de voltaje.

Como experiencia también he hecho prueba modificando el registro ADCSRA – ADC Control and Status Register A a otros divisores, 8 y 4, estos son los resultados. También probé el divisor por 2, pero a esa velocidad el conversor no funcionaba.


 123200 muestras/s


198000 muestras/s


Saludos.
SETA43