问题描述
@H_502_0@我正在尝试开发一种arduino代码,该代码通过串行通信使用C#程序运行步进电机。我还使用Accelstepper库,尤其是moveto()和run()函数。我从C#发送了3500和200.000的maxSpeed和step值,并且电动机立即开始运行。我确定它可以完成所有步骤,但是过了一会儿,我注意到步进电机从未达到其最大速度,并且卡在了3200-3300范围内。因此,由于完成时间增加了。如果我给出的步数超过200.000,则估计完成时间与实际完成时间之间的差距将成倍增加。如果我将速度设为1000,则实际速度或多或少为970。由于需要扭矩,我不得不使用加速功能。然后我搜索了这个问题,有人说这是由于Accelstepper库引起的,该库包含run()函数和我在循环部分中编写的其他内容。特别是我无法确定问题的原因是Arduino,AccelStepper库还是我编写的代码。你能帮我解决问题吗?
注意:使用Arduino Mega 2560。
Arduino代码如下:
#include <AccelStepper.h>
#include <stdio.h>
#define STEP_PIN_C 5 //31
#define DIRECTION_PIN_C 23 //32
#define ENABLE_PIN_C 24 //33
#define SET_acceleration 600.0
AccelStepper stepper(1,STEP_PIN_C,DIRECTION_PIN_C);
unsigned long oldTime=0;
unsigned long Now;
float newSpeed;
float maxSpeed = 3500.0;
bool newDataBit,runAllowed = false,addingProg=false,mainProg=false;
char commandChar;
long currentPosition;
long int steps = 0,mainNewStep,addednewStep,memmainStep;
void checkSerial();
void checkRunning();
void stopMotor();
void runMotor();
void sendInfo();
const unsigned long delayTime = 1000;
unsigned long timer;
int count = 0;
bool running = false;
void setup()
{
Serial.begin(9600);
pinMode(ENABLE_PIN_C,OUTPUT);
digitalWrite(ENABLE_PIN_C,HIGH);
stepper.setCurrentPosition(0); //initial value
stepper.setMaxSpeed(0.0); //initial value
stepper.setacceleration(SET_acceleration); //initial value
}
void loop()
{
sendInfo();
checkRunning();
checkSerial();
}
void checkRunning()
{
if (runAllowed == true)
{
if (stepper.distancetoGo() == 0)
{
stopMotor();
checkSerial();
}
else
{
runMotor();
checkSerial();
}
}
}
void checkSerial()
{
if (Serial.available())
{
newDataBit = true;
commandChar = Serial.read();
}
if (newDataBit == true)
{
///DoStuff depends on what is received as commandChar via serial port
mainProgram(stepper.currentPosition(),newSpeed,mainNewStep);
newDataBit = false;
}
}
void runMotor(){
digitalWrite(ENABLE_PIN_C,LOW);
stepper.run();
running = true;
}
void stopMotor(){
stepper.setCurrentPosition(0);
digitalWrite(ENABLE_PIN_C,HIGH);
stepper.stop();
running = false;
timer = millis() + delayTime;
}
void mainProgram(long currentPositionValue,float maxSpeedValue,long stepValue)
{
mainProg = true;
if (stepper.distancetoGo() == 0) //YOLUMU TAMAMLADIM
{
addingProg = false;
steps = stepValue;
stepper.setCurrentPosition(currentPositionValue);
//stepper.setSpeed(0);
stepper.setMaxSpeed(maxSpeedValue);
stepper.moveto(steps);
}
else
{
steps = stepValue + steps;
stepper.setCurrentPosition(currentPositionValue);
//stepper.setSpeed(0);
stepper.setMaxSpeed(newSpeed);
stepper.moveto(steps);
}
}
void sendInfo(){
Now = millis();
if(Now-oldTime > 1000){ //saniyede 1
Serial.print(stepper.currentPosition());
Serial.print(" ");
Serial.print(stepper.isRunning());
Serial.print(" ");
Serial.println(stepper.speed());
oldTime = Now;
}
}
解决方法
可以可靠支持的最快电机速度约为4000 在Arduino(如Uno)上以16 MHz的时钟频率每秒每秒步进 等
这是如果您除了运行步进器之外什么都不做。 您检查串行接口并每秒发送多条线路。两者都很贵。