PPM-Signal

Hallo

Ich versuche einen Multicopter über einen Arduino Mega der ein PPM-Signal erzeugt anzusteuern. Es funktioniert eigentlich auch schon nur weiß ich nicht warum es Funktioniert.

Der Code ist von Google Code Archive - Long-term storage for Google Code Project Hosting.

#define chanel_number 8  //Channels Anzahl
#define default_ppm_value 1500 //Anfangswerte der Channels
#define PPM_FrLen 22500  //set the PPM frame length in microseconds (1ms = 1000µs)
#define PPM_PulseLen 300  //set the pulse length
#define onState 0  //set polarity of the pulses: 1 is positive, 0 is negative
#define sigPin 31  //set PPM signal output pin on the arduino
#define off 0 // Wert für den PPM Channel wenn er aus ist
#define on 2000 // Wert für den PPM Channel wenn er an ist


 cli();
  TCCR1A = 0; // set entire TCCR1 register to 0
  TCCR1B = 0;

  OCR1A = 100;  // compare match register, change this
  TCCR1B |= (1 << WGM12);  // turn on CTC mode
  TCCR1B |= (1 << CS11);  // 8 prescaler: 0,5 microseconds at 16mhz
  TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt
  sei();


ISR(TIMER1_COMPA_vect) { //leave this alone
  static boolean state = true;

  TCNT1 = 0;

  if (state) { //start pulse
    digitalWrite(sigPin, onState);
    OCR1A = PPM_PulseLen * 2 ;
    state = false;
  }
  else { //end pulse and calculate when to start the next pulse
    static byte cur_chan_numb;
    static unsigned int calc_rest;

    digitalWrite(sigPin, !onState);
    state = true;

    if (cur_chan_numb >= chanel_number) {
      cur_chan_numb = 0;
      calc_rest = calc_rest + PPM_PulseLen;
      OCR1A = (PPM_FrLen - calc_rest)*2;
      calc_rest = 0;
    }
    else {
      OCR1A = (ppm[cur_chan_numb]- PPM_PulseLen)*2;
      calc_rest = calc_rest + ppm[cur_chan_numb];
      cur_chan_numb++;

    }
  }
}

Das Zählerregister wird alle 2us um 1 hochgezählt.

Die Länge eines Frames ist 22,5ms.

Angenommen das "Kanal 1" 1500 ist, würde in das OCR1A Register (1500-300)*2 geschrieben.

Dadurch wäre "Kanal 1" 2,4ms lang der eigentlich maximal 2ms lang sein darf.
Zudem versteh ich im Code das "*2" nicht.
Ist mit PPM_PulseLen nicht die Pause von 0,3ms zwischen den Pulsen gemeint?

Der Code deckt sich einfach nicht mit der Quelle:RC PPM Signal - MFTech

Würde mich freuen, wenn mir das irgendwer erklären könnte.
Danke schon mal im voraus

Geht das nicht einfacher mit der Servo Bibiothek?
Grüße Uwe

Hab mit der Servo-Bibliothek noch nie was gemacht.
Aber um das geht es mir nicht.
Der Code funktioniert wunderbar.
Nur würd ich gerne verstehen warum das so ist.