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 https://code.google.com/p/generate-ppmsignal/downloads/list
1 | #define chanel_number 8 //Channels Anzahl |
2 | #define default_ppm_value 1500 //Anfangswerte der Channels |
3 | #define PPM_FrLen 22500 //set the PPM frame length in microseconds (1ms = 1000µs) |
4 | #define PPM_PulseLen 300 //set the pulse length |
5 | #define onState 0 //set polarity of the pulses: 1 is positive, 0 is negative |
6 | #define sigPin 31 //set PPM signal output pin on the arduino |
7 | #define off 0 // Wert für den PPM Channel wenn er aus ist |
8 | #define on 2000 // Wert für den PPM Channel wenn er an ist |
9 | |
10 | |
11 | cli(); |
12 | TCCR1A = 0; // set entire TCCR1 register to 0 |
13 | TCCR1B = 0; |
14 | |
15 | OCR1A = 100; // compare match register, change this |
16 | TCCR1B |= (1 << WGM12); // turn on CTC mode |
17 | TCCR1B |= (1 << CS11); // 8 prescaler: 0,5 microseconds at 16mhz |
18 | TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt |
19 | sei(); |
20 | |
21 | |
22 | ISR(TIMER1_COMPA_vect) { //leave this alone |
23 | static boolean state = true; |
24 | |
25 | TCNT1 = 0; |
26 | |
27 | if (state) { //start pulse |
28 | digitalWrite(sigPin, onState); |
29 | OCR1A = PPM_PulseLen * 2 ; |
30 | state = false; |
31 | } |
32 | else { //end pulse and calculate when to start the next pulse |
33 | static byte cur_chan_numb; |
34 | static unsigned int calc_rest; |
35 | |
36 | digitalWrite(sigPin, !onState); |
37 | state = true; |
38 | |
39 | if (cur_chan_numb >= chanel_number) { |
40 | cur_chan_numb = 0; |
41 | calc_rest = calc_rest + PPM_PulseLen; |
42 | OCR1A = (PPM_FrLen - calc_rest)*2; |
43 | calc_rest = 0; |
44 | } |
45 | else { |
46 | OCR1A = (ppm[cur_chan_numb]- PPM_PulseLen)*2; |
47 | calc_rest = calc_rest + ppm[cur_chan_numb]; |
48 | cur_chan_numb++; |
49 | |
50 | } |
51 | } |
52 | } |
Ich versteh einfach nicht warum hier ein gültiges PPM-Signal rauskommt. Bei 16MHz und einem Prescaler von 8 wird das Zählerregister alle 2us um 1 erhöht. Angenommen "Kanal 1" bekommt den Wert 1500 zugewiesen. OCR1A = (1500-300)*2. Das ergibt 4,8ms. Laut meinen Information darf doch ein Kanal maximal 2ms Lang sein. Außerdem würden bei 8 Kanälen die 22,5ms überschritten. Was wird eigentlich in PPM_PulseLen gespeichert? Ist das die Pause zwischen den Impulsen? Zudem versteh ich das "*2" im Code nicht. Der Code deckt sich einfach nicht mit der Quelle:http://www.mftech.de/ppm.htm Würde mich um Hilfe freuen. Danke schon mal im voraus