Moin, ich arbeite im Moment auch an einer Frässteuerung für einen Atmel.
Hab dazu allerdings das ganze erstmal mit einem Java Programm "simuliert", da hab ich auch längere Zeit an dieser eigentlich doch recht simplen Kreisfunktion geschrieben. Hier mal der Quellcode, ist zwar für Java, aber der Syntax ist eigentlich wie C, könnte man also mit kleinen änderungen direkt auf den µC portieren. Ist denk ich recht leicht zu durchschauen. Zuerst werden die Winkel berechnet bei denen der Kreisbogen anfängt und wo er aufhört. Dann fährt er vom Anfangswinkel zum Endwinkel den Kreisbogen ab. Ich verwende dort ein Funktion distance() die mir die Distanz zwischen zwei punkten berechnet und die funktion MoveTo welche die Fräse (ohne interpolation) zu den angegeben Koordinaten fährt. Die Funktion getposY() bzw. getposX() liefert die Aktuelle Position des Fräsers.
Der rest erschließt sich denke ich so.
x1, y1 gibt beim Funktionsaufruf den Zielpunkt an, xmid / ymid den Mittelpunkt und d die Richtug (1 CW, -1 CCW). Der Startpunkt ergibt sich ja aus der aktuellen Position des Fräsers.
Code:
void arc (int x1, int y1, int xmid, int ymid, int d) {
int i;
int X0 = x1,
Y0 = y1,
r = distance(X0, Y0, xmid, ymid);
d=-d;
double alpha, w1, w2;
int dx, dy;
//calcualtion of starting Angle w1****************************************
dy = getposY() - ymid;
dx = getposX() - xmid;
if (dx == 0) {
if (dy >0) {
w1 = 90;
}
else {
w1 = 270;
}
}
else if (dy == 0) {
if (dx >0) {
w1 = 0;
}
else {
w1 = 180;
}
}
else {
alpha = Math.atan((double)dy / dx) * bg;
if ((dx >0) && (dy < 0)) { //4. quadrant
w1 = 360+alpha;
}
else if ((dx< 0) && (dy < 0)) { //3. Quadrant
w1 = 180+alpha;
}
else if ((dx <0) && (dy > 0)) { //2. Quadrant
w1 = 180+alpha;
}
else { //1. Quadrant
w1 = alpha;
}
}
// Calculation of end Angle w2
dy = y1 - ymid;
dx = x1 - xmid;
if (dx == 0) {
if (dy >0) {
w2 = 90;
}
else {
w2 = 270;
}
}
else if (dy == 0) {
if (dx >0) {
w2 = 0;
}
else {
w2 = 180;
}
}
else {
alpha = Math.atan((double)dy / dx) * bg;
if ((dx >0) && (dy < 0)) { //4. quadrant
w2 = 360+alpha;
}
else if ((dx< 0) && (dy < 0)) { //3. Quadrant
w2 = 180+alpha;
}
else if ((dx <0) && (dy > 0)) { //2. Quadrant
w2 = 180+alpha;
}
else { //1. Quadrant
w2 = alpha;
}
}
if ((w2 < (w1)) && (d >0)) {
w2+=360;
}
if ((w2 > (w1)) && (d <0)) {
w2-=360;
}
//plot Circle
for (i = (int) w1 ; i != (int) w2; i+=d)
{
X0 = (int) (xmid + r * Math.cos((double)i / bg));
Y0 = (int) (ymid + r * Math.sin((double)i / bg));
moveTo(X0, Y0, getposZ());
}
moveTo(x1, y1, getposZ());
}
Ich wäre sehr interessiert daran wie du die Fräsgeschwindigkeit regeln willst, mir ist da noch nicht die richtige idee gekommen.
Vielleicht könnte man ja auch mal ein Gemeinschaftsprojekt zur Cnc Steuerung mit Atmel aufstellen. Ist ja irgendwie auch blöd wenn jeder alles neu erfinden muss. Oder gibts sowas schon?
Lesezeichen