Projekt: Servo aus Scheibenwischermotor

Der chaotische Hauptfaden

Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese

Anse
Beiträge: 2307
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Anse »

Die AppNote als PDF: http://www.atmel.com/images/atmel-2558- ... avr221.pdf
Die Software als ZIP: http://www.atmel.com/Images/AVR221.zip
Die AppNote findet man bei Atmel unter dem Begriff "pid".
Die Application-Note kannst trotzdem mal zeigen, ich denk ein bisschen krieg ich das zumindest gelesen. Jedenfalls hilft es auch beim Verständis, wenn man einfach Beispielcodes durchgeht. Wenn man Befehle nicht kennt kann man die ja auch nachschlagen.
Bei dem Beispiel wird mit structs und Funktionsparameterübergabe by reference gearbeitet. Das ist für nicht C sprechende nicht so leicht zu verstehen weil man das Prinzip dahinter verstehen muss und ich einfach nur den Begriff nachschlagen kann.

Was mir schon früher aufgefallen ist, in dem Beispielcode wird der D Anteil falsch berechnet. Normalerweise wird er durch die Differenz des Aktuellen und des letzten Fehlers berechnet. Atmel verwendet dafür aber den aktuellen Istwert und den letzten Istwert von der letzten Abtastung. Das bringt natürlich nicht viel da sich der D Anteil nur dann bemerkbar mach, wenn der Regelkreis von Außen beeinflusst wir. Bei einer Sollwertänderung passiert beim D Anteil nichts.
Benutzeravatar
Geistesblitz
Beiträge: 1934
Registriert: Di 5. Nov 2013, 17:53
Wohnort: Dresden

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Geistesblitz »

Wie gesagt, das mit dem D-Anteil hab ich auch schonmal so irgendwo gelesen, also scheint das vielleicht sogar beabsichtigt zu sein. Soweit ich weiß soll der D-Anteil auch nur ein wenig dämpfen, da der I-Anteil gerne für Schwingungen sorgt. Mal gucken, obs dazu noch was zu finden gibt. Structs weiß ich jetzt nicht genau, wie die in C angelegt sind, aber Parameterübergabe by Reference kenn ich von Visual Basic, wenn man dann in der Funktion den Parameter ändert, ändert er sich auch tatsächlich (und nicht nur die Kopie, die man mit by Value bekommen würde). Oder ist das da anders?
Anse
Beiträge: 2307
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Anse »

Structs weiß ich jetzt nicht genau, wie die in C angelegt sind, aber Parameterübergabe by Reference kenn ich von Visual Basic, wenn man dann in der Funktion den Parameter ändert, ändert er sich auch tatsächlich (und nicht nur die Kopie, die man mit by Value bekommen würde). Oder ist das da anders?
Das mit by reference und by value hast Du schon richtig verstanden. In Visual Basic sind die zugrunde liegenden Vorgänge aber nicht so deutlich weil sie für den Durchschnittsprogrammierer nicht wichtig sind.
In C kann mit char c; eine Variable für ein Ascii-Zeichen angelegt werden.
Mit char *ptr; wird aber eine Variable angelegt, die die Speicheradresse im RAM für eine char Variable aufnehmen kann. Sie zeigt im Prinzip auf eine andere Variable. Darum heißt dieser Typ auch Pointer oder auch Zeiger.
Bei der Übergabe by reference wird der Funktion nur mitgeteilt, wo im Speicher die Variable zu finden ist, auf die die Funktion darauf zugreifen soll.

Code: Alles auswählen

char c='A'; //legt eine Variable vom Typ char an
char *ptr; //legt einen Pointer an, der auf einen Variable vom Typ char zeigen kann
ptr=&c;//Der & Operator schreibt die Adresse von c in ptr
*ptr='B'//Verändert den Inhalt von c obwohl auf ptr geschrieben wird
ptr=0//Unsinnig aber trotzdem erlaubt weil C  
Gerade der letzte Fall passiert leicht wenn man das * vergisst. Wenn man dann noch versucht auf Adresse 0 im Ram zu schreiben schmiert meistens das Programm ab wegen segfault.
Das bringt Dich jetzt wahrscheinlich nicht viel weiter aber vielleicht kann es auch jemand anderes brauchen.

Wenn ich noch eine Erklärung zu structs verfassen soll lass es mich wissen.
Darüber gibt es aber auch massenhaft Erklärungen im Netz.
Benutzeravatar
Geistesblitz
Beiträge: 1934
Registriert: Di 5. Nov 2013, 17:53
Wohnort: Dresden

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Geistesblitz »

Wenns dir nix ausmacht sag ich nicht nein, find ich jedenfalls interessant.

Bei Bascom hab ich jetzt immer häufiger die Möglichkeit mit dem Overlay genutzt, wo man quasi eine Variable anlegt, die im Speicherbereich einer anderen Variablen liegt. So kann man beispielsweise von einem Integer oder Word jeweils das Highbyte oder das Lowbyte einer solchen Variablen zuweisen und kann dann problemlos auf diese zugreifen. Das Ganze kann man auch wild durcheinander tun, zB. dass ein Word als Overlay einige aufeinanderfolgende Zeichen einer Stringvariable belegt oder mit Arrays ist sowas auch machbar. Das ist denk ich ein bisschen ähnlich wie das mit den Pointern, oder?
Benutzeravatar
xoexlepox
Beiträge: 4815
Registriert: So 11. Aug 2013, 19:28
Wohnort: So etwa in der Mitte

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von xoexlepox »

Geistesblitz hat geschrieben:Das Ganze kann man auch wild durcheinander tun, zB. dass ein Word als Overlay einige aufeinanderfolgende Zeichen einer Stringvariable belegt oder mit Arrays ist sowas auch machbar. Das ist denk ich ein bisschen ähnlich wie das mit den Pointern, oder?
Wer schon solche Tricks anwendet, sollte sich doch wirklich mal "C" ansehen (und begeistert sein) -> Damit darf man "legal" so "herumpunken" ;)
Anse
Beiträge: 2307
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Anse »

Geistesblitz hat geschrieben:Bei Bascom hab ich jetzt immer häufiger die Möglichkeit mit dem Overlay genutzt, wo man quasi eine Variable anlegt, die im Speicherbereich einer anderen Variablen liegt. So kann man beispielsweise von einem Integer oder Word jeweils das Highbyte oder das Lowbyte einer solchen Variablen zuweisen und kann dann problemlos auf diese zugreifen. Das Ganze kann man auch wild durcheinander tun, zB. dass ein Word als Overlay einige aufeinanderfolgende Zeichen einer Stringvariable belegt oder mit Arrays ist sowas auch machbar. Das ist denk ich ein bisschen ähnlich wie das mit den Pointern, oder?
Ja, so Sachen macht man mit Pointern. Obwohl eine Word Variable in High und Lowbyte zerlegen ist Aufgabe von Bitmasken.
Übrigens, wenn Du eine Array mit z.B. array(10) anlegst arbeitest Du schon mit Pointern ohne es zu bemerken.

Also etwas vergleichbares wie Strucs gibt es wohl in Bascom nicht obwohl es extrem nützlich wäre.
Eine Struct hilft dabei das Programm zu ordnen. Wenn man z.B. alle Angaben zu einem Bauteil speichern will könnte man zu jeder Eigenschaft eine eigene Variable anlegen:

Code: Alles auswählen

char[10] Name;
float Wert;
Int Bestellnr;
Int Menge;
int Lagerplatz;
Das geht bei einem Teil noch gut. Sobald es mehre Datensätze werden oder die Werte an eine Funktion übergeben werden sollen wird es kompliziert.
Dafür gibt es die Structs:

Code: Alles auswählen

struct Bauteil //Schlüsselwort struct und Bezeichnung der Struct
{
//Elemente der Struct
char[10] Name;
float Wert;
Int Bestellnr;
Int Menge;
int Lagerplatz;
}EinTeil,Teileliste[100];//hier werden zwei Variablen vom Typ Bauteil angelegt eine einzelne und ein Array mit 100 Elementen
Der Zugriff auf die angelegten Variablen erfolgt mit dem Punktoperator:

Code: Alles auswählen

EinTeil.Menge=300;
EinTeil.Lagerplatz=123;
EinTeil.Wert=2.2;
strcpy(EinTeil.Name,"Widerstand");//Stringzuweisung zur Laufzeit nur über strcpy

Teileliste[10].Lagerplatz=42//Bei einem Array kommt halt noch der Index dazu
Bei Übergabe an eine Funktion wird einfach nur der Name der ganzen Struct angegeben:
Byvalue

Code: Alles auswählen

void Bestelle_Teil(struct Bauteil Bestellen)
{
   sendtext(Bestellen.Name);//Zugriff bei Übergabe bei Value erfolgt wie gewohnt per  Punkt.
}


Main()//Main
{
  While(1)
  {
    Bestelle_Teil(EinTeil);//Aufruf
  }
}
By reference:

Code: Alles auswählen

void Bestelle_Teil(struct Bauteil *Bestellen)//"*" weißt auf Pointer hin
{
   sendtext(Bestellen->Name);//Zugriff bei Übergabe by reference erfolgt mit "->" operator!
}


Main()//Main
{
  While(1)
  {
    Bestelle_Teil(&EinTeil);//Wichtig: Beim Aufruf wir die Adresse mit dem Adressoperator übergeben. Wenn der vergessen wird erlaubt sich der Compiler nur einer Warnung. Darum Warnungen ernst nehmen. 
  }
}
Die Erklärung ist noch nicht vollständig. Da würde den Rahmen des Beitrags sprengen.
Eigentlich sollten die Beispiele für bessere Verständlichkeit mit einem Editor mit Syntax Highlight betrachtet werden.
Benutzeravatar
xoexlepox
Beiträge: 4815
Registriert: So 11. Aug 2013, 19:28
Wohnort: So etwa in der Mitte

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von xoexlepox »

Anse hat geschrieben:

Code: Alles auswählen

char[10] Name;
float Wert;
...
strcpy(EinTeil.Name,"Widerstand");//Stringzuweisung zur Laufzeit nur über strcpy
Ein sehr gutes (und "klassisches") Beispiel, wo die Tücken dieser Technik liegen: Das "strcpy" mit zehn Zeichen könnte (abhängig vom Bytealign) ein Byte von "Wert" mit dem Stringterminator überschreiben, und zu (schwer zu findenden) "seltsamen Effekten" führen ;) Sorry, nicht böse gemeint, aber eine "gutes" Beispiel dafür, daß man bei solchen Konstrukten höllisch aufpassen muss ;) Aber ok, lassen wir das besser, wir sind schon genug OT...
Anse
Beiträge: 2307
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Anse »

@xoexlepox, Das die Länge nicht ausreicht ist mir natürlich aufgefallen. Hab es nur drin gelassen um zu sehen ob es jemanden auffällt. Gut aufgepasst ;)

Ein weitere Vorteil von structs ist, das man sie wenn sie vom gleichen Typ sind Untereinander einfach zuweisen kann.
Also so:

Code: Alles auswählen

struct Bauteil EinTeil, nochEinTeil;
EinTeil=nochEinTeil;
Das funktioniert auch wenn die struct Strings enthält.
Benutzeravatar
Durango
Beiträge: 635
Registriert: Mi 14. Aug 2013, 00:42

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Durango »

Ja, ich hab jedes Wort des Beitrages gelesen !

Wenn man mit einem DC-Motor ein Servo bauen möchte, benötigt man ein Potentiometer oder bei Auswertung der Schritte an der Spindel einen Nullpunktsensor.

Das diese Tatsache hier Keinem aufgefallen ist..

Fallunterscheidung: Wenn man nur Pulse zählt braucht man vor Beginn einen Anlernvorgang. Also einmal duch den Nullpunkt, dann stimmt die Zählerei der Pulse.

Beim Poti hat man vom Anfang an die absolute Position und kann sofort anfangen. So ist jedes käufliche Servo aufgebaut.

Es wird nirgendwo auf die Wiederholgenauigkeit eingegangen. Was ist mit einem Scheibenwischermotor mit Umkehr der Laufrichtung überhaupt möglich ?
Na, höchstens ein Grad. Dann nehmen wir als Basis 1,5 Grad, das passt schon eher. Da reicht i.d.R ein 8 bit Wert hin.

Der Motor wird nachlaufen ! Hier kommt aber die Fähigkeit des Programmieres zum Vorschein, er wird exakt vor diesen Betrag den Motor stoppen.
Anders als bei analogen Filtern der Regelungstechnik (PID ) kann man digital das reale Verhalten des Motors knallhart mit einbinden.

Während ihr euch noch streitet, ob Basic oder C am Besten gelingen, haben mir das schon vor Jahrzehnten in Assembler zum laufen bekommen.

73 Manfred
Benutzeravatar
Geistesblitz
Beiträge: 1934
Registriert: Di 5. Nov 2013, 17:53
Wohnort: Dresden

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Geistesblitz »

Ich bezweifel, dass du alles gelesen hast...
Wenn man mit einem DC-Motor ein Servo bauen möchte, benötigt man ein Potentiometer oder bei Auswertung der Schritte an der Spindel einen Nullpunktsensor.

Das diese Tatsache hier Keinem aufgefallen ist..
Weder noch, ich benutze einen Magnetencoder AS5048A von Austriamicrosystems. Er löst innerhalb einer Umdrehung 14 Bit absolut auf, beim Antrieb einer Spindel würde man einen Referenzschalter brauchen, wenn man aber etwas einfach nur dreht braucht man es nicht mehr. Potentiometer gehen für absolute Messung natürlich auch, allerdings können sie nicht kontinuierlich drehen und Mehrgangpotis werden schwierig mit der Auflösung.

Wiederholgenauigkeit kommt ja nicht unbedingt mit dem Spiel, wenn der Regler schnell genug reagiert überbrückt er relativ fix die "Lücke" und steht auf der anderen Zahnflanke. Was dann aber wieder ein wenig Probleme macht ist die Dynamik dieses Vorgangs. Ich bin dennoch der Meinung, dass man besser regeln kann, wenn man eine bessere Auflösung hat, da man dann schneller Veränderungen des Istwertes mitbekommt und der Regler so auch schneller reagieren kann. Und wegen dem Getriebespiel: Das wirkt sich nur sehr wenig aus, wenn es einseitig belastet ist, zB. eine exzentrische Masse am Abtrieb, die angehoben werden soll.

Was meinst du jetzt mit der digitalen Regelung, sowas wie einen Deadbeatregler oder wie? Um den auszulegen bräuchte man erstmal ein zeitdiskretes Zustandsraummodell der Strecke, wenn ich mich da nochmal ein wenigin den alten Uniaufzeichnungen reinlese sollte ich das vielleicht auch nochmal zusammenbekommen.
Benutzeravatar
Durango
Beiträge: 635
Registriert: Mi 14. Aug 2013, 00:42

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Durango »

Hab mir mal das Datenblatt vom Encoder reingepfiffen.

Dachte anfangs, das wäre nur ein besserer Endschalter...

Für 5 Euro ist das Ding schon genial, warum hab ich es noch nicht ?
Gibt es auch mit SPI, super !

Bei den Registern für den Nullpunkt steht " OTP" , wirklich nur one time programmable ?

In der Ausbildung wird man meist zum PID-Regler gezwungen.

Bei einem selbstgebauten Regler kann man wirklich gut die Eigenschaften des gesamten Systems mit einfließen lassen.
Weil es bislang keine Daten von diesem Motor gibt, probiert man halt aus, wieviele millisekunden der Motor vorher abgeschaltet werden kann.
Wenn die Zeit nicht beachtet werden kann, nimmt man die Differenz zum Sollwert.

Haste schon passende Magnetchen irgendwo entdeckt ?

So einen Encoder werde auf jeden Fall in meinem Antennenrotor pobieren, wo das Poti verranzt ist.

73 Manfred
Benutzeravatar
Geistesblitz
Beiträge: 1934
Registriert: Di 5. Nov 2013, 17:53
Wohnort: Dresden

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Geistesblitz »

Man kann sich die ICs ja samplen lassen, und passende Magneten gleich dazu (allerdings immer nur maximal 3 pro Artikel). So hab ich meine ja auch bekommen :)

Wieso Motor abschalten? Der bekommt eine PWM, abhängig vom Regelfehler und seiner Dynamik (I- und D-Anteil halt). Ich glaub, ich werd bis ich das mit der Kommunikation geklärt habe, mal die Sollwerte auf dem Controller generieren lassen, das sollte ja zuverlässig den Takt einhalten und dann kann ich vielleicht auch mal ein Video machen, wo man mehr sieht. So ein gut ausgelegter PID-Regler bringt schon eine gute Dynamik, wenn man dann die Sollwerte einigermaßen "sanft" generiert gibts nur einen minimalen Regelfehler :)

Edit: ganz vergessen zu schreiben, ja der Nullwinkel lässt sich nur einmal neu permanent schreiben, man kann aber das Register beliebig oft vorrübergehend setzen, nur ist es nach dem Abschalten immer wieder leer. Man kann aber einen Versatz messen/experimentell ermitteln und diesen nach dem Messen des Winkels vom Wert abziehen.

Und passende Magneten gibts auch manchmal bei Magnethändlern, muss man aber suchen, es müssen diametral magnetisierte Magneten sein. Zur Not gehen aber auch auf die Seite gelegte Würfelmagnete. Ich hab diametral magnetisierte Scheibenmagnete, allerdings etws kleinere als empfohlen (D4x1, empfohlen werden D6x2,5). Funktionieren tut es ja aber trotzdem.
Hier, die sollten beispielsweise geeignet sein:
https://supermagnetic.de/neodym-magnet- ... ickel.html
Und diese wären genau richtig:
http://www.powermagnetshop.de/scheibenm ... -diametral
roooooobert
Beiträge: 150
Registriert: Di 10. Nov 2015, 14:38
Wohnort: ICBM: N 53°32' - E 8°35', 30Mt

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von roooooobert »

Moin Geistesblitz,
ich hab das Projekt grade erst entdeckt und bin ziemlich beeindruckt von deinem Fortschritt! Einen sehr ähnlichen Antrieb hatte ich während meines Studiums mal entwickelt, lief auch einigermaßen aber es war nie wirklich serienreif.

Beruflich bin ich Hardware-Entwickler mit starkem Hang zu Regelungstechnik, falls du also Fragen in den Bereichen hast, kannst du dich gerne per PN bei mir melden!

Viele Grüße,
roooooobert
Benutzeravatar
Geistesblitz
Beiträge: 1934
Registriert: Di 5. Nov 2013, 17:53
Wohnort: Dresden

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Geistesblitz »

Danke sehr, werd da sicherlich nochmal drauf zurück kommen, später :)

Hab gestern Abend noch kurz ein bisschen mit der alten Variante (PC gibt den Takt vor) gespielt und ein paar Einstellungen verändert, dass die Übertragung weniger ruckelt, das ist fast schon brauchbar, zumindest zum Testen. Hab mal den Abtrieb in einem langsamen Sinus um insgesamt 90° hin- und herbewegen lassen und testweise ein 4kg-Gewicht an einen 8cm Hebel gehängt, schafft das Teil locker, nur eben mit nem deutlichen Schleppabstand bei der Bewegung nach oben :D
Leider scheint der Motor über die volle Umdrehung kein einheitliches Moment zu haben, sondern je nach Winkel sind wohl mehr oder weniger Spulen im Eingriff, sodass es etwas ruckelig wird. Vielleicht bekomme ich den Regler noch eingestellt, dass er das überwunden bekommt, allerdings fängt er jetzt schon manchmal ann ein wenig zu schwingen und zu rattern. Anscheinend hat das System allgemein zu viele Abweichungen vom idealen linearen Verhalten...
Mal sehen, was ich noch hinbekomme, aber kann sein, dass die für das, was ich vorhabe, einfach nicht geeignet sind. Die Herumspielerei mit dem Regler ist dann aber dennoch nicht nutzlos, schließlich lernt man mehr, wenn man versucht schlechte Hardware durch geschickte Programmierung zum Funktionieren zu bringen :D

Ich glaub, ich werd da auch noch ein paar Potis an die Analogeingänge klemmen, um damit die Reglereinstellung vorzunehmen, das soll da am bequemsten gehen. Ob es sinnvoll wäre, nachher auf dem Board auch ein paar Trimmer für die Reglereinstellungen zu haben, oder doch lieber rein im Code lassen?
Benutzeravatar
ferdimh
Beiträge: 9430
Registriert: Fr 16. Aug 2013, 15:19

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von ferdimh »

Wie oft wird deine Regelschleife durchlaufen?
Also wie oft berechnest du einen neuen Wert für die PWM?
Hier war bei mir der größte Fehler.
Wenn das etwas wackelnde Drehmoment des Motors zum Problem wird, ist dein Verhau bereits derartig am Limit, dass du über "weniger Last" oder "Mehr Spannung" nachdenken solltest.
Benutzeravatar
Geistesblitz
Beiträge: 1934
Registriert: Di 5. Nov 2013, 17:53
Wohnort: Dresden

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Geistesblitz »

Das Wackeln ist nicht lastabhängig und passiert auch, wenn gar nix an der Welle dran ist. Kann sein, dass das Oszillationen sind, die aus dem Getriebespiel resultieren, dass sich das ein wenig aufschwingt. In manchen Phasen läuft es aber relativ flüssig. Und das Wackeln durch die "Drehmomentenwelligkeit" merkt man hauptsächlich bei niedrigen Geschwindigkeiten, anscheinend hängt der da immer kurz, der Fehler steigt langsam an bis er groß genug ist, dass es einen kuren Ruck gibt und der Motor wieder hängt. Das merkt man auch schon, wenn man den Motor an eine niedrige Konstantspannung hängt. Die Reglerroutine wird ca. alle 2ms aufgerufen.
Benutzeravatar
ferdimh
Beiträge: 9430
Registriert: Fr 16. Aug 2013, 15:19

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von ferdimh »

Lass mal die Reglerroutine häufiger laufen. Bei der CNC haben wir 10kHz Reglerinterrupt. (liefert der Encoder überhaupt so schnell neue Werte?).
Wenn jetzt noch die Betriebsspannung hoch genug ist, dass man schnell den Strom im Motor geändert bekommt, wird das Ganze ruhiger, weil der Fehler nicht so weit wachsen muss.
Benutzeravatar
Geistesblitz
Beiträge: 1934
Registriert: Di 5. Nov 2013, 17:53
Wohnort: Dresden

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Geistesblitz »

Oha, das wird mit dem kleinen AVR glaub ich nix. Alleine das Senden der Istdaten an den Rechner dürfte bei der verwendeten Baudrate 0,4ms dauern, das Empfangen dann auch nochmal und die Berechnungen kommen dann noch dazu. Bei höheren Baudraten kommt einfach nix Gescheites mehr raus, hab ich schon probiert...
Arbeitet ihr bei der CNC Mit Takt/Richtung wie bei Schrittmotoren? Da sieht es sicherlich wieder ganz anders aus, weil man nicht auf die Kommunikation angewiesen ist.
Benutzeravatar
Nicki
Beiträge: 3128
Registriert: So 11. Aug 2013, 20:16
Wohnort: wo Mosel und Rhein sich treffen

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Nicki »

Nimm doch wenigstens nen Arduino, da gibts auch keinen gescheiten Debugger, aber immerhin lernt man C nicht für die Katz.
BASIC ist ne Sackgasse, mit 50 umlernen wird schwieriger als jetzt :lol:
Benutzeravatar
ferdimh
Beiträge: 9430
Registriert: Fr 16. Aug 2013, 15:19

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von ferdimh »

Bei der CNC verwenden wir einen STM32, die mit Takt/richtung gefüttert werden, wobei jeder Takt einen Interrupt auslöst, der die Richtung abfragt und den Sollwertzähler entsprechend verändert. So kann man mit üblicher CNC-Soft/Hardware steuern.
Und wenn du kannst: Tonn das Senden der Istwerte ein. Wofür brauchst du die? Um zu sehen, ob der Regler Mist macht, kannste auch die Apparatur angucken.
Benutzeravatar
Geistesblitz
Beiträge: 1934
Registriert: Di 5. Nov 2013, 17:53
Wohnort: Dresden

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Geistesblitz »

So, ich hab jetzt das Projekt nochmal rausgekramt, weil ich jetzt einfach mal probieren wollte, ob ich das Teil vielleicht mit nem RC-Empfänger zum Laufen bekomme. Hab jetzt also den Code neu abgespeichert, den Kram mit der UART-Schnittstelle komplett rausgeworfen und stattdessen die Reglerroutine in einen Timerinterrupt gesteckt. Für das Auslesen des RC-Signals hab ich den Signalpin von einem Empfängerkanal an einen Pin fürn externen Interrupt gehängt. Hab den dann auf Statusänderung gestellt, der löst also bei steigenden und fallenden Flanken aus, und danach wird nochmal abgefragt, ob der Pin gerade High oder Low ist. Ist er High, wird ein Timer gestartet (Ausgangswert setzen), ist er Low wird der Timerwert ausgelesen und als neuer Sollwert übergeben. Funktioniert an sich auch, allerdings schein ich mir irgendwelche Störungen einzufangen. Der Motor ruckt periodisch mal, hält aber ansonsten die gewünschte Position. Das Signal aus dem Empfänger sieht sauber aus, zumindest sieht es auf dem Oszi so aus. Jetzt vermute ich mal, dass die Interrupts vielleicht miteinander kollidieren könnten, würde jedenfalls erklären, warum es so periodisch auftritt. Hat da vielleicht noch jemand Erfahrungswerte oder irgendwelche Ideen?

Edit:
hab mal den Code nur für die Auswertung des RC-Signals in ein eigenständiges Programm gesteckt ohne den ganzen anderen Kram und dort hab ich keine solchen Störungen. Nur leichte Schwankungen von 1LSB, aber sonst nix. Da muss also wirklich irgendwas mit dem Kram interagieren, denn für sich genommen funktioniert es ja.
Zuletzt geändert von Geistesblitz am So 13. Aug 2017, 18:03, insgesamt 1-mal geändert.
Anse
Beiträge: 2307
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Anse »

Häng mal einen kleinen Kondensator an den Empfangspin. 1nF. Das hat bei mir mal geholfen.
Benutzeravatar
Geistesblitz
Beiträge: 1934
Registriert: Di 5. Nov 2013, 17:53
Wohnort: Dresden

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Geistesblitz »

Wie oben editiert, das ist wohl nicht das Problem, sondern da ist was im Code faul. Ich bin gerade noch etwas am Recherchieren, aber anscheinend ist meine Regler-Routine zu lang, sodass es ein Problem gibt, sollte währenddessen der externe Interrupt getriggert werden. Ich guck gerade, ob es eine Möglichkeit für verschachtelte Interrupts für AVRs gibt. Sollte hier ja kein Problem sein, da der Interrupt zur RC-Signalauswertung wirklich kurz ist und nur alle 20ms zweimal im Abstand von 1-2ms ausgeführt wird. Wenn allerdings genau dann der andere Interrupt gerade aktiv ist, dann verschiebt sich einer der Aufrufe nach hinten und dann stimmt die gemessene Zeit natürlich nicht mehr. Das würde so jedenfalls exakt zu meinem Fehlerbild passen, der Wert schwankt immer mal um so 5-10% etwa einmal pro Sekunde. Das ist wohl immer dann, wenn sich die Interruptperioden gerade überschneiden.

Edit: genau das wars auch, ich verwende jetzt den Assembler-Befehl SEI am Anfang von der Reglerroutine, um andere Interrupts wieder hart zu enablen. Das war alles, was es brauchte, und jetzt läufts :)
Benutzeravatar
Geistesblitz
Beiträge: 1934
Registriert: Di 5. Nov 2013, 17:53
Wohnort: Dresden

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Geistesblitz »

Hat eigentlich jemand einen Vorschlag, wie man den Verlust des RC-Signals detektieren kann? Wenn ich die Fernsteuerung abschalte, springt der Wert ja wie verrückt umher, und der Servo würde dann ja versuchen, diesem Signal zu folgen, was bei einem Wischermotor schon übel sein kann. Es sollte auch alles über dieses Signal laufen, ein 3-poliger Servoverbinder soll da reichen. Ich dachte daran, das Signal zu überwachen und wenn die Abweichungen zwischen mehreren aufeinander folgenden Messungen zu groß werden wird einfach der letzte Wert gehalten. Wenn diese Abweichung dann wieder in den Toleranzbereich kommt, wird der Sollwert wieder normal übernommen. Würde wohl aus dem aktuellen und dem vorhergehenden Signalwert die Differenz bilden, davon den Betrag nehmen und mit dem Betrag der Differenz vom vorhergehenden Takt den (eventuell gewichteten) Mittelwert bilden, dieser wird dann letztendlich mit einer erlaubten Schwelle verglichen. Durch die Mittelwertbildung wird das Ganze dann auch ein wenig geglättet, wodurch der Servo dann aber erstmal ein wenig herumzappelt, bevor der Schutz greift.

Ich werde das jedenfalls mal ausprobieren, wenn es aber noch andere Ideen gibt, immer her damit :)
Benutzeravatar
xoexlepox
Beiträge: 4815
Registriert: So 11. Aug 2013, 19:28
Wohnort: So etwa in der Mitte

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von xoexlepox »

Hat eigentlich jemand einen Vorschlag, wie man den Verlust des RC-Signals detektieren kann?
Bei den ganz alten Empfängern, die noch diskret aufgebaut waren, konnte man ein RSS (received signal strength)-Signal (aus der ZF-Regelung?) abgreifen, welches so grob der empfangenen Feldstärke entsprach. Bei den heutigen Empfängern ist das vermutlich nicht mehr möglich... :(
Anse
Beiträge: 2307
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Anse »

Geistesblitz hat geschrieben:Wenn ich die Fernsteuerung abschalte, springt der Wert ja wie verrückt umher, und der Servo würde dann ja versuchen, diesem Signal zu folgen,
Definiere mal was verrückt hin und her springende Werte. Springen sie sie im zulässigen Bereich oder auch außerhalb?
Benutzeravatar
Geistesblitz
Beiträge: 1934
Registriert: Di 5. Nov 2013, 17:53
Wohnort: Dresden

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Geistesblitz »

Das Signal springt wild zwischen High und Low, weder die Pulszeit (die ich zur Ansteuerung des Servos verwende) noch die Periodendauer sind dann konsistent und verlassen dann auch den erlaubten Bereich.

Hatte gestern abend auch noch ein bisschen im Netz gesucht, es gibt den Ansatz mit einer Messung von sowohl Puls- als auch Periodendauer:
http://www.hanneslux.de/avr/mobau/fr_t12/Fahrst3.html
Das scheint ein ganz guter Ansatz zu sein.
Anse
Beiträge: 2307
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Anse »

Wenn das Signal den zulässigen Bereich überschreitet geht es ja noch einfach. Du misst ja eh die Pulszeiten. Also kann Du doch abfragen ob sie im zulässigen Bereich liegen.
Fernsteuerungen mit Pulslängencodierung ist eigentlich nicht für ernsthafte Leistungen geeignet gerade wegen der Problematik.
Benutzeravatar
Geistesblitz
Beiträge: 1934
Registriert: Di 5. Nov 2013, 17:53
Wohnort: Dresden

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Geistesblitz »

Es überschreitet den zulässigen Bereich ja nicht immer, die Pulslängen werden dann nur zufällig und können im zulässigen Bereich liegen ... oder eben auch nicht. Dafür springt es aber recht zuverlässig wild umher, derartig hochfrequente Signaländerungen sollten von einer Fernsteuerung eher nicht kommen und daher sollte man es ja darüber detektieren können.
Benutzeravatar
ferdimh
Beiträge: 9430
Registriert: Fr 16. Aug 2013, 15:19

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von ferdimh »

Theoretisch sollte die Wiederholrate der Pulse noch weiter in der Gegend rumeiern.
Benutzeravatar
Bastelbruder
Beiträge: 11566
Registriert: Mi 14. Aug 2013, 18:28

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Bastelbruder »

Die Glsekugel ist leider im Bereich um die Technik des RC-Empfängers ziemlich trübe...
Weil aber analoge xxxproportional-Fernsteuerempfänger darauf spezialisiert sind, Impulse im Bereich 0,5..5 ms Länge auszuwerten, ist es sehr wahrscheinlich, daß die aus dem Demodulator fallenden Impulse statistisch eher im gültigen Bereich dümpeln als im nicht gültigen.
Benutzeravatar
Geistesblitz
Beiträge: 1934
Registriert: Di 5. Nov 2013, 17:53
Wohnort: Dresden

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Geistesblitz »

Hmm, jetzt frag ich mich, was ihr jetzt eigentlich als gültigen Bereich meint. Ich meine jedenfalls Impulse im Bereich von 1-2ms, wie sie normalerweise am Servo ankommen sollten, wenn alles reibungslos läuft. dieser Bereich wird beim Abschalten der Fernsteuerung jedenfalls nicht mehr eingehalten, ich sehe auf dem Display Zahlen, die deutlich außerhalb des Bereiches liegen, den ich normalerweise mit dem Steuerknüppel erreichen kann.
Anse
Beiträge: 2307
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Anse »

Geistesblitz hat geschrieben:Hmm, jetzt frag ich mich, was ihr jetzt eigentlich als gültigen Bereich meint. Ich meine jedenfalls Impulse im Bereich von 1-2ms, wie sie normalerweise am Servo ankommen sollten, wenn alles reibungslos läuft.
Genau den Bereich meine ich auch. Teste doch einfach mal.
Benutzeravatar
Geistesblitz
Beiträge: 1934
Registriert: Di 5. Nov 2013, 17:53
Wohnort: Dresden

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Geistesblitz »

Heute erstmal noch was anderes gemacht: hab gerade erst ein paar Axiallager durchs Forum bekommen (danke an Lore) und mal versucht, ein schön stabiles Gelenk damit und einem Scheibenwischermotor zu bauen. Ist eigentlich ganz gut geworden, ich merke kein Spiel außer dem aus dem Getriebe.
2017-09-09 19.37.35.jpg
2017-09-09 19.37.52.jpg
2017-09-09 19.39.04.jpg
Benutzeravatar
Geistesblitz
Beiträge: 1934
Registriert: Di 5. Nov 2013, 17:53
Wohnort: Dresden

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Geistesblitz »

Mit der Signalausfallserkennung hab ich jetzt auch nochmal herumgespielt, so wie ich es erst beschrieben hatte scheint es ganz gut zu funktionieren. Hab die Schwelle so gesetzt, dass man sich von Hand ganz schön anstrengen muss, dass ein Ausfall erkannt wird. Schalte ich die Fernsteuerung aus, wird der Ausfall fast sofort erkannt und bleibt auch in dem Zustand, nach Einschalten ist das Signal wieder da und der Regler aktiviert sich wieder.
Benutzeravatar
Raider
Beiträge: 1121
Registriert: Fr 11. Jul 2014, 16:58
Wohnort: Ellerhoop

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Raider »

Hab nicht den ganzen Thread gelesen, aber warum hat dein Empfänger kein Failsafe? Bist du noch mit alter Technik unterwegs? Eigentlich alle 2,4GHz Funken haben Failsafe schon eingebaut.
Benutzeravatar
Bastelbruder
Beiträge: 11566
Registriert: Mi 14. Aug 2013, 18:28

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Bastelbruder »

Raider hat geschrieben:Hab nicht den ganzen Thread gelesen, aber warum hat dein Empfänger kein Failsafe? Bist du noch mit alter Technik unterwegs? Eigentlich alle 2,4GHz Funken haben Failsafe schon eingebaut.
Die Glaskugel ist immer noch trübe.
Und Failsafe gabs bei Graupner schon um 1966 zu kaufen.
Benutzeravatar
Geistesblitz
Beiträge: 1934
Registriert: Di 5. Nov 2013, 17:53
Wohnort: Dresden

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Geistesblitz »

Kann sein, ich hab die Fernsteuerung und den Empfänger mal auf einem Treffen bekommen. Auf dem Empfänger steht ACT Micro-8 DSQ, falls das hilft.
Benutzeravatar
Bastelbruder
Beiträge: 11566
Registriert: Mi 14. Aug 2013, 18:28

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Bastelbruder »

ACT Micro-8 DSQ
...Doppelsuper ... besonders hohe Reichweite (> 1200 m, weit jenseits der Sichtgrenze) unter schwierigsten Bedingungen, wie z.B. starke UKW-Sender - mit Quarzfilter für höchste Übersteuerungsfestigkeit...
Aha.
Daß das Teil mit (1980 hat man noch behauptet: "störsicherer) FM" läuft, muß man den Damen und Herren auch erst mal aus der Nase ziehen.

Die weiter oben genannten Einschränkungen analoger Empfänger gelten sowohl für AM als auch für FM, und die per Jumper (de)aktivierbare Option Failsafe scheint laut aktueller Werbung nur in den volldigitalen Geräten der Firma ACT zu existieren. War also nix mit RSSI dessen Auswertung auch schwierig ist, Störsignale sind im Gegensatz zu Senderausfall so nämlich nicht zu erkennen.

Trotzdem klasse daß Du das Teil zum Laufen gebracht hast!
Benutzeravatar
Durango
Beiträge: 635
Registriert: Mi 14. Aug 2013, 00:42

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von Durango »

Jetzt sind die Teile endlich günstig zu haben !
https://www.ebay.de/itm/Hall-Winkelsens ... 2524887041?

Das ist ein 12 bit auflösendes wirkliches 360° Poti in kleiner Bauform. Für unter 20 Euro kam es direkt vom Chinamann.

Weil keine Kräfte übertragen werden, reicht ein Gummischlauch zur Verbindung mit der Motorachse hin. Draufstecken und gut ist es.

73 Manfred
roooooobert
Beiträge: 150
Registriert: Di 10. Nov 2015, 14:38
Wohnort: ICBM: N 53°32' - E 8°35', 30Mt

Re: Projekt: Servo aus Scheibenwischermotor

Beitrag von roooooobert »

ah, dieser Thread mal wieder.

Hat schon Jemand den Vedder ESC in den Raum geworfen?
Open Source Motortreiber (DC und BLDC), STM32 basiert incl. Auswertung für Hall, Inkrementalgeber und allem, was man so möchte. Die Software drumherum funktioniert auch gut und lässt kaum wünsche offen. Für die Ideen, die noch nicht fertig sind, gibt es sogar n Tutorial, wie eigene Programmteile ("apps") ohne viel Aufwand dadrauf geschrieben werden können.

https://github.com/vedderb

Viele Grüße,
Robert
Antworten