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;
}
//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 en Gambas ardu_os.zip
Programa para Gambas3 osciv1G3.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
Hola seta43, los enlaces para descargar el programa están caidos. Estoy muy interasado en poder echarle un vistazo.
ResponderEliminarUn saludo
Ya los puedes bajar.
ResponderEliminarhttp://seta43.duckdns.org/osciv1G3.zip
http://seta43.duckdns.org/ardu_os.zip
Gracias Seta43
ResponderEliminar