Für dieses Forum muß Javascript im Browser aktiviert werden!
Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C2 Quellcode formatieren: <code>Quellcode</code> ASM Quellcode formatieren: <asm>Quellcode</asm> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! > Hallo allerseits, > > ich arbeite gerade an einer Motorsteuerung. Ich habe hier schon viel hielfreiches über > Motorsteuerungen gelesen und in die Tat umgesetzt. Jetzt stellen sich mit trotzdem > noch ein paar Fragen, die ich hoffentlich nicht im Forum überlesen habe... > > Der Motor hat ein 35:1 Getriebe und einen Imkrementalgeber mit 500 Schritten pro Umdrehung. > Jetzt soll der Motor ziemlich konstant (ca. +- 1%) mit einer Umdrehung pro Sekunde drehen. > Durch das Getriebe zähle ich 17500 (500*35) Impulse pro Umdrehung. Die soll mein Programm > pro Sekunde zählen und den P1H.0 entsprechend nachregeln. Funktioniert auch alles wunderbar, > nur die Genauigkeit haut nicht hin. Wenn ich die Impulse durch 17500 teile, verschluckt das > Programm immer mal wieder eine Umdrehung, so dass die Abweichung mit der Zeit recht groß wird. > Beschaltet auf dem Applicationboard sind nur der P1H.0 fur das PWM-Signal und der P1H.3 für die > Pause-Funktion (Die Sache mit den Pullup-Widerständen trifft doch nur auf die Station zu oder?). > > Evtl. könnt Ihr mir einen Tipp geben, wie ich eine höhere Genauigkeit erreichen kann? > > Hier mien Code: > > <code> > thread main > { > //Variablendeklaration > string e1,e2,s,t; > long zeit; > long impulse1,impulse2; > int d,i; > > //Variableninitialisierung > d = 123; > impulse1 = 0; > impulse2 = 0; > zeit = system.timer(); > > // Externes LCD initialisieren > lcdext.init(); > lcdext.clear(); > > //Grundeinstellung PWM Port 0 > plm.settimebase(0,plm.BASE_400); > plm.setmode(0,0); > plm.setperiod(0,192); > plm.out(0,0); > > loop > { > //Überlauf System-Timer abfangen > if zeit < 0 zeit = system.timer() + (2147483647 - zeit); > > //Schleifenausführung exakt alle 1000 msek. > if(system.timer()- zeit) == 1000 > { > //Zähle Impulse von Inkrementalgeber auf Kanal A > impulse1 = ports.getcount(0); > > //Summiere die bisherigen Motorumdrehungen > impulse2 = impulse2 +impulse1 / 17500; > > // Zeit neu setzen > zeit = system.timer(); > > //Programm anhalten, wenn Schalter auf "EIN" > if ports.get(11) == 0 > { > //Motorstop und Anzeige blinkt > plm.out(0,0); > lcdext.clear(); > lcdext.goto(1,0); > lcdext.print(" *** PAUSED ***"); > sleep 500; > lcdext.clear(); > sleep 500; > } > else > { > //Regelung, wenn nicht 17500 Impulse pro Sekunde gezählt werden > if (impulse1 < 17500) d = d + 1; > else if (impulse1 > 17500) d = d - 1; > plm.out(0,d); > > //Ausgabe der Werte auf externem LCD > s = ""; > e1 = " Imp./s"; > t = ""; > e2 = " Umdreh."; > str.putlong(s,impulse1); > lcdext.goto(1,1); > s = s + e1; > lcdext.print(s); > str.putlong(t,impulse2); > lcdext.goto(2,0); > t = t + e2; > lcdext.print(t); > > //Anzeige des Regelparameters d > lcdext.goto(2,12); > lcdext.zahl4(d); > } > } > } > } > > </code> > > Vielen Dank schon mal im Voraus, > > Gruß Pet