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