arduino - 多个具有相同执行时间的滚珠丝锥联动步进电机的并行访问
问题描述
我正在尝试编写一个 3 轴运动步进连杆滚珠丝杠设置,我的输入是 xdistance to move、ydistance to move、z distance to move、持续时间和执行循环时间。我需要将具有相同开始时间和停止时间的 3axis 移动在一起。
我写了下面的代码
x移动距离= 40mm
y移动距离= 10mm
z 移动距离 = 5mm
持续时间 = 4 秒
执行的循环时间数 = 2
我面临一个问题,即所有三个步进电机的启动和停止时间都相同,而所有的移动距离都不同。但是根据我的代码,它应该同时启动和停止,如果距离不同,则移动速度会相应变化。
int t = 4;
int xDist = 40;
const int xPitch = 5;
const int xStepsPerRevolution = 200;
float x_STEP_PERIOD_MS, x_STEP_PERIOD_MS1;
int x_STEPS_NOS = 0;
int x_STEPS_NOS1 = 0;
const int x_STEP_PIN = 5;
const int x_DIR_PIN = 3;
unsigned long xNextStepTime, xNextStepTime1;
volatile int xflag = 1;
volatile int xbackward_finished = 0;
int yDist = 10;
const int yPitch = 5;
const int yStepsPerRevolution = 200;
float y_STEP_PERIOD_MS, y_STEP_PERIOD_MS1;
int y_STEPS_NOS = 0;
int y_STEPS_NOS1 = 0;
const int y_STEP_PIN = 9;
const int y_DIR_PIN = 7;
unsigned long yNextStepTime, yNextStepTime1;
volatile int yflag = 1;
volatile int ybackward_finished = 0;
int zDist = 5;
const int zPitch = 10;
const int zStepsPerRevolution = 400;
float z_STEP_PERIOD_MS, z_STEP_PERIOD_MS1;
int z_STEPS_NOS = 0;
int z_STEPS_NOS1 = 0;
const int z_STEP_PIN = 11;
const int z_DIR_PIN = 13;
unsigned long zNextStepTime, zNextStepTime1;
volatile int zflag = 1;
volatile int zbackward_finished = 0;
int no_of_times=2;
void setup()
{
pinMode(x_STEP_PIN, OUTPUT);
digitalWrite(x_STEP_PIN, LOW);
pinMode(x_DIR_PIN, OUTPUT);
pinMode(A1, INPUT_PULLUP);
pinMode(A2, INPUT_PULLUP);
xNextStepTime = millis();
xNextStepTime1 = millis();
pinMode(y_STEP_PIN, OUTPUT);
digitalWrite(y_STEP_PIN, LOW);
pinMode(y_DIR_PIN, OUTPUT);
pinMode(A3, INPUT_PULLUP);
pinMode(A4, INPUT_PULLUP);
yNextStepTime = millis();
yNextStepTime1 = millis();
pinMode(z_STEP_PIN, OUTPUT);
digitalWrite(z_STEP_PIN, LOW);
pinMode(z_DIR_PIN, OUTPUT);
pinMode(A5, INPUT_PULLUP);
pinMode(A6, INPUT_PULLUP);
zNextStepTime = millis();
zNextStepTime1 = millis();
Serial.begin(9600);
}
void moveforward()
{
x_STEP_PERIOD_MS = ((1000 * t) / ((xStepsPerRevolution / xPitch) * xDist));
unsigned long xtime0 = millis();
if ( (xflag == 1) && ((long)(xNextStepTime - xtime0) < 0) && (x_STEPS_NOS < ((xStepsPerRevolution / xPitch) * xDist)) && ((digitalRead(A1)*digitalRead(A2)) == 1))
{{
digitalWrite(x_DIR_PIN, LOW);
xNextStepTime = xtime0 + x_STEP_PERIOD_MS;
digitalWrite(x_STEP_PIN, HIGH);
delayMicroseconds(2);
digitalWrite(x_STEP_PIN, LOW);
x_STEPS_NOS = x_STEPS_NOS + 1;
}
if (((long)(xNextStepTime - xtime0) == 0) || (x_STEPS_NOS == ((xStepsPerRevolution / xPitch) * xDist)))
{
xflag = 0; xtime0 = 0; x_STEPS_NOS = 0;
}
}
y_STEP_PERIOD_MS = ((1000 * t) / ((yStepsPerRevolution / yPitch) * yDist));
unsigned long ytime0 = millis();
if ( (yflag == 1) && ((long)(yNextStepTime - ytime0) < 0) && (y_STEPS_NOS < ((yStepsPerRevolution / yPitch) * yDist)) && ((digitalRead(A3)*digitalRead(A4)) == 1))
{{
digitalWrite(y_DIR_PIN, HIGH);
yNextStepTime = ytime0 + y_STEP_PERIOD_MS;
digitalWrite(y_STEP_PIN, HIGH);
delayMicroseconds(2);
digitalWrite(y_STEP_PIN, LOW);
y_STEPS_NOS = y_STEPS_NOS + 1;
}
if (((long)(yNextStepTime - ytime0) == 0) || (y_STEPS_NOS == ((yStepsPerRevolution / yPitch) * yDist)))
{
yflag = 0; ytime0 = 0; y_STEPS_NOS = 0;
}
}
z_STEP_PERIOD_MS = ((1000 * t) / ((zStepsPerRevolution / zPitch) * zDist));
unsigned long ztime0 = millis();
if ( (zflag == 1) && ((long)(zNextStepTime - ztime0) < 0) && (z_STEPS_NOS < ((zStepsPerRevolution / zPitch) * zDist)) && ((digitalRead(A5)*digitalRead(A6)) == 1))
{{
digitalWrite(z_DIR_PIN, LOW);
zNextStepTime = ztime0 + z_STEP_PERIOD_MS;
digitalWrite(z_STEP_PIN, HIGH);
delayMicroseconds(2);
digitalWrite(z_STEP_PIN, LOW);
z_STEPS_NOS = z_STEPS_NOS + 1;
}
if (((long)(zNextStepTime - ztime0) == 0) || (z_STEPS_NOS == ((zStepsPerRevolution / zPitch) * zDist)))
{
zflag = 0; ztime0 = 0; z_STEPS_NOS = 0;
}
}
}
void movebackward()
{
x_STEP_PERIOD_MS1 = ((1000 * t) / ((xStepsPerRevolution / xPitch) * xDist));
unsigned long xtime1 = millis();
if ( (xflag == 0) && ((long)(xNextStepTime1 - xtime1) < 0) && (x_STEPS_NOS1 < ((xStepsPerRevolution / xPitch) * xDist)) && ((digitalRead(A1)*digitalRead(A2)) == 1))
{{
digitalWrite(x_DIR_PIN, HIGH);
xNextStepTime1 = xtime1 + x_STEP_PERIOD_MS1;
digitalWrite(x_STEP_PIN, HIGH);
delayMicroseconds(2);
digitalWrite(x_STEP_PIN, LOW);
x_STEPS_NOS1 = x_STEPS_NOS1 + 1;
}
if (((long)(xNextStepTime1 - xtime1) == 0) || (x_STEPS_NOS1 == ((xStepsPerRevolution / xPitch) * xDist)))
{
xflag = 1; xtime1 = 0; x_STEPS_NOS1 = 0;
xbackward_finished = xbackward_finished + 1;
}
}
y_STEP_PERIOD_MS1 = ((1000 * t) / ((yStepsPerRevolution / yPitch) * yDist));
unsigned long ytime1 = millis();
if ( (yflag == 0) && ((long)(yNextStepTime1 - ytime1) < 0) && (y_STEPS_NOS1 < ((yStepsPerRevolution / yPitch) * yDist)) && ((digitalRead(A3)*digitalRead(A4)) == 1))
{{
digitalWrite(y_DIR_PIN, LOW);
yNextStepTime1 = ytime1 + y_STEP_PERIOD_MS1;
digitalWrite(y_STEP_PIN, HIGH);
delayMicroseconds(2);
digitalWrite(y_STEP_PIN, LOW);
y_STEPS_NOS1 = y_STEPS_NOS1 + 1;
}
if (((long)(yNextStepTime1 - ytime1) == 0) || (y_STEPS_NOS1 == ((yStepsPerRevolution / yPitch) * yDist)))
{
yflag = 1; ytime1 = 0; y_STEPS_NOS1 = 0;
ybackward_finished = ybackward_finished + 1;
}
}
z_STEP_PERIOD_MS1 = ((1000 * t) / ((zStepsPerRevolution / zPitch) * zDist));
unsigned long ztime1 = millis();
if ( (zflag == 0) && ((long)(zNextStepTime1 - ztime1) < 0) && (z_STEPS_NOS1 < ((zStepsPerRevolution / zPitch) * zDist)) && ((digitalRead(A5)*digitalRead(A6)) == 1))
{{
digitalWrite(z_DIR_PIN, HIGH);
zNextStepTime1 = ztime1 + z_STEP_PERIOD_MS1;
digitalWrite(z_STEP_PIN, HIGH);
delayMicroseconds(2);
digitalWrite(z_STEP_PIN, LOW);
z_STEPS_NOS1 = z_STEPS_NOS1 + 1;
}
if (((long)(zNextStepTime1 - ztime1) == 0) || (z_STEPS_NOS1 == ((zStepsPerRevolution / zPitch) * zDist)))
{
zflag = 1; ztime1 = 0; z_STEPS_NOS1 = 0;
zbackward_finished = zbackward_finished + 1;
}
}
}
void loop()
{
moveforward();
movebackward();
if (xbackward_finished == no_of_times) {
while (1) {
}
}
}
如果有人用不同的编码方法解决了类似类型的问题,请与我分享。
我也尝试使用 Arduino due 的调度程序库包,但由于多个 LED 示例代码工作正常,但多个电机无法正常工作。
解决方案
推荐阅读
- angular - HighChart 亮点
- python - 将使用 sakila 数据库生成加拿大城市的脚本?
- java - 预热会加快在 Java 中发送 http 请求的速度吗?
- html - 背景变成白色而不是透明(引导程序)
- svn - 如何从 CLI 提交 svn propset?
- java - 无法使用 Selenium ChromeDriver SerenityBDD 设置默认下载路径
- git - 有没有办法根据 repo 克隆中可用的信息来检测 Git 存储库的提供者?
- ssl - haproxy 显示很多 ssl 握手失败并且仍然加载页面
- python - 只读取符合条件的 .parquet 文件的特定行?
- python - Num_workers > 0 在 SLURM 中创建内存错误?