Lire une fréquence en dessous de 30hz

Bonjour,

Je souhaite pouvoir lire une fréquence de 20hz et son duty qui va avec. (le but avoué étant de ressortir en 100hz avec le même duty, convertisseur 20->100hz)

J’utilise le bout de code suivant:

#define pulse_ip 9
int ontime,offtime,duty;
float freq,period;
   
void setup()
{
  Serial.begin(9600);
  pinMode(pulse_ip,INPUT);
  Serial.print("#########start#");
}
void loop()
{
   ontime = pulseIn(pulse_ip,HIGH);
   offtime = pulseIn(pulse_ip,LOW);
   period = ontime+offtime;
   freq = 1000000.0/period;
   duty = (ontime/period)*100;  
   Serial.print("Freq: "); 
   Serial.print(freq);
   Serial.println(" Hz");
   Serial.print("Duty: ");
   Serial.print(duty); 
   Serial.print(" ");
   Serial.println('%'); 
   Serial.println(""); 
   delay(500);
}

Ca marche très bien au dessus de 30hz. En dessous, patatra.
Alors j’ai lu un tas de sujet là dessus et essayé plusieurs trucs en jouant avec la librairie timerone, sans succès.

Si quelqu’un a un avis éclairé là-dessus ?

Matériel utilisé: Atmega2560

pulseIn retourne un unsigned long, pas un int.

1 seconde = 1000000µS / 30 = 33333

Une variable int = 32768 maxi :confused:

Bien vu !
Merci à toi pour la résolution de ce problème ! Ce fut rapide et efficace.

#define pulse_ip 2
unsigned long ontime,offtime,duty;
float freq,period;
   
void setup()
{
  Serial.begin(9600);
  pinMode(pulse_ip,INPUT);
  Serial.print("#########start#");
  }
void loop()
{
   ontime = pulseIn(pulse_ip,HIGH);
   offtime = pulseIn(pulse_ip,LOW);
   period = ontime+offtime;
   freq = 1000000.0/period;
   duty = (ontime/period)*100; 
   Serial.print("Ton: ");
   Serial.print(ontime);
   Serial.println(" us");
   Serial.print("Toff: ");
   Serial.print(offtime); 
   Serial.println(" us");  
   Serial.print("Freq: "); 
   Serial.print(freq);
   Serial.println(" Hz");
   Serial.print("Duty: ");
   Serial.print(duty); 
   Serial.print(" ");
   Serial.println('%'); 
   Serial.println(""); 
   delay(250);
}

Pas de quoi :slight_smile:
Merci à toi pour le retour. Beaucoup ne se donnent pas cette peine.