Moin Martin,
klarer einfacher Aufbau. Gefällt mir. Der Endschalter für die Referenzfahrt. Ist das ein Sprungkontakt? Die Marquard-Schalter verwende ich auch in meinen CNC Steuerungen. Eine Frage noch? Wie sieht der Algorithmus aus mit dem Du den Endschalter anfährst? Ich mache das folgendermaßen und lande immer genau am Referenzpunkt.
1. Anfahren in Richtung Endschalter mit Referenzgeschwindigkeit (etwa 400mm/min).
2. Sobald der Endschalter angefahren ist halte ich an, schalte ich die Drehrichtung um und fahre den Endschalter mit etwa 10mm/min frei. Das ist dann der Referenzpunkt.
Bei meinen Messtraversen und auch bei der Kreissäge kann ich damit bis auf ein halbes zehntel genau positionieren. Vorausgesetzt der Endschalter hat einen Sprungkontakt. Initiatoren, also berührungslose Endschalter, sind nicht das Mittel der Wahl. Die billigen sind nicht unbedingt Temperaturstabilisiert, was kontraproduktiv wäre.
Anbei mal meine Funktion zum Homing einer Linearachse. Bitte nicht verwirren lassen, ich rechne in der Routine gleich die Schritte in 1/100mm um und speichere die Ergebnisse in der Achsenstruktur. Die Routine ist für den Raspberry PI geschrieben, passt aber bis auf den Bibliotheksaufruf für die I/O's auf jeden Rechner. Ich verwende außerdem rechts und links zwei Maximalendschalter und messe im ersten Schritt die Entfernung zwischen den Schaltern. Im letzten Schritt fahre ich den Homeschalter an. Die Endschalter sind als Öffner geschaltet um einen Kabelbruch oder defekt zu überwachen. Die Homeschaltersequenz habe ich mal rot gemacht. Die Funktion SendStep erzeugt die Pulse für den Servoverstärker.
int LinDriveRef(int invers,int slow, int fast, struct AxStructLin *ax)
{
long homecounter = 0; // Wegstrecke vom Max rechts Schalter bis Homeendschalter
long distcounter = 0; // Distanzzähler maximale Schrittanzahl der Achse
int maxleft = ax->swmin, maxright = ax->swmax; // Endschalter links und rechts abhängig invers
bool left = HIGH, right = LOW; // Drehrichtungsflag setzen
if(slow <= 100) {slow = 200;} // Parameter Geschwindigkeit plausi.
if(fast >= slow) {fast = slow / 2;}
if(fast <= 5) {fast = 100;}
if (invers) // Alle Variablen umsetzen wenn nötig
{
left = LOW;
right = HIGH;
maxleft = ax->swmin;
maxright = ax->swmax;
}
bcm2835_gpio_fsel(ax->dirpin,BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_write(ax->dirpin, left); //Drehen nach links um Endschalter zu suchen
while (DigIORead(maxleft)== 1) // So lange nach links fahren, bis der Endschalter MIN betätigt wurde
{
SendStep(ax->steppin, fast);
}
bcm2835_gpio_write(ax->dirpin, right); //Drehen nach rechts
while (DigIORead(maxleft)== 0) // Endschalter links freifahren
{
SendStep(ax->steppin,slow);
distcounter = 0; // Maximaldistanz nullen
}
while (DigIORead(maxright)== 1) // Jetzt nach rechts fahren und Endschalter rechts suchen MAX.
{
SendStep(ax->steppin, fast);
distcounter++; // Maximaldistanz Schritte mitzählen
}
bcm2835_gpio_write(ax->dirpin, left); //Drehen nach links
while (DigIORead(maxright)== 0) // Endschalter rechts freifahren
{
SendStep(ax->steppin, slow);
distcounter--; // Schön die Schritte mitzählen
}
while (DigIORead(ax->swhome) == 0) // Homeschalter suchen
{
SendStep(ax->steppin, fast);
homecounter++; // Schritte von MAX bis Home zählen
}
bcm2835_gpio_write(ax->dirpin, right); //Drehen nach rechts
while (DigIORead(ax->swhome)== 1) // Homeschalter freifahren
{
SendStep(ax->steppin, slow);
homecounter--; // Schön die Schritte mitzählen
}
double msp = (gst_para.reflen / gst_para.xpulseraw) * 1000;
ax->lenpp = msp; // Minimale Schrittweite per Puls in 1/100mm
ax->maxst = homecounter; // Ergebnis in Schritten
ax->minst = (distcounter - homecounter) * -1; // Ergebnis in Schritten
ax->maxmm = (ax->maxst * ax->lenpp)/1000; // Ergebnis in 1/100mm
ax->minmm = ((ax->minst * ax->lenpp) / 1000); //Ergebnis in 1/100mm
ax->isref = true;
ax->actst = 0; // Aktuelle Schritte ist auch Null
ax->actmm = 0; // Aktuelle mm ist Null
return 1;
}
Mein Senf dazu und ich hoffe Du kannst etwas davon verwenden. Ich fahre die Nema 23 mit 1000 Steps/U. Die Resonanzfrequenzprobleme habe ich nicht, weil ich den Motor mit 22kHz in der höchsten Geschwindigkeit (fast) ansteuere. Nur wenn ich langsam fahre (slow) grummelt er ein wenig. Probiere mal, ob Du eine höhere Frequenz mit dem Arduino hin bekommst. Dann könntest Du wieder auf 1000Steps/U gehen und hättest ein gerades Teilungsverhältnis von 5/1000mm Step.
Noch ein kleiner Tipp. Spendiere dem Arduino und dem Antrieb noch je eine Sicherung entsprechender Größe. Macht weniger DBQ-Signal im Fehlerfall.
DBQ-Signal = Dunkler Beißender Qualm.
Mit freundlichen Modellbahnergrüßen
Thomas