Könnte man z.B. mit dem input capture pin machen, bei steigender(fallender) Flanke wird der Timerwert im ICP Register gespeichert und du bekommst nen Interrupt, wo du das auslesen kannst.
Grüsse, Stefan
Hi,
ich bin ziemlicher Robotik einsteiger und hab ein kleines Problem:
Ich möchte über einen Atmel versuchen die PWM Signale meines ADXL202
auszuwerten, aber wie stelle ich den Timer bzw. counter so ein das er mir die länge des strom-an impulses misst und dies in einen verwendbaren wert umwandelt? (Ja ich hab das Datenblatt gelesen aber mein englisch ist nicht das beste)
Danke im vorraus,
MFG Max
Könnte man z.B. mit dem input capture pin machen, bei steigender(fallender) Flanke wird der Timerwert im ICP Register gespeichert und du bekommst nen Interrupt, wo du das auslesen kannst.
Grüsse, Stefan
Hab ich mir auch schon gedacht aber was kann man im Icp register machen?
Im ICP Register wird der TCNT Wert gespeichert, bei dem der ICP Interrupt auftrat.
Also z.B. die steigende Flanke.
Du speicherst in der ICP Interrupt Routine diesen Wert ab und stellst in der ICP Interrupt Routine den Interupt auf fallende um.
Tritt dieser Interrupt auf liest Du wieder das ICP Register aus und ziehst den vorhergehenden Wert ab.
Der Pausenwert kann genauso errechnet werden.
Und schon hast Du eine Aussage über die Pulslänge.
Welche Teilerfaktoren Du für den Timer einstellen musst und ob Du noch irgendwelche Überlaufregister brauchst ist von der min und max Frequenz des PWM Signals und der gewünschten Präzision abhängig.
Das Datenblatt des ADXL202 mag ich jetzt nicht studieren, welche minimalen und maximalen Impulslängen können den auftreten ?
Danke für die Info,
so viel ich weiss kann man die Pulslaenge über einen Wiederstand einstellen
MFG,
Max
den duty cycle jedenfals bei der impulsdauer kp im datenblatt steht das die impulsdauer bei 0g beschleunigung 50% des duty cycles beträgt...
Hier einen kleinen prototyp der aber irgendwie nicht funktioniert, er benutzt die count72kHz funktion von der Asuro Lib d.h. alle 0.0000138s wird durch ein Interrupt count72kHz um eins erhöt. Zum testen hab ich einen Modelbauempfänger an den Int0 Pin angeschlossen:
MFG,Code:#include "asuro.h" volatile unsigned char status, wert; extern unsigned char count72kHz; void StartPwm(void) { DDRD &= ~(1<<PD2); //Datenrichtungsbit löschen MCUCR &= ~(1<<ISC01); //Interrupt einstellung von MCUCR |= (1<<ISC00); //Int0 einstellen auf Steigende und Fallende //Spannung GICR |= (1<<INT0); //Interrupt von Pin Int0 setzen } void StopPwm(void) { GICR &= ~(1<<INT0); //Interrupt deaktivieren } SIGNAL (SIG_INTERRUPT0) { if (status == 1) { //Wenn Status = 1 counter aktiv wert = count72kHz; status = 0; } else { count72kHz = 0; status = 1; }
Max
Keine hilfe mehr nötig. Gesegnet sei google.
maexlich
Lesezeichen