0

进入上下文我这样做:通过输入到驱动器(A4988)的脉冲频率的变化来驱动步进电机(对于这个问题,没有必要知道它的功能)。现在改变了脉冲的频率(它们改变了发动机转速)。您需要知道,对于电机轴 1 整圈必须获得 200 个脉冲(发动机每步 1.8° 度)。

我得到了引擎,让他在 1 秒内转了一圈。周期 = 0.005s

为了对此进行编程,我使用了组件:TimerUnit_LDD。频率为 163840 Hz 计数

在整回合1的情况下,经常使用这个功能。

---- main.c

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

参数 410 与我想要的周期进行比较,发送脉冲通过更改引脚的值来编程,同时考虑到高脉冲和低脉冲,如下所示:

----- 事件.c

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

严重的周期公式为 819.2,考虑到上述严重的近似于 409.6 和 410(在示波器中看到的频率为 200 Hz(ok)。

已经在上下文中输入问题是这样的:

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

使用此代码,我尝试检查频率计算是否正确,并且在一秒钟内转一圈。但发生的情况是它提供了旋转但偏移了一点。我想这会经历每行代码所需的运行时。

我想知道的是,如何获得事件中变量的数值?我怎么能做这样的事情。

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

----- 事件.c

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

GetValue (x) 此函数将获取Events.c 中x 的值,并定义多个脉冲来控制espefico。

取一个变量并受计数器影响,这达到 200(1 秒内 1 转)。

这可以确定,menera 是孤独而孤独的,不多也不少,只有 200 个脉冲。

我要求这个和我对 CNC 机器的程序一样具体,并且太重要了,精度是最高的。

我希望你能理解,我会说西班牙语,这是由 Chrome 翻译的

C语言编程,飞思卡尔KL25Z,CodeWarrior,OPEN_SDA,

4

1 回答 1

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
 }
于 2016-04-07T06:33:35.550 回答