timer2 38kHz IR portata scarsa

Ho provato a generare i 38kHz IR sia con i pin normali con delayMicroseconds, sia con i registri del timer2.
Con la modalità manuale ottengo un range ottimo tranquillamente superiore a 1m.
Coi registri invece, funziona bene entro 10cm, andando oltre il TSOP sembra non ricevere il segnale, mi dà sempre feedback come se ci fosse un ostacolo.

codice con timer2:

#define IRsensorPin 12
#define IRledPin 11
#define D13ledPin 13

unsigned long timerIR; 

void timer2_Freq(float freq){
    TCCR2A = _BV(WGM21) | _BV(COM2A0); // This mode toggles output once per timer cycle
    TCCR2B = _BV(CS20);                // Do not scale the clock down - use 16 MHz timer rate.
  
    OCR2A = (int) ceil((16000000/(freq*1000)/ 2) ) -1  ;
    Serial.println (OCR2A);
}

 
void setup() {
  pinMode(IRledPin, OUTPUT);
  pinMode(IRsensorPin,INPUT);
  pinMode(D13ledPin, OUTPUT);
  Serial.begin(115200);
  timerIR = millis();
  timer2_Freq(38);
}


void loop() {

    
  if (millis() - timerIR > 50){ 

   if (digitalRead(IRsensorPin) == LOW) {
      //Serial.println("libero");
      if (digitalRead(D13ledPin)== HIGH  ) digitalWrite(D13ledPin ,LOW);
    }
    else {
      //Serial.println("OSTACOLO");
      if (digitalRead(D13ledPin)== LOW  ) digitalWrite(D13ledPin ,HIGH);
    }
    timerIR = millis();
  }
  
}

codice manuale:

#define IRsensorPin 12
#define IRledPin 11
#define D13ledPin 13

unsigned long timerIR; 

// **********  manual delayMicroseconds:
void IR38Write() {
  for (int i = 0; i <= 384; i++) {
    digitalWrite(IRledPin, HIGH);
    delayMicroseconds(12)
    digitalWrite(IRledPin, LOW);
    delayMicroseconds(12);
  }
}


void setup() {
  pinMode(IRledPin, OUTPUT);
  pinMode(D13ledPin, OUTPUT);
  pinMode(IRsensorPin,INPUT);
  Serial.begin(115200);
  timerIR = millis();
}


void loop() {

    
  if (millis() - timerIR > 50){

   IR38Write();  

   if (digitalRead(IRsensorPin) == LOW) { 
      //Serial.println("libero");
      if (digitalRead(D13ledPin)== HIGH  ) digitalWrite(D13ledPin ,LOW);
    }
    else {
      //Serial.println("OSTACOLO");
      if (digitalRead(D13ledPin)== LOW  ) digitalWrite(D13ledPin ,HIGH);
    }
    timerIR = millis();
  }
  
}

Quindi sembra che con il timer2 ci sia meno potenza del led IR?
Il duty cycle della modalità manuale dovrebbe essere al 50%, mentre quello del timer2 ?

Il duty dovrebbe essere 50% anche per il timer2...

Il sensore IR che uso è un TSOP4838.

Diciamo che ho risolto...:

dal datasheet:

Some examples which are suppressed are: Continuous signals at any frequency

Minimum burst length 10 cycles/burst

After each burst of length a minimum gap time is required of 10 to 70 cycles ≥ 12 cycles

Maximum number of continuous short bursts/second 800

Ho inviato la portante a 38kHz del timer2 solo a intervalli, come quella manuale:

  pinMode(IRledPin, INPUT);
  
  if (millis() - timerIR > 50) {

      pinMode(IRledPin, OUTPUT);
      delay(20);
      .....

  }

Funziona bene.

Per curiosità, a quanti us corrispondono quei cycles/burst e la pausa di almeno 10-70 cycles? Un cycle è un pulse del PWM High? Attivando l'interrupt ogni 50 ms (di pausa), per 20ms di trasmissione, quanti cycle faccio?

Il ciclo é 1 diviso la frequenza. 10 o 70 ciclii quanto sono? Ciao Uwe

OK: 26,3 us al ciclo, per cui 10-70: da 263us a 1,8ms

Però lui dice che dopo "each burst of length" bisogna fare una pausa della durata come sopra. Cosa intende con burst of length?

Con la trasmissione continua di 20ms faccio 760 cicli consecutivi: sembra non avere problemi. Come si rapporta col discorso del burst?

Se ho capito bene, faccio dei blocchi di trasmissione = bursts, di 20ms cioè di 760 cycles, seguiti da una pausa di 50ms = 1901 cycles.

1) Il discorso dei "Maximum number of continuous short bursts/second 800", vuol dire che al secondo non può accettare più di, per es.: 800 x ( 26,3usx10 burst minimo + almeno 26,3usx10 pausa) = cioè 420,8ms Cioè pur essendoci ancora 579,2 ms, non può accettare altre trasmissioni. Giusto?

2) Non parla di quanto lungo può essere un burst (invio continuo di segnale)... però dice che:

For bursts greater than 70 cycles a minimum gap time in the data stream is needed of > 4 x burst length

Per cui, il mio ciclo non andrebbe bene (anche se in pratica funziona)... Dovrei fare un burst più corto, tipo 10ms e poi pausa di 50ms. Oppure anche molto più corto, tipo 1ms.