进入上下文我这样做:通过输入到驱动器(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,