Forum: Mikrocontroller und Digitale Elektronik PPM-Signal erklärung


von Patrick (Gast)


Lesenswert?

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

von Rainer U. (r-u)


Lesenswert?

Patrick schrieb:
> Bei 16MHz und einem Prescaler von 8 wird das Zählerregister alle 2us um
> 1 erhöht.

nicht alle 0,5 uS, wie es oben im Kommentar steht?

von Patrick (Gast)


Lesenswert?

Hallo Rainer

Danke für deine Antwort.

2MHz sind wirklich 0,5us. Damit komm ich der Sache schon um einiges 
näher.

Jetzt versteh ich nur nicht warum man noch die PPM_PulseLen vom Kanal 
abzieht.

(1500-300)*2 dann steht in OCR1A 2400 was 1,2ms sind.

Laut der Quelle was ich oben angegeben habe, kommt immer ein Pausenpuls 
von 0,3ms und dann eben die Kanallänge ohne die Kürzung.

von Tom E. (Gast)


Angehängte Dateien:

Lesenswert?

Patrick schrieb:
> Der Code ist von
> https://code.google.com/p/generate-ppmsignal/downloads/list

Und wie kommt man da ran?

von Toxic (Gast)


Lesenswert?


von Rainer U. (r-u)


Lesenswert?

Patrick schrieb:
> (1500-300)*2 dann steht in OCR1A 2400 was 1,2ms sind.

Ich hab es jetzt nicht im Detail durchgesehen - aber das naheliegende 
ist wohl, dass bis dahin schon einige Zeit (Startimpuls?) vergangen ist 
- dann passt es wieder.

Änder doch die Werte und guck was passiert.. ;-)

von Bussard (Gast)


Lesenswert?

Patrick schrieb:
> 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?

Bild: 8-Kanal PPM mit 7x 1.5ms Mittelstellung und K3 Minimalwert 0.95ms:
http://static.rcgroups.net/forums/attachments/6/1/1/9/0/4/a8187567-134-8K-Logic_PPM_Ch3-Fail-safe-950%C2%B5s_.jpg


8x 2ms =16ms + Synchronlücke > 4ms
Bei mehr als 8 übertragenen Kanälen wird das Paket auch schon mal auf 
27.5ms gedehnt, um bei allen Kanälen in Maximalstellung 
(unwahrscheinlich, aber möglich) noch genug Platz für die Synchronlücke 
zu lassen (Beispiel Fa. FrSky optionale Firmware)

Gruß

von Karl H. (kbuchegg)


Lesenswert?

Patrick schrieb:

> Laut der Quelle was ich oben angegeben habe, kommt immer ein Pausenpuls
> von 0,3ms und dann eben die Kanallänge ohne die Kürzung.

Ja.
Ist ja auch richtig.

Was da erzeugt wird ist ein PPM Signal.
Das hat mit dem Signal, welches dann zu den Servos geht nur insofern zu 
tun, als letzteres für jedes Servo aus diesem hier generiert wird. 
Dieser Puls der dann tatsächlich zu den Servos geht, beginnt mit der 
steigenden Flanke des PPM Signals und geht bis zur nächsten steigenden 
Flanke. Daher muss von der Gesamtdauer von einer steigenden Flanke zur 
nächsten, die Zeit für den Kanalwechselpuls abgezogen werden, damit man 
weiss, wie lange die Pause zwischen den Pulsen sein muss.

: Bearbeitet durch User
von Bussard (Gast)


Lesenswert?

Hier noch mal das gleiche Signal zur Verdeutlichung, was kbuchegg 
schrieb, von den Servo-Ausgängen eines Empfängers abgegriffen (Kanal 
Channel 8 nicht dargestellt)
http://static.rcgroups.net/forums/attachments/6/1/1/9/0/4/a8187565-161-8K-Logic_Ch3-Fail-safe-950%C2%B5s_.jpg

Die Servo-Signalpulse haben die exakt gleiche Länge wie im PPM-Signal 
von pos. zu pos. Flanke

Gruß

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.