timer et pwm

Bonsoir
désolé pour le post de tout a l heure je me suis rendu compte qu il etait pas dans la section convenable je m excuse pour cette erreur :slight_smile:

voilà j essai de realisé un capteur de distance IR voilà mon code : j envoi un signal a 38khz et je regarde sur le recepteur le signal recus or la reception est capricieuse des fois elle reçois et des fois rien

$#define ledPin 13
int signal = A5; 
void setup()
{
  pinMode(ledPin, OUTPUT);
   Serial.begin(9600);
  // initialiser le timer1
  noInterrupts(); // désactiver toutes les interruptions
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;

  OCR1A = 52; // 16MHz/8/38khz       
  TCCR1B |= (1 << WGM12); // CTC mode
  TCCR1B |= (0 << CS12); 
  TCCR1B |= (1 << CS11); 
  TCCR1B |= (0 << CS10);
  TIMSK1 |= (1 << OCIE1A); // Activer le mode de comparaison
  interrupts(); // activer toutes les interruptions
}
 
ISR(TIMER1_COMPA_vect) // fonction périodique
{
  
   analogWrite(ledPin, digitalRead(ledPin) ^ 1);// Basculer la LED allumée/éteinte
  
}



  



void loop()
{
   
        
    Serial.println( calculDistance());  
 delay(500); 
     
}


int calculDistance() { 
  byte distance = 0;
  distance = analogRead(signal);
  return(distance);
}

il me detecte l émission IR par intermittence je sais plus ou es l erreur

j ai pris cette commande depuis un exemple de timer :
analogWrite(ledPin, digitalRead(ledPin) ^ 1); qlq1 peut m expliquer cette commande

Bonjour,

Je ne sait pas d'où tu sort ce code mais c'est pas bon du tout ...

analogWrite(ledPin, digitalRead(ledPin) ^ 1);

"digitalRead(ledPin)" lit l'état de le broche ledPin (HIGH / LOW).
"digitalRead(ledPin) ^1" retourne l'inverse de l'état de la broche ledPin.
"analogWrite(ledPin, digitalRead(ledPin) ^ 1);" Écrit la valeur analogique (PWM) correspondant à l'inverse de l'état de la broche ledPin.

Ce serait un digitalWrite() je pourrai comprendre, mais un analogWrite() d'une valeur logique (HIGH / LOW) ça n'as pas de sens.

Fait donc un :

digitalWrite(ledPin, !digitalRead(ledPin));

ça devrait déja mieux marcher :wink:

Ps: à 38KHz je ne suis pas sûr que tu ais vraiment le temps de faire un digitalRead() puis un digitalWrite().
C'est deux fonctions sont très basiques mais pas du tout optimisées.
Regarde du côté de Google Code Archive - Long-term storage for Google Code Project Hosting. ou carrément de Arduino Reference - Arduino Reference

Le 38 kHZ en infrarouge est un protocole usuel pour des télécommandes IR.
Si c'est juste pour mesurer des distances, tu dois pouvoir utiliser une fréquence plus lente ?

valdano:
voilà j essai de realisé un capteur de distance IR voilà mon code : j envoi un signal a 38khz et je regarde sur le recepteur le signal recus or la reception est capricieuse des fois elle reçois et des fois rien

capteur de distance reelle ou detecteur d'obstacle (proche) ?