Código:
#define SET(x,y) (x |=(1<<y)) //-Bit set / clear macros #define CLR(x,y) (x &= (~(1<<y))) // | #define CHK(x,y) (x & (1<<y)) // | #define TOG(x,y) (x^=(1<<y)) //-+ unsigned long t0=0; //-Ultima vez int t=0; //-Tiempo entre ints unsigned char tflag=0; //-Indicador de medición flag float SENSITIVITY= 1000.0; //-Adivina qué //-Generar interrupción cada 1000 oscilaciones de la bobina de busqueda SIGNAL(TIMER1_COMPA_vect) { OCR1A+=1000; t=micros()-t0; t0+=t; tflag=1; } void setup() { pinMode(13,OUTPUT); //-bocina pin digitalWrite(12,HIGH); //-NULL SW. pull up //-Configurar el contador1 para contar en el pin 5 TCCR1A=0; TCCR1B=0x07; SET(TIMSK1,OCF1A); } //-Float ABS float absf(float f) { if(f<0.0) return -f; else return f; } int v0=0; //-NULL value float f=0; //-Medición value unsigned int FTW=0; //-Click Tasa de generador unsigned int PCW=0; //-Click Fase del generador unsigned long timer=0; //-Click timer void loop() { if(tflag) { if(digitalRead(12)==LOW) //-Check NULL SW. v0=t; //-Ejemplo de nuevo valor nulo f=f*0.9+absf(t-v0)*0.1; //-Promedio más de 10 muestras tflag=0; //-Reset flag float clf=f*SENSITIVITY; //-Convertir la medición en frecuencia de clic
if(clf>10000) clf=10000; FTW=clf; } //-Click generator if(millis()>timer) { timer+=10; PCW+=FTW; if(PCW&0x8000) { digitalWrite(13,HIGH); PCW&=0x7fff; } else digitalWrite(13,LOW); }
Este código utiliza el lenguaje de programación de una placa Arduino
No hay comentarios:
Publicar un comentario