2016-04-07 93 views
0

進入環境我正在這樣做: 驅動步進電機,通過脈衝頻率輸入到驅動器(A4988)的變化(不需要知道這個功能對於這個問題)。現在並且改變了脈衝的頻率(它們改變了發動機轉速)。您需要知道,對於電機軸1,完整轉動必須獲得200個脈衝(發動機每步1.8°)。CodeWarrior從事件獲取變量值c

我得到了發動機,並在1秒內完成了轉彎。 週期= 0.005s

要編程,我使用組件:TimerUnit_LDD。 以163840赫茲的頻率計數

在整個轉彎1的情況下,經常使用此功能。

---- main.c中

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

參數410進行比較,我想要的期間,由於在發送通過改變銷的值編程脈衝考慮兩個高和低脈衝,這樣的:

----- Events.c

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

考慮到上述嚴重近似值409.6和410(在示波器頻率中看到的是200 Hz(ok)),認真制定819.2的時間段。

在上下文中已經進入了問題是這樣的:

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

有了這個代碼是我嘗試檢查頻率計算是正確的,並在一秒鐘內將1轉。但是會發生什麼呢是它給了旋轉,但是偏移了一點。我想這是通過每行代碼所需的運行時間。

我想知道的是,怎樣才能獲得事件中變量的數值?我怎麼能這樣做。

---- 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)此函數將獲取Events.c中x的值,並定義一些脈衝來控制espefico。

取一個變量並受到計數器的影響,並且達到200(1秒內1轉)。

這樣就可以確定menera是孤獨的,孤獨的,不多也不少,只有200個脈衝。

我需要這個具體的,因爲我desarrolando數控機牀的程序,是太重要了精度是最高的。

我希望你明白,我說西班牙語,這是由Chrome

在C語言中, 飛思卡爾KL25Z, 的CodeWarrior, OPEN_SDA編程翻譯,

+0

哇,CodeWarrior的是,仍然周圍?我記得1990年左右使用它,不知道它仍然存在。 –

+0

在我決定使用飛思卡爾CodeWarrior KL25Z的大學裏,它允許您運行調試代碼,從而更好地理解相同的行爲。 –

回答

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 
}