Re: Schrittmotor Impulserzeug. / Timer ISR zu langsam Kategorie: CC-Pro Unit & Appl.Board (von Jo - 15.12.2008 17:44) | ||
Als Antwort auf Schrittmotor Impulserzeug. / Timer ISR zu langsam von Jürgen - 15.12.2008 9:27 | ||
| ||
Hi, du kannst bei PWM doch das Signal auch auf einen freien Interruptfähigen Eingang legen; Damit kannst du zählen, allderdings kann ich nicht sagen ob es bis 25KHz reicht. Bei 25KHz käme ein Interrupt alle 40µs; Teste es doch einfach mal. Good luck Jo > Hallo Forenuser, > > ich benötige erneut eure Hilfe, hatte den Beitrag schon mal gepostet aber keine zufriedenstellende > Antwort erhalten (Ulli: vielen Dank für Deinen Tipp: der Nachteil an PWM ich kann die Pulse nicht > genau zählen was aber Bedingung ist oder ?????) > > Ich möchte eine Schrittmotoransteuerung mit dem CControl realisieren. Die Endstufenkarte des > Steppers verlangt ein Step/Direction Signal. Mein Frage ist dabei wie kann ich solche Steps > erzeugen die im Bereich von 0..25kHz.Bedingung ist das ich genau weis wieviele Pulse ausgegeben > wurden= Weginfo. > - Ist es sinnvoll das mit dem Timer zu realisieren oder mit Absdelay? > - Gibt es eventuell eine Lib oder Funktion dafür? > - Mein Beispiel von unten funktioniert einwandfrei, ist nur viel zu langsam. Egal welchen Preteiler / > Zählkonstante ich verwende, diese Routine mit ISR kommt nicht über 800Hz! > - Gibt es eine andere Lösung? > - Kann ich diese ISR mit Timer mit der neuen IDE in Assembler programmieren und ist sie dann > schneller? Gibt es evtl. schon Assembler Doku mit Beispielen für die neue IDE?? > > Schon mal vielen Dank für die Hilfe > Jürgen > > Beispiel: > #define AnzSteps = 2000 // Anz.Steps bis Schleife abbricht > byte busy; // globale Variablendeklaration > word stepcount; // zählt die anzahl der perioden = steps > > void Timer0_ISR(void) > { > busy=0; > //Timer_T0Stop(); //das bring nichts, laut beispiel!? > Irq_GetCount(INT_TIM0COMP); > } > > void main(void) > { > stepcount=0; > Port_DataDirBit(PORT_LED1,PORT_OUT); // PORT für Ausgabe vorbereiten > Irq_SetVect(INT_TIM0COMP,Timer0_ISR); // Interrupt Service Routine definieren > Port_DataDirBit(PORT_LED2,PORT_OUT); // Ausgabe vorbereiten > Port_WriteBit(PORT_LED2,PORT_ON); // Ausgang Led2 einschalten > > while (stepcount > Timer_T0Time(150,PS0_8); > Port_WriteBit(PORT_LED1,0); // Ausgang auf 0 setzen > busy=1; > while (busy); > Timer_T0Time(150,PS0_8); > Port_WriteBit(PORT_LED1,1); // Ausgang auf 1 setzen > busy=1; > while (busy); > stepcount++; > } > Port_WriteBit(PORT_LED2,PORT_OFF); // Ausgang LED2 ausschalten > } > > | ||
Antwort schreiben Antworten: |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum