PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM-Signal einer RC-Anlage mit input capture messen



MechMac
07.03.2011, 20:36
Hallo,

ich verwende einen Mega644 und versuche momentan das PWM-Signal einer RC-Anlage zu messen.
Man sagte mir dass das am Besten mit dem input capture Modus geht.

Momentan habe ich folgendes zusammengebastelt:



char wert1=0;
char wert2=0;
char Ergebnis;
int run=0;



void pwm_init()
{
TCCR1A = 0;
TCCR1B = (1<<ICES1) | (1<<CS10); // steigende Flanke, kein Prescaler
TCCR1C = 0;
TIMSK1 = (1<<ICIE1) ; // Interrupt akivieren, Capture
}



ISR( TIMER1_CAPT_vect )
{
if (run==0)
{
run=1; //als nächstes zweiter Durchlauf
wert1=ICR1; //Startwert
TCCR1B &= ~ (1<<ICES1); //setzen auf fallende Flanke
}
else
if (run==1)
{
run=0; //als nächstes erster Durchlauf
wert2=ICR1; //Endwert
TCCR1B |= (1<<ICES1); //setzen auf steigende Flanke

//Berechnung
Ergebnis=wert2-wert1;
}

}

die Variable "Ergebnis" lasse ich mir via RS232 ausgeben. Leider kommt da nur Müll an.
Das die Variablen wert2, wert1 als char definiert werden, habe ich aus einem Beispiel übernommen, mir ist nicht klar warum.
Ich hätte integer erwartet.

Hardwareseitig habe ich zum testen den Empfänger an VCC und GND vom µc angeschlossen und einfach die Signalleitung direkt an den PD6(ICP1) vom µc gesetzt.

Wer kann mir dazu etwas sagen?

Gruß




Tante Edith`s Meinung:
Das mit dem Char ist Müll, habe es mal als Double angenommen und nun kommen Zahlen, welche sich immerhin passend zum "Gas-geben" am Sender, ändern.
Das es 5-Stellige Zahlen sind, wird wohl an der Taktfrequenz liegen.
Ich werde mal testen, die Zahl umzurechen und einen Servo anzuschließen.


Letzter Stand:
Wenn ich den Wert durch 16 Teile komme ich in Neutralstellung auf ~1500 µs
Das passt soweit.
Allerdings ist der min-Wert 1200 und der max-Wert 1800.
Der Bereich ist zu klein. Er sollte bei etwa 1000 bis 2000 liegen.
Hat jemand eine Idee warum mir da was fehlt?

sternst
07.03.2011, 23:15
Das mit dem Char ist Müll, habe es mal als Double angenommenDouble ist auch nicht viel besser als Char. Nimm das, was auch dem Zähler selbst entspricht, also uint16_t. Nur dann ist "Ergebnis" auch in dem Fall korrekt, wenn der Zähler zwischen den Flanken überläuft, und wert2 daher kleiner ist als wert1.

AlexAtRobo
08.03.2011, 09:20
Bist du sicher dass deine Fernsteuerung den vollen Umfang überträgt? Je nach Sender kannst du ja Endlagen von den Servos begrenzen. Miss doch mal mit einem Oszilloskop nach, was der Sender schickt und was du misst.

MechMac
08.03.2011, 14:44
Vielen Dank euch beiden.
Unter Verwendung von uint16_t habe ich nun keine Negativ-Werte als Ergebnis mehr und an der Funke war
eine Servo-Wegbegrenzung eingestellt die den Ausschlag begrenzt hat.
Nun passt es.