added precision mode
This commit is contained in:
parent
745d009acc
commit
b49d9411d3
|
@ -68,6 +68,18 @@ void HpglParser::findCommand()
|
||||||
cmdMode = SKIP_M;
|
cmdMode = SKIP_M;
|
||||||
bufferIndex = -1;
|
bufferIndex = -1;
|
||||||
}
|
}
|
||||||
|
else if(buffer[bufferIndex-1] == 'H')
|
||||||
|
{
|
||||||
|
_plotter->setHighPrecision(true);
|
||||||
|
cmdMode = SKIP_M;
|
||||||
|
bufferIndex = -1;
|
||||||
|
}
|
||||||
|
else if(buffer[bufferIndex-1] == 'L')
|
||||||
|
{
|
||||||
|
_plotter->setHighPrecision(false);
|
||||||
|
cmdMode = SKIP_M;
|
||||||
|
bufferIndex = -1;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'U':
|
case 'U':
|
||||||
|
@ -110,6 +122,17 @@ void HpglParser::findCommand()
|
||||||
else cmdMode = ERROR_M;
|
else cmdMode = ERROR_M;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 'E':
|
||||||
|
{
|
||||||
|
if(buffer[bufferIndex-1] == 'D')
|
||||||
|
{
|
||||||
|
_plotter->demo();
|
||||||
|
cmdMode = SKIP_M;
|
||||||
|
bufferIndex = -1;
|
||||||
|
}
|
||||||
|
else cmdMode = ERROR_M;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
94
plotter.cpp
94
plotter.cpp
|
@ -2,8 +2,8 @@
|
||||||
|
|
||||||
const int SCALEX=2;
|
const int SCALEX=2;
|
||||||
const int SCALEY=3;
|
const int SCALEY=3;
|
||||||
const int BACKLASHX=120;
|
const int BACKLASHX=20;
|
||||||
const int BACKLASHY=120;
|
const int BACKLASHY=20;
|
||||||
|
|
||||||
template <typename T> int sgn(T val)
|
template <typename T> int sgn(T val)
|
||||||
{
|
{
|
||||||
|
@ -27,10 +27,16 @@ Point Plotter::getCurrentPos()
|
||||||
|
|
||||||
void Plotter::demo()
|
void Plotter::demo()
|
||||||
{
|
{
|
||||||
moveto(65535,0);
|
moveto(0,0);
|
||||||
moveto(65535,42129);
|
_delay_us(200000);
|
||||||
moveto(0,42129);
|
moveto(32760,0);
|
||||||
|
_delay_us(200000);
|
||||||
|
moveto(32760,21840);
|
||||||
|
_delay_us(200000);
|
||||||
|
moveto(0,21840);
|
||||||
|
_delay_us(200000);
|
||||||
moveto(0,0);
|
moveto(0,0);
|
||||||
|
_delay_us(200000);
|
||||||
pd();
|
pd();
|
||||||
pu();
|
pu();
|
||||||
}
|
}
|
||||||
|
@ -71,25 +77,35 @@ uint16_t Plotter::calculateDelayTime(uint16_t currentDiamondAngle, uint16_t prev
|
||||||
{
|
{
|
||||||
uint16_t delayTime = abs(currentDiamondAngle - prevDiamondAngle);
|
uint16_t delayTime = abs(currentDiamondAngle - prevDiamondAngle);
|
||||||
if ( delayTime > 20000) delayTime = delayTime - 20000;
|
if ( delayTime > 20000) delayTime = delayTime - 20000;
|
||||||
if( prevSteps <= 4 && delayTime < 10000 ) delayTime = delayTime/10;
|
if( prevSteps <= 4 && delayTime < 3000 ) delayTime = delayTime/5;
|
||||||
return delayTime;
|
return delayTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Plotter::moveRelative(Point *pt)
|
|
||||||
{
|
|
||||||
moveRelative((*pt).x,(*pt).y);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Plotter::moveRelative(int32_t deltaX, int32_t deltaY)
|
void Plotter::moveRelative(int32_t deltaX, int32_t deltaY)
|
||||||
{
|
{
|
||||||
if( deltaX > 50 || deltaY > 50 )
|
if( abs(deltaX) > 50 || abs(deltaY) > 50 )
|
||||||
{
|
{
|
||||||
//compensate backlash
|
if( 0 > ((deltaX+currentPos.x)*SCALEX))
|
||||||
if((_prevDiamondAngle < 10000 || _prevDiamondAngle > 30000 ) && deltaX < 0) deltaX = deltaX - BACKLASHX;
|
{
|
||||||
else if ((_prevDiamondAngle > 10000 && _prevDiamondAngle < 30000 ) && deltaX > 0) deltaX = deltaX + BACKLASHX;
|
moveto(0,deltaY+currentPos.y);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if( ~(uint16_t)0 <= (deltaX+currentPos.x)*SCALEX)
|
||||||
|
{
|
||||||
|
moveto(32760,deltaY+currentPos.y);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if((_prevDiamondAngle < 20000) && deltaY < 0) deltaY = deltaY - BACKLASHY;
|
if( 0 > (deltaY+currentPos.y)*SCALEY)
|
||||||
else if ((_prevDiamondAngle > 20000) && deltaY > 0) deltaY = deltaY + BACKLASHY;
|
{
|
||||||
|
moveto(deltaX+currentPos.x,0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if( ~(uint16_t)0 <= (deltaY+currentPos.y)*SCALEY)
|
||||||
|
{
|
||||||
|
moveto(deltaX+currentPos.x,21840);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//delay
|
//delay
|
||||||
uint16_t currentDiamondAngle = diamondAngle(deltaX,deltaY);
|
uint16_t currentDiamondAngle = diamondAngle(deltaX,deltaY);
|
||||||
|
@ -97,6 +113,13 @@ void Plotter::moveRelative(int32_t deltaX, int32_t deltaY)
|
||||||
if ( delayTime > 20000) delayTime = delayTime - 20000;
|
if ( delayTime > 20000) delayTime = delayTime - 20000;
|
||||||
for (uint16_t i = 0; i < delayTime; i++) _delay_us(50);
|
for (uint16_t i = 0; i < delayTime; i++) _delay_us(50);
|
||||||
|
|
||||||
|
/*//compensate backlash
|
||||||
|
if((_prevDiamondAngle < 10000 || _prevDiamondAngle > 30000 ) && deltaX < 0) deltaX = deltaX - BACKLASHX;
|
||||||
|
else if ((_prevDiamondAngle > 10000 && _prevDiamondAngle < 30000 ) && deltaX > 0) deltaX = deltaX + BACKLASHX;
|
||||||
|
|
||||||
|
if((_prevDiamondAngle < 20000) && deltaY < 0) deltaY = deltaY - BACKLASHY;
|
||||||
|
else if ((_prevDiamondAngle > 20000) && deltaY > 0) deltaY = deltaY + BACKLASHY;*/
|
||||||
|
|
||||||
//calculate Interporlation
|
//calculate Interporlation
|
||||||
uint16_t steps = 0; //one step is max 1.28205mm min 0.8547mm
|
uint16_t steps = 0; //one step is max 1.28205mm min 0.8547mm
|
||||||
|
|
||||||
|
@ -106,33 +129,39 @@ void Plotter::moveRelative(int32_t deltaX, int32_t deltaY)
|
||||||
if( abs(deltaX) > abs(deltaY))
|
if( abs(deltaX) > abs(deltaY))
|
||||||
{
|
{
|
||||||
StepSizeX = 100*sgn(deltaX);// -100
|
StepSizeX = 100*sgn(deltaX);// -100
|
||||||
if(deltaY != 0) StepSizeY = ((int32_t)abs(deltaY)*100)/abs(deltaX)*sgn(deltaY); // 0
|
StepSizeY = (deltaY*100)/abs(deltaX); // 0
|
||||||
if(StepSizeX != 0) steps = deltaX/StepSizeX;
|
steps = deltaX/StepSizeX;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(deltaX != 0) StepSizeX = ((int32_t)abs(deltaX)*100)/abs(deltaY)*sgn(deltaX);
|
StepSizeX = (deltaX*100)/abs(deltaY);
|
||||||
StepSizeY = 100*sgn(deltaY);
|
StepSizeY = 100*sgn(deltaY);
|
||||||
if(StepSizeY != 0) steps = deltaY/StepSizeY;
|
steps = deltaY/StepSizeY;
|
||||||
}
|
}
|
||||||
|
|
||||||
//interpolate
|
//interpolate
|
||||||
for( uint16_t i = 0; i < steps; i++)
|
for( uint16_t i = 0; i < steps; i++)
|
||||||
{
|
{
|
||||||
_pwm.setDutyA(65535-(currentPos.x+i*StepSizeX)*SCALEX);
|
_pwm.setDutyA(~((uint16_t)(currentPos.x+i*StepSizeX)*SCALEX));
|
||||||
_pwm.setDutyB(65535-(currentPos.y+i*StepSizeY)*SCALEY);
|
_pwm.setDutyB(~((uint16_t)(currentPos.y+i*StepSizeY)*SCALEY));
|
||||||
_delay_us(2000);
|
_delay_us(2500);
|
||||||
}
|
}
|
||||||
//set prev
|
//set prev
|
||||||
_prevDiamondAngle = currentDiamondAngle;
|
_prevDiamondAngle = currentDiamondAngle;
|
||||||
_prevSteps = steps;
|
_prevSteps = steps;
|
||||||
}
|
}
|
||||||
else _delay_us(100);
|
else
|
||||||
|
{
|
||||||
|
_delay_us(100);
|
||||||
|
}
|
||||||
|
|
||||||
_pwm.setDutyA(65535-(deltaX+currentPos.x)*SCALEX);
|
_pwm.setDutyA(~((uint16_t)(deltaX+currentPos.x)*SCALEX));
|
||||||
_pwm.setDutyB(65535-(deltaY+currentPos.y)*SCALEY);
|
_pwm.setDutyB(~((uint16_t)(deltaY+currentPos.y)*SCALEY));
|
||||||
|
|
||||||
if( deltaX > 50 || deltaY > 50 )
|
_delay_us(3000);
|
||||||
|
if(highPrecision) _delay_us(80000);
|
||||||
|
|
||||||
|
if( abs(deltaX) > 50 || abs(deltaY) > 50 || highPrecision )
|
||||||
{
|
{
|
||||||
//set current position
|
//set current position
|
||||||
currentPos.x = deltaX+currentPos.x;
|
currentPos.x = deltaX+currentPos.x;
|
||||||
|
@ -140,6 +169,11 @@ void Plotter::moveRelative(int32_t deltaX, int32_t deltaY)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Plotter::setHighPrecision(bool in)
|
||||||
|
{
|
||||||
|
highPrecision = in;
|
||||||
|
}
|
||||||
|
|
||||||
void Plotter::moveto(Point *pt)
|
void Plotter::moveto(Point *pt)
|
||||||
{
|
{
|
||||||
moveto((*pt).x,(*pt).y);
|
moveto((*pt).x,(*pt).y);
|
||||||
|
@ -147,8 +181,8 @@ void Plotter::moveto(Point *pt)
|
||||||
|
|
||||||
void Plotter::moveto(const uint16_t nx, const uint16_t ny)
|
void Plotter::moveto(const uint16_t nx, const uint16_t ny)
|
||||||
{
|
{
|
||||||
int32_t deltaX = nx - currentPos.x; //117 units per mm
|
int32_t deltaX = (int32_t)nx - (int32_t)currentPos.x; //117 units per mm
|
||||||
int32_t deltaY = ny - currentPos.y; //121 units per mm
|
int32_t deltaY = (int32_t)ny - (int32_t)currentPos.y; //121 units per mm
|
||||||
moveRelative(deltaX, deltaY);
|
moveRelative(deltaX, deltaY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,8 @@ private:
|
||||||
|
|
||||||
Serial* _serial;
|
Serial* _serial;
|
||||||
|
|
||||||
|
bool highPrecision=false;
|
||||||
|
|
||||||
uint16_t diamondAngle(int16_t y, int16_t x);
|
uint16_t diamondAngle(int16_t y, int16_t x);
|
||||||
uint16_t calculateDelayTime(uint16_t currentDiamondAngle, uint16_t prevDiamondAngle, uint16_t prevSteps);
|
uint16_t calculateDelayTime(uint16_t currentDiamondAngle, uint16_t prevDiamondAngle, uint16_t prevSteps);
|
||||||
|
|
||||||
|
@ -36,10 +38,10 @@ public:
|
||||||
void basicposition();
|
void basicposition();
|
||||||
void pd();
|
void pd();
|
||||||
void pu();
|
void pu();
|
||||||
|
void setHighPrecision(bool in);
|
||||||
void moveto(Point *pt);
|
void moveto(Point *pt);
|
||||||
void moveto(uint16_t nx,uint16_t ny);
|
void moveto(uint16_t nx,uint16_t ny);
|
||||||
void moveRelative(int32_t deltaX, int32_t deltaY);
|
void moveRelative(int32_t deltaX, int32_t deltaY);
|
||||||
void moveRelative(Point *pt);
|
|
||||||
Point getCurrentPos();
|
Point getCurrentPos();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue