programar frecuencia HZ de luces led

Hola a todos!

Necesito programar una luz led para que este durante un tiempo a 55 hz luego a 54 Hz necesito que sea muy preciso, hemos llegado a una idea para hacerlo pero me gustaría saber dos cosas, si alguien lo ha probado si la precisión es buena y si hay otras formas de programar esto.

El sketch que hemos hecho es este para probar y si parece que funciona para ponerlo a esas frecuencias.

float t=18181.8181818; //periodo calculado como 1/f*10^6 donde f es la frecuencia en HZ

void setup(){
  digitalWrite(13, HIGH);
  delayMicroseconds(t);
  digitalWrite(13, LOW);
  delayMicroseconds(t);
}

gracias por vuestros aportes!

Pienso que deberías establecer cuán preciso puedes aceptar, porque quizá el delaymicro no te pueda cumplir el requerimiento, porque no va a aceptar esa cadena de decimales, va a truncar el entero.

O quizá por el contrario hasta el delaymillis pueda satisfacer la precisión que persigues.

Hay que estar consciente de que toda medida tiene una tolerancia asociada, debes establecer esa tolerancia en tu proyecto para poder tener una idea de qué se puede y qué no hacer.

Saludos y éxito.

Hay librerías especializadas que resuelven tu problema usando TIMERs.

Esta es una de las mejores para tu caso Arduino PWM Frequency Library

Busca este hilo para ver/buscar ejemplos. Esta todo en inglés.

Un ejemplo:

#include <PWM.h>

//use pin 11 on the Mega instead, otherwise there is a frequency cap at 31 Hz
int led = 7;                // the pin that the LED is attached to
int brightness = 0;         // how bright the LED is
int fadeAmount = 5;         // how many points to fade the LED by
int32_t frequency = 20000; //frequency (in Hz)

void setup()
{
  //initialize all timers except for 0, to save time keeping functions
  InitTimersSafe();

  //sets the frequency for the specified pin
  bool success = SetPinFrequencySafe(led, frequency);
 
  //if the pin frequency was set successfully, pin 13 turn on
  if(success) {
    pinMode(13, OUTPUT);
    digitalWrite(13, HIGH);   
  }
}

void loop()
{
  //use this functions instead of analogWrite on 'initialized' pins
  pwmWrite(led, brightness);

  brightness = brightness + fadeAmount;

  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;
  }     
 
  delay(30);     
}

Observa que el ejemplo apunta a cambiar el ancho del pulso pero comienza ajustando la frecuencia a 20000 Hz y nada impide que lo uses a 54 55 o como gustes

Estas son las funciones permitidas

Tienes 5 funciones principales.
InitTimers() Inicializa todos los timers. Necesita ser llamada antes de cambiar los timers o setear un pin para un PWM diferente.
InitTimersSafe() Lo mismo que InitTimers() excepto que timer 0 no es inicializaod para reservar las funciones de tiempo que usa Arduino.
pwmWrite(uint8_t pin, uint8_t val) Lo mismo que ‘analogWrite()’, pero solo trabaja sobre los timers incializados.
SetPinFrequency(int8_t pin, int32_t frequency) FIja la frecuencia del pin (en Hz) y devuelve su estado con una función bool de éxito o fracaso
SetPinFrequencySafe(int8_t pin, int32_t frequency) Lo mismo que la anterior pero sin tocar Timer0