Bonjour,
Je suis en train d'utiliser un compteur sur l'arduino mega 2560. Ce compteur doit me permettre de générer des valeurs de fréquence, via pin output, entre "0" et 3250 Hz.
Le problème est que le compteur ne me permet pas d'atteindre "directement" ces valeurs. Je suis obligé de passer par 2 prédiviseurs.
Le premier à 1024 pour générer les valeurs de "0" Hz à 135Hz,
Le second à 1 pour générer les valeurs de 136Hz à 3250Hz.
Le problème rencontré est que lors du passage d'une plage à l'autre, il s'avère que le compteur passe dans une phase ou il ne génère plus de fréquence.
Question 1 : est-il possible d'utiliser 2 compteurs différents, indépendants pour contourner ce phénomène ?
Question 2 : existe-t'il un moyen de réduire le temps (temps de réinitialisation ?) du compteur ?
Question 3 : est-ce que mon code peut être optimisé afin de réduire ce phénomène ?
voici mon code :
#define SIGNAL4 6 // ici on definit les sorties qui generent les signaux carres
unsigned char prescaler = 0b00001101; // variable d'ajustement du prescaler
unsigned valeur = 65500; // frequenceInt
int prescal = 0;
void setup () {
delay(1000);
Serial.begin(115200);
pinMode (SIGNAL4, OUTPUT);
// ======================================================================================================================================================
// Paramétrage du timer1, pour qu'il déclenche une interruption, à chaque fois que sa valeur sera égale à celle qu'on aura indiqué dans le registre OCR1A
// ======================================================================================================================================================
noInterrupts(); // On désactive les interruptions, pour commencer
TCCR1A = 0b00000000;
TIMSK1 = 0b00000010;
bitSet(TIMSK1, OCIE1A); // On met le bit OCIE1A à 1 (contenu dans le registre TIMSK1)
TCNT1 = 0; // Mise du timer1 à zéro
interrupts(); // Et, on ré-active les interruptions
}
// ======================
// Routine d'interruption
// ======================
ISR(TIMER1_COMPA_vect) {
digitalWrite (SIGNAL4, !digitalRead(SIGNAL4));
TCCR1B = prescaler;
OCR1A = valeur; // mise à jour de la valeur OCR1A en fonction de la valeur envoyée
}
// =================
// Boucle principale
// =================
void loop ()
{
if (Serial.available()) // ici on regarde si qqechose vient de l USB
{
valeur = Serial.readStringUntil('\n').toInt();
Serial.println(valeur);
if ((valeur<2461) && (valeur>56))
{
prescaler = 0b00001101; // prescaler 1024
}
else if ((valeur<59300) && (valeur>2462))
{
prescaler = 0b00001001; // prescaler 1
}
else
{
prescaler = 0b00001101; // ici on definit le prescaler pour vitesse nulle
}
}
}
