CNC-Engine V0.9

Als ich damals mit der CNC-Fräserei anfing, stellte ich mir drei Bedingungen:
1. so billig wie möglich,
2. so viel wie möglich selber machen,
3. alles verstehen.
Das heißt, von der Mechanik über Elektrotechnik, analogen Leistungselektronik, digitalen Elektronik bis hin zur Software alles zu durchdringen, zu vertstehen selbst zu fertigen bzw. zu programmieren, also jede Schraube, jeden Lötklecks, jeden Chip und jedes Bit persönlich mit dem Vornahmen ansprechen zu können.
Also programmierte ich ein einfaches CNC-Programm zur Ausgabe von Tack-Richtungssignalen auf die parallele Schnittstelle des PC. Es funktionierte recht gut bis zu Schrittraten von 10 kHz. Darüber hinaus unterbrach irgend ein Windows-Interrupt die Schrittsequenz und die Schrittmotoren blieben stehen. Als Importformat standen HPGL Dateien zur Verfügung. Später unter WindowsXP nutzte ich einen für private Anwendungen freien Hardwaretreiber von "entech". Am Ende verfügte das Programm über einen Interrupteingang für einen inkrementalen Encoder zum Anfahren des Werkstückes und über frei definierbare Pins.

Ansichten:

CNC-Engine Software CNC-Engine Software CNC-Engine Software CNC-Engine Software

Mit diesem Programm habe ich 8-9 Jahre gearbeitet. Als die neue Maschine fertig war, genügte mir dieses Programm nicht mehr. Ich fing an, einen Controller auf ATMEL-Basis zu programmieren.

Atmega-CNC-Controller

Der CNC-Controller basiert auf einem Atmega128 und hat nur eine minimale externe Beschaltung, LCD-Display (4x27 Zeichen), einige Nand-Gatter, Quarz, Spannungsstabilisierung und RS232-Schnittstelle. Eigentlich war sie nur als Testplatine gedacht, arbeitet aber nun schon seit einigen Jahren zuverlässig.
Die Software wurde in c geschrieben und stellt einen NC-Interpreter dar, der die Standard-G-Codes interpretiert. Die Befehle erhält der Controller über ein beliebiges COM-Terminal mit Software-Handshake (Xon/Xoff).
Die Schrittsequenzen werden über einen der Timer erzeugt, wobei die linearen und zirkularen Bewegungen mit einem Bresenham-Algorithmus berechnet werden. Der Bresenham-Algorithmus für die zirkularen Bewegungen ist so modifiziert, dass eine Kreisbahn mit beliebigem Anfangs- und Endpunkt, so auch mehrere Umläufe, gefahren werden kann. Somit ist auch eine Helix möglich. Mir ist es jedoch nicht gelungen, die genaue interne Schrittzahl für eine beliebige Bresenham-Kreisbahn voraus zu berechnen. Dies ist allerdings notwendig, wenn ein Gewinde mit definierter Steigung gerfertigt werden soll, um die Z-Achse mit dem jeweiligen Phasenwinkel zu synchronisieren. Als Ausweg führe ich bei Erkennen eines Helixbefehls die Simulation eines Umlaufes durch und ermittle so die Schrittzahl. Dies dauert nur wenige Millisekunden.
Der Controller beherrscht außerdem die vollständige Koordinatentransformation. Drehung, Verschiebung, Varia und Spiegelung sind im 3D-Raum möglich. Dies ist sehr nützlich, wenn das Werkstück (NC-Datei) gegenüber dem Rohling nicht in der richtigen Position liegt.
Besonders angenehm ist die Gewindefertigung mit einem einzigen Befehl (G5 - Rechtsgewinde, G6 - Linksgewinde). Als Parameter werden X,Y - Gewindemittelpunkt auf der Arbeitsebene, Z - Gewindestart, A - Gewindelänge, I - Startradius, J - Endradius, K - Gewindesteigung, R - radialer Vorschub pro Helix, L - Werkzeugdurchmesser übergeben. Außen- und Innengewinde unterscheidet der Controller über die Relation von Start- und Endradius (I < J -> Innengewinde, J < I -> Außengewinde). Durch das Vorzeichen der Gewindelänge (A) wird mitläufiges oder gegenläufiges Fräsen bestimmt.
Ein wesentliches Problem, welches ich als Beschränkung und manchmal auch als nervraubend empfinde, ist die fehlende Vektorvorschau, weil die Maschine nach jedem Vektor stoppt. Da die Software jedoch "historisch" gewachsen ist, fällt es schwer eine Vektorvorschau einzubauen.

Die Register und der Befehlssatz sind in den folgenden Tabellen beschrieben.

Register:

Bezeichnung Funktion Wertebereich
APosition A-Achse, Koordinatentransformation, Gewindefloat
DController-Funktionen / Einstellungeninteger
FVorschubfloat
GG-Codesinteger
HWerkzeugoffset (nicht relevant)float
IKreis, Helix, Koordinatentransformation, Gewindefloat
JKreis, Helix, Koordinatentransformation, Gewindefloat
KKreis, Helix, Koordinatentransformation, Gewindefloat
LGewinde Werkzkeugdurchmesserfloat
MMaschinen-Funktioneninteger
NBefehlsnummer (nicht relevant)integer
PHilfeinteger
RKreis, Helix, Koordinatentransformation, Gewindefloat
SSpindeldrehzahl (nicht relevant)float
TWerkzeugnummer (nicht relevant)integer
UKoordinatentransformationfloat
VVerweilzeitinteger
XPosition X-Achse, Koordinatentransformation, Gewindefloat
YPosition Y-Achse, Koordinatentransformation, Gewindefloat
ZPosition Z-Achse, Koordinatentransformation, Gewindefloat

D-Codes:

Nummer Funktion
D1aktuelle Achseneinstellungen in ASCII ausgeben
D2aktuelle Maschineneinstellungen in ASCII ausgeben
D4aktuelle Maschineneinstellungen binär ausgeben
D5aktuelle Achseneinstellungen binär ausgeben
D6Maschineneinstellungen binär empfangen
D7Achseneinstellungen binär empfangen
D10Ready-Flag abfragen
D11Status in ASCII ausgeben
D12absolute Position (mm) ausgeben
D121absolute Position (mm) Handachse ausgeben
D13absolute Position (Schritte) ausgeben
D14letzte Positionsabweichung (mm) ausgeben
D15letzte Positionsabweichung (Schritte) ausgeben
D16Einstellungen aus EEProm in RAM laden
D17Einstellungen aus RAM in EEProm speichern
D20Taktquelle Timer
D21Taktquelle Handencoder
D210Handencoderachse X
D211Handencoderachse Y
D212Handencoderachse Z
D213Handencoderachse A
D30Ausgaben: maschinenlesbar
D31Ausgaben: klartext
D32Ausgaben: maschinenlesbar+klartext
D33Ausgabeziel: keins
D34Ausgabeziel: LCD-Display
D35Ausgabeziel: Terminal
D36Ausgabeziel: LCD-Display+Terminal
D37Koordinatenausgabe: absolut
D38Koordinatenausgabe: aktuelle Transformation
D510Ausgaben mit Debuginformationen
D511Ausgaben ohne Debuginformationen

G-Codes:

Nummer Funktion Parameter
G0linear Schnellvorschub-
G1linear ArbeitsvorschubF
G2zirkular UhrzeigerrichtungX,Y,Z,A,I,J,K,R
G3zirkular gegen UhrzeigerrichtungX,Y,Z,A,I,J,K,R
G4Verweilen mit VerweilzeitV
G5RechtsgewindeX,Y,Z,A,I,J,K,R,L
G6LinksgewindeX,Y,Z,A,I,J,K,R,L
G17Arbeitsebene XY-
G18Arbeitsebene XZ-
G19Arbeitsebene YZ-
G53linearen Offset aufheben-
G54..59linearer OffsetX,Y,Z,A
G60auf Referenzpunkt fahren (hierarchisch)-
G61auf aktuellen Offset fahren (invers hierarchisch)-
G74referenzieren-
G75Positionstest-
G90Programmierung absolut-
G91Programmierung relativ-
G92Varia senkrecht zu Arbeitsebene ein-
G93Varia senkrecht zu Arbeitsebene aus-
G100Bewegung: direkt zum Ziel-
G101Bewegung: hierarchisch zum Ziel-
G102Bewegung: invers hierarchisch zum Ziel-
G103Koordinatentransformation aufheben-
G104-109KoordinatentransformationX,Y,Z,A,I,J,K,R,U
G120Kreisinterpolation mit linearen Einzelvektoren-
G121Kreisinterpolation mit Bresenham-

M-Codes:

Nummer Funktion
M3Hauptspindel an, Uhrzeigerrichtung
M4Hauptspindel an, gegen Uhrzeigerrichtung
M5Hauptspindel aus
M38Schrittmotorstrom aus
M39Schrittmotorstrom an
M100Notaus quitieren