2016-04-07 83 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 
}