MechMac
07.03.2011, 21: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?
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?