added precision mode

This commit is contained in:
IMback 2017-11-06 12:20:13 +01:00
parent 745d009acc
commit b49d9411d3
3 changed files with 92 additions and 33 deletions

View file

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

View file

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

View file

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