ich möchte die Drehgeschwindigkeit in grad/s über einen Drehgeber ermitteln.der Drehgeber gibt 3600 impulse/s aus und der Motor wird denn auf maximal 30 U/min gedreht. verfügbares Hardware :STK500 und atmega168. Peter Dannegger hat hier ein code zur verfügung gestellt was natürlich für einen Anfänger ziemlich schwer zu verstehen was da alles gemacht wird :) also für 30 U/min (0,5 U/s) sind 1800 Impulse/s . maximal in jeder 0,5 ms muss ein Interrupt auftretten? ich möchte nur die Impulse die über Spur A des Sensors zählen da die Drehrichtung ist nicht wichtig(motor dreht in einer Richtung), vondaher wurde die Spur B am Mikrocontroller nicht angeschlossen. hab den Timer1 so konfiguriert: TCCR1B = (1<<WGM12) | (1<<CS11) | (1<<CS10); OCR1A = (uint16_t)(XTAL / 64.0 * 1e-3 - 0.5); TIMSK1 |= 1<<OCIE1A; es heisst doch dass jede 1ms ein Interrupt auftritt und ISR wird denn bearbeitet? was soll ich in diesem Fall in ISR schreiben wenn man nur Die Spur A auswerten will? vielen Dank im voraus.
> was soll ich in diesem Fall in ISR schreiben wenn man nur Die Spur A > auswerten will? static BOOL olda=0; long pos=0; BOOL a; a=port.inpouta. if(a!=olda) pos++; olda=a;
In deinem Fall würde es doch einfach ausreichen eine Phase des Drehgebers (sofern er denn überhaupt zwei hat) einen Interrupt Pin anzuschließen. Dann zählst du zwischen einer paar Dutzend pulsen einfach die Zeit die vergangen ist.
ich haben Peter Dannegger`code so umgeschrieben,kann mir jemand sagen welche fehlern vorhanden sind.
Ich versteh nicht, warum du so auf einem Drehgeber bestehst, wenn du ihn sowieso nicht als Drehgeber benutzen willst. Was du vorhast, ist nichts anderes als eine Lichtschranke abfragen, die regelmässig durch die Motordrehung unterbrochen wird. Oder ein Taster oder .... Auf jeden Fall, da dich die Richtung nicht interessiert, musst du auch nicht mit Drehgeber Methoden da rann, sondern einfach nur Pulse in einer vorgegebenen Zeit zählen. Also: Warum kompliziert, wenss auch einfach geht?
Ähm
1 | ISR( TIMER1_COMPA_vect ) // 1ms for manual movement |
2 | {
|
3 | int8_t neu; |
4 | |
5 | neu = 0; |
6 | if( PHASE_A ){ |
7 | neu = 1; |
8 | enc_delta+=neu; |
9 | }
|
10 | }
|
was soll denn das sein?
Das war ja mal nichts.
Du willst Flanken feststellen! Veränderungen!
Dazu musst du dir den jetzigen Zustand des Pins merken um dann im
nächsten ISR Aufruf damit vergleichen zu können, ob er sich verändert
hat.
Damit kann man diese Frage
> kann mir jemand sagen welche fehlern vorhanden sind.
dann auch beantworten:
Der Hauptfehler ist, dass du Können mit Wollen verwechselst.
Lern Programmieren und zwar von der Pieke auf, vorher hat das alles
keinen Sinn. In 1 bis 2 Monaten bist du soweit, dass du über diese
Aufgabenstellung nur noch lachst.
> kann mir jemand sagen welche fehlern vorhanden sind.
static int8_t last;
void encode_init( void )
{
last = 0;
if( PHASE_A )
last = 1;
enc_delta = 0;
TCCR1B = (1<<WGM12) | (1<<CS11) | (1<<CS10); // CTC, XTAL / 64
OCR1A = (uint16_t)(XTAL / 64.0 * 0.5e-3 - 0.5); // 0,5ms
Vergleichswert
TIMSK1 |= 1<<OCIE1A;//Interrupts aktivieren und damit Timer starten
}
ISR( TIMER1_COMPA_vect ) // 1ms for manual movement
{
int8_t neu;
neu = PHASE_A;
if( neu!=last ){
last=neu;
enc_delta++;
}
}
sonst dreht er und dreht er und dreht er....
danke MaWin für deine Hilfe aber das scheint nicht zu funktionieren. ich gebe die variable val über UARt an einem Terminalprog aus(ohne den Senor an der Platine anzuschliessen).die wird nur bis 32767 inkrementiert. wie kannst du mir das erklären?
fabian-82 schrieb: > der Drehgeber gibt 3600 impulse/s aus Muß das Impulse/U heißen? Denn sonst geht die folgende Formel nicht auf, weil dann die Einheit Impulse*U/s² herauskäme... > also für 30 U/min (0,5 U/s) sind 1800 Impulse/s . > maximal in jeder 0,5 ms muss ein Interrupt auftretten? Das ist ein theoretischer Mindestwert. In der Praxis solltest du für eine saubere Flankenerkennung 3-4 mal schneller abtasten als die höchste Impulsfrequenz (wenn du ein Tastverhältnis von 50% zugrunde legen kannst). Wenn schon mit dem Timer, dann sollten hier 0,2ms bis 0,1ms stehen... Aber ich würde den Geber einfach an einen Zähler anschliessen...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.