Paso 1: Detección de inclinación de la señal
A continuación se reproduce la parte importante del código. De este código se lleva a cabo en el ADC interrumpir (interrupciones y corre cada vez un nuevo análogo valor está listo de A0, más información sobre qué interrupciones están y por eso utilizamos los pueden encontrar aquí)
prevData = newData; valor anterior //store
newData = ADCH; //get valor de A0
Si (newData > prevData) {//if pendiente positiva
PORTB | = B00010000; //set pin 12 alto
}
else if (newData < prevData) {si pendiente negativa
PORTB & = B11101111; //set pin 12 bajo
}
Debo señalar aquí que en este tutorial utilizo directa manipulación puerto para apagar y encender el pin de salida (pin 12) de Arduino. Lo hice porque la manipulación puerto es una forma mucho más rápida de abordar los pines de Arduino que el comando digitalWrite(). Ya que tenía que poner todo el código anterior dentro de una rutina de interrupción que se iba a 38,5 kHz, necesitaba el código tan eficiente como sea posible. Usted puede leer más información sobre Puerto de manipulación en la Web de Arduino, o ver los comentarios que he escrito arriba para entender lo que hace cada línea. Usted notará también en el código siguiente que utilicé algunos comandos desconocidos en la función setup() que he podido conseguir las entradas analógicas del Arduino a muestra a una frecuencia alta. Información puede encontrarse en mi tutorial de Arduino de audio.
Figura 1 muestra el resultado del pulso en azul y la onda senoidal en amarillo en un osciloscopio. Aviso cómo el pulso de la salida cambia cada vez que la onda senoidal alcanza un máximo o mínimo. La Fig 2 muestra el pulso de salida en azul para una forma de onda arbitraria en amarillo. Observe aquí cómo onda del pulso en un ciclo de trabajo irregular debido a que la señal de entrada (amarilla) es mucho más complicada que una onda senoidal.