2016-04-07 11 views
0

in den Kontext eingeben Ich mache das: Fahren Sie einen Schrittmotor durch die Variation der Pulsfrequenz Eingang zu einem Treiber (A4988) (Es ist nicht notwendig, die Funktionsweise zu wissen für diese Frage). Jetzt und variiert die Frequenz der Impulse (Sie ändern die Motordrehzahl). Sie müssen wissen, dass für die Motorwelle 1 volle Umdrehung 200 Impulse bekommen muss (Der Motor ist 1,8 ° Grad pro Schritt).CodeWarrior Get variable value von einem event.c

Ich habe den Motor und machen ihn eine volle Umdrehung in 1 Sekunde. Periode = 0.005s

Um dies zu programmieren verwende ich die Komponente: TimerUnit_LDD. Mit einer Frequenz von 163840 Hz zählen

Im Falle der ganzen Umdrehung 1, um diese häufig zu verwenden diese Funktion.

---- main.c

TU1_Enable (TU1_DeviceData);  TU1_SetPeriodTicks (TU1_DeviceData, 410);

Der Parameter 410 ist gegenüber dem Zeitraum ich will, als Impulse sendet programmiert, indem der Wert eines Stiftes berücksichtigt ändert sowohl die hohe und der niedrige Impuls, wie folgt aus:

----- Events.c

TU1_OnCounterRestart void (* UserDataPtr LDD_TUserData) {  Step1_NegVal();  }

Die Frist für ernsthafte Formulierungen 819.2, unter Berücksichtigung der obigen schweren annähert 409,6 und 410 (in einer Oszilloskop-Frequenz gesehen ist 200 Hz (ok).

Bereits im Kontext trat das Problem ist folgendes:

---- main.c

TU1_Enable (TU1_DeviceData); // Enable the counter TU1_SetPeriodTicks (TU1_DeviceData, 410); // Setting the desired period

for (;;) {            TU1_Enable (TU1_DeviceData);            WAIT1_Waitms (1000); // Rotation time  TU1_Enable (TU1_DeviceData); // Disable the counter }

Mit diesem Code ist das, was ich versuche, dass die Frequenz zu überprüfen Berechnung war korrekt und in 1 Sekunde würde 1 drehen. Aber was passiert ist, dass es die Rotation gibt, aber etwas mehr versetzt ist. Ich denke, das läuft durch die Laufzeit, die für jede Codezeile erforderlich ist.

Was ich wissen möchte ist, wie könnte man den numerischen Wert einer Variablen in einem Ereignis erhalten? Wie könnte ich so etwas tun?

---- main.c

TU1_Enable (TU1_DeviceData); // Initialize the counter TU1_SetPeriodTicks (TU1_DeviceData, 410); // Setting the desired period

for (;;) { for (;;) {       if (GetValue (x) == 200) break; // GetValue (x) This function is what I want to achieve } WAIT1_Waitms (1000); }

----- Events.c

TU1_OnCounterRestart void (* UserDataPtr LDD_TUserData) {  Step1_NegVal(); x = x + 1; }

GetValue (x) Diese Funktion würde den Wert von x erhalten, der in Events.c ist und eine Anzahl von Impulsen definieren, um espefico zu steuern.

Nehmen Sie eine Variable und wird durch den Zähler betroffen, und das wird zu 200 (für 1 Umdrehung in 1 Sekunde).

Dies hätte die Gewissheit, dass Menera alleine und einsam gesendet wird, nicht mehr und nicht weniger als 200 Impulse.

Ich benötige dies so spezifisch wie ich bin desarrolando das Programm für eine CNC-Maschine und ist zu wichtig, Präzision ist die höchste.

Ich hoffe, Sie verstehen, und ich spreche Spanisch und diese von Chrome

in C-Sprache programmiert übersetzt wurde, Freescale KL25Z, Codewarrior, OPEN_SDA,

+0

wow, Codewarrior, ist, dass nach wie vor um? Ich erinnere mich daran, es um 1990 zu benutzen, wusste nicht, dass es noch existierte. –

+0

an der Universität, wo ich mich entschloss, Freescale CodeWarrior KL25Z zu verwenden, mit dem Sie Debugging-Code ausführen können, so dass Sie das Verhalten desselben besser einschätzen können. –

Antwort

0
I managed to implement something but I think it may be easier to get 


-----(main.c) 

extern int count;//called external variable 

int main(void){ 
PE_low_level_init(); 

TU1_Enable(TU1_DeviceData);       
TU1_SetPeriodTicks(TU1_DeviceData,410);//T=0.005 sec    

for(;;){ 
    Term1_Cls();// Clear Console 
    WAIT1_Waitms(1000); 
    Term1_MoveTo(0,0);// Set 0,0 in Console 



for(;;){ 
    TU1_Enable(TU1_DeviceData); 
    Term1_SendNum(count); 
    Term1_CRLF(); 
     if (count>400){//amount of high and low pulse counting 
      count=0; 
      TU1_Disable(TU1_DeviceData); 
      break; 
     } 
} 
WAIT1_Waitms(1000); 
Dir1_NegVal(); 
} 


----(Events.c) 


int count; 

void TU1_OnCounterRestart(LDD_TUserData *UserDataPtr) 
{ 
    Step1_NegVal(); 
    count=count+1; //counter 
}