ARDUINO - OSCILOSCOPIO 66K MUESTRAS
Este es un proyecto que he encontrado de casualidad, y me ha parecido interesante comentarlo en el blog.Es un trabajo realizado por SETA43, y esta publicado en su página web: http://www.seta43.netau.net/ardu_os.html (en el indice http://www.seta43.netau.net/electro.html donde también podéis encontrar varios articulos dedicados a la Raspberry Pi, Arduino, etc ).
Os transcribo el artículo:
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/segundos |
Articulo realizado por SETA43, y publicado en http://www.seta43.netau.net/ardu_os.html