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