PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM Signale auswerten



maexlich
25.06.2007, 15:23
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

geronet
25.06.2007, 16:32
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

maexlich
26.06.2007, 11:21
Hab ich mir auch schon gedacht aber was kann man im Icp register machen?

wkrug
26.06.2007, 16:51
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 ?

maexlich
27.06.2007, 12:30
Danke für die Info,
so viel ich weiss kann man die Pulslaenge über einen Wiederstand einstellen

MFG,
Max

maexlich
27.06.2007, 19:06
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:




#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;
}


MFG,
Max

maexlich
05.07.2007, 07:08
Keine hilfe mehr nötig. Gesegnet sei google. O:)

maexlich