Hallo, mit folgendem code versuche ich zwei Servosignale vom meinem RC Empfänger mit meinem atmega8 zu messen
1 | // Aktion bei Interrupt INT0
|
2 | ISR(INT0_vect) |
3 | {
|
4 | |
5 | if ((PIND & (1<<PD2))) // Abfrage ob Servo1 Signal high |
6 | |
7 | {
|
8 | |
9 | buffer1_start = (servo1_overflow_count * 100)+TCNT0; // Berechnung des Startzählers |
10 | |
11 | |
12 | }
|
13 | else
|
14 | {
|
15 | |
16 | |
17 | |
18 | buffer1_end = ((servo1_overflow_count +1) * 100)+TCNT0; //Berechnung des Endzählers |
19 | servo1_in = buffer1_end - buffer1_start; // Berechnung der Servo ti Zeit |
20 | servo1_overflow_count = 0; // Reset Overflow Counter |
21 | timestamp |= ((1 << 6)); // Setzen des Bits in Timestamp Byte bei fallende Flanke an Int0 |
22 | GICR &= (~(1<<INT0)); // INT0 DEaktivieren |
23 | GICR |= (1<<INT1); // INT1 aktivieren |
24 | |
25 | }
|
26 | |
27 | }
|
28 | |
29 | // Aktion bei Interrupt INT1
|
30 | ISR(INT1_vect) |
31 | {
|
32 | |
33 | if ((PIND & (1<<PD3))) // Abfrage ob Servo2 Signal high |
34 | |
35 | {
|
36 | PORTC |= (1 << PC3 ); // Schaltet das Abblendlicht ein |
37 | buffer2_start = (servo2_overflow_count * 100)+TCNT0; // Berechnung des Startzählers |
38 | PORTC &= ~((1 << PC3 )); //Abblendlicht ausschalten |
39 | }
|
40 | else
|
41 | {
|
42 | buffer2_end = ((servo2_overflow_count +1) * 100)+TCNT0;//Berechnung des Endzählers |
43 | servo2_in = buffer2_end - buffer2_start; // Berechnung der Servo ti Zeit |
44 | servo2_overflow_count = 0; // Reset Overflow Counter |
45 | timestamp |= ((1 << 7)); // Setzen des BIts in Tiemstamp Byte bei fallende Flanke an Int1 |
46 | GICR &= (~(1<<INT1)); // INT1 deaktivieren |
47 | GICR |= (1<<INT0); // INT0 aktivieren |
48 | |
49 | }
|
50 | |
51 | }
|
Diese ermittelten werte gebe ich dann an meine hardware pwm weiter. Leider merke ich das der an dem PWM ausgang angeschlossene Servo "zittert". Eine Messung mit nem oscar hat ergeben, dass das erzeugte PWM Signal um ca. +/- 250µs toggelt. Wenn ich nun der HArdware PWM einen festen wert vorgebe ist dies nicht der fall und der servo bleibt ruhig. Daraus schließe ich das es an der oben geposteten signalerfassung liegen muss. Habe auch die benötigte ZEit für die Befehle bei steigender bzw. fallender flanke gemessen, sie liegen bei ca. 3,5µs , d.h. daran kann es nicht liegen. Hoffe auf eure Hilfe! MFG