Generador de señal con detector de flancos

¡Buenas tardes! Es mi primer pregunta en el foro y debo decir que he encontrado aquí interesantes proyectos, pero en esta ocasión tengo una duda con uno en específico.

Tengo que hacer mediante Arduino UNO, un programa, que (al menos inicialmente) me dé una señal cuadrada de una frecuencia determinada (digamos 1 kHz). Tengo entendido que eso se podría hacer con la función "tone(pin,frecuencia)". Espero no equivocarme. Pero, también debo lograr que por cada 4 Flancos de subida de dicha señal, exista un pulso de 5v en otra salida solo en el momento del flanco. No se si me estoy explicando completamente. Pero lo del detector de flancos es lo que me resulta confuso. Gracias y espero que puedan ayudarme.

Después tengo que lograr variar la frecuencia (digamos entre 1 kHz y 10 kHz) con un potenciómetro (tal vez usando una entrada analógica) y conservar que sin importar la frecuencia se siga dando ese pulso al cuarto flanco.

Por ahora me preocupa mas la primera parte. Hoy pienso hacer unas pruebas con osciloscopio para ver si me funciona un intento de código. Pero aprecio sugerencias y ayudas.

¡Hola! Ayer pude probar mi código en un osciloscopio así que estoy un poco mas seguro de compartirlo para futura ayuda, sugerencias, etc.

Con este código puedo variar la frecuencia en saltos de 16 Hz por paso así que varía de 16 Hz a 16 kHz. Pero aún así me gustaría que me recomendaran otras formas de hacerlo (optimizar el código) si es posible ya que la señal generada no es completamente estable. Estoy medianamente contento con ese programa, pero sé que podría ser mejor. Si se me ocurre cómo hacer lo del detector de flancos lo compartiré mas adelante. Gracias.

PD. Si, hay una salida que aún no uso, pero es la que guardo para el detector de cada 4 flancos positivos.

int sensor = A0; // Entrada para el Pot
int salPuls = 12; // Salida Del Detector de Flancos
int salida = 13; // Salida al Osciloscopio
int Lectura; // Guarda la lectura de la señal analógica
long Periodo; // Variable long por las conversiones

void setup() {
pinMode(salida, OUTPUT);
pinMode(salPuls, OUTPUT);
}

void loop() {
Lectura = analogRead(sensor);
noTone(13);
tone(salida, Lectura*16, 1000); // Frecuencia de salida es igual a Lectura (0 a 1023) x 16 Hz
delay(100); // Un retraso para dar algo de estabilidad

}

Hola,

Si el programa solo va a generar la onda, quizá sea más lógico utilizar el timer interno (millis(), micros()) para generar la onda (1 kHz es un período de 1 ms, que creo que el arduino gestionará bien). Para una frecuencia de 500 Hz basta con comprobar si la función millis() es par o impar y modificar la salida digital en consecuencia.

Saludos

Gracias por la sugerencia vffgaston, aunque como lo mencioné anteriormente, en realidad son dos señales las que debo generar. La primera de una frecuencia variable (el código que publiqué lo hace relativamente bien) y la segunda sigue a la primera. Serían dos salidas. ¿Me podrías dar una idea un poco mas concreta de como usar la función millis() para generar una señal? y de ser así, ¿en que rango de frecuencias crees que podría trabajar adecuadamente?

Gracias de nuevo por tu sugerencia!

Este código "genera" una frecuencia de 500 Hz

void Square()
{
  if (millis() % 2)
  {
     // Código del primer semiperíodo 
   }
  else
  {
     // Código del segundo semiperíodo 
   }
}

Con algo más de detalle:

140627_500HZ.bmp (1.91 MB)

usaria Tone, y el ping de salida del tono, conectado a un ping de entrada digital, que utilizaría para un contador, cada vez que de múltiplo de lo que desea active el ping correspondiente.