Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

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
Ich nutze:
CC-Pro 128 Application Board
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: