Hallo Community, ich habe mal wieder ein blödes Problem. Ich habe ein Modelauto von Verbrenner- auf E-Motor umgebaut. So weit so gut. Um den Motor zu steuern habe ich mir einen Fahrtenregler gekauft ("LRP Quantum Super Sport 2"). Kurz nach dem Privatkauf auf Ebay habe ich das gelesen, was ich hätte vorher lesen sollen. Der Regler Hat nur einen Vorwärtsgang und eine Bremsfunktion... Da ich noch einige Platinenteile zuhause hatte und mir keinen neuen Regler kaufen wollte habe ich mir folgende Lösung überlegt und umgesetzt: Ich schalte eine Platine zwischen Empfänger und Fahrtenregler. Diese Platine empfängt (mit einem AtMega8) das Steuersignal, schaltet die Motordrehrichtung über Relais und sendet ein konvertiertes Signal an den Fahrtenregler. Gebe ich Gas in Vorwärtsrichtung, so schalten 2 Relais und das Steuersignal wird eins zu eins weitergegeben. Gebe ich Gas in Rückwärtsrichtung, so schalten 2 andere Relais (Motor wird umgepolt) und das Steuersignal wird so manipuliert, als würde ich Gas in Vorwärtsrichtung geben. Die Umsetzung funktioniert, wenn ich sie mit Potentiometern teste. Deshalb habe ich mir nun auch nicht die Mühe gemacht Schaltplan und Code zu posten. Mein Problem ist folgendes: Ich habe die Signalleitung mit einem Multimeter gemessen und ging davon aus, dass der Regler mit Hilfe einer Spannung angesteuert wird (Leider vorher nicht genügend informiert Shame on me). Als ich merkte, dass die Platine keine Funktion vorweißt, habe ich recherchiert, dass Regler mit einer Frequenz angesteuert werden. Kurz gesagt, mein Fehler war, dass ich davon ausging, das der Regler mithilfe einer Spannung angesteuert wird und nicht mit einer Frequenz. Nun will ich die Platine umprogrammieren. Hat eventuell jemand von euch einen Link, auf dem diese Ansteuerung gut erklärt ist oder kann sie (sofern es nicht umfangreich ist) erklären? Habe irgendwie nichts verständliches gefunden. Genauso wichtig: Ist es mir möglich dieses Signal mit einem AtMega8 zu verarbeiten und ein neues moduliertes Signal auszugeben?
Dein Fahrtregler verhält sich wie ein Modellbau-Servo. Und dazu gibt es hier gefühlt einige Millionen Beiträge.
> Ich habe die Signalleitung mit einem Multimeter gemessen und > ging davon aus, dass der Regler mit Hilfe einer Spannung angesteuert > wird Wie kommst du auf so eine Idee? Wenn du selbst den Regler ansteuerst, steuerst du ihn ja auch nicht über eine Spannung an. Also muss wohl der Regler, wenn deine Platine nicht da wäre, vom Original-Empfänger genau dieselbe Ansteuerung bekommen, wie die, die du jetzt auswerten musst um zu wissen, was deine Platine zu tun hat. Verklopf den Regler wieder und kauf dir einen für Autos. Die machen nämlich zum Teil noch mehr. Wenn du bremst, dann wird bei den Besseren die Energie nicht einfach nur verbraten sondern wieder in den Akku zurückgepumpt.
Ok, danke für die Information. Logisch wenn ich drüber nachdenke. Habe den Regler ja in den Stecker des alten Servos getan. Signalansteuerung ist verstanden. Jetzt Kann ich ja auch sehr einfach ein Signal mittels PWM oder Timer erstellen. Kurze Frage am am Rand, die Frequenz wird doch mit High(Vcc) und Low(0V) geschaltet oder? Ich muss allerdings noch ein Signal abfangen, um es modellieren zu können. Jemand da eine Idee oder einen Vorschlag, wie ich die Signallänge vom Empfänger möglichst einfach in den IC bekomme?
timo k. schrieb: > ein Signal mittels PWM oder Timer erstellen. Kurze Frage am am Rand, die > Frequenz wird doch mit High(Vcc) und Low(0V) geschaltet oder? Ja klar. Aber die Frequenz interessiert dich ja im Grunde überhaupt nicht. Was dich interessiert: Wie lange ist der Puls vom Empfänger HIGH. > Jemand da eine Idee oder einen Vorschlag, wie ich die Signallänge vom > Empfänger möglichst einfach in den IC bekomme? Input Capture und zwischendurch die Ansprechflanke von Low-High auf High-Low umstellen. Auch hier gibts wieder einige Projekte, die mit der Suche gefunden werden können. Such nach "RC Empfänger Signal auswerten" oder einigen Variationen davon.
Ist das Verhältnis zwischen High und Low oder die absolute Zeit des High wichtig? Wegen des Inputs: Also der Ablauf könnte so aussehen, right? Interrupt Flanke Low zu High -> Flanken wechsel und Upcounter initialisieren, Interrupt Flanke High zu low -> Upcounter stoppen Wert auslesen, Noch zwei kleine Fragen am Rande: -Durch den PWM wird schon ein Timer benutzt oder? -In der Erklärung zum Servo steht, das der Servo nach Möglichkeit eine andere Stromquelle wie der IC haben sollte. Ich habe ein 100nF Kondensator verbaut. Denkst du, das reicht, wenn die die selbe Quelle haben?
timo k. schrieb: > Ist das Verhältnis zwischen High und Low oder die absolute Zeit des High > wichtig? Die Signalbeschreibung findest du z.B. bei Wikipedia http://de.wikipedia.org/wiki/Servo#Ansteuerung
Komisch. Du kannst einen Fahrtregler korrekt ansteuern, weißt aber nicht, wie das Signal aufgebaut ist? Hmm. Das gibt mir zu denken.
Habe mir den PWM jetzt mit einem Vorteiler von 256 eingestellt. Bei 4.000.000Hz ergibt das eine Taktlänge von 256/4.000.000=64us. Bei PWM 8bit phase correct ergibt eine Periode 510 Takte also 510*64us=32,6ms. Kann der Fahrtenregler mit der Periodenlänge wohl um? Wenn ja, dann muss ich den High Bereich zwischen 3,26ms (1/20 Periodendauer) und 1,63ms legen oder?
> Bei PWM 8bit phase correct
Wozu phase correct?
Nimm eine stink normale gewöhnliche Fast-PWM und gut ists. Rechnet sich
auch einfacher.
timo k. schrieb: > Kann der Fahrtenregler mit der Periodenlänge wohl um? > Wenn ja, dann muss ich den High Bereich zwischen 3,26ms (1/20 > Periodendauer) und 1,63ms legen oder? Nein. Die Pulslänge bewegt sich im Bereich 1ms bis 2ms. Das ist deine Basis. Die 20ms Wiederholfrequenz interessieren keinen! Das heißt, ja natrlich interessieren sie. Aber sie sind nicht in Stein gemeisselt. Ob das 15ms sind, oder 18, oder 20 oder 25, ist der Servoelektronic (und nichts anderes sitzt in deinem Fahrtregler) piep-schnurz-egal. Die interessiert sich nur für die Pulslänge, wie lange die High_Phase des Pulses ist. Da steckt die Positionsinformation bzw. bei dir eben die Fahrstufeninformation drinnen. Und die steht in keinem Bezug zur Low-Phase. Modellbauservo Ansteuerung
Karl Heinz Buchegger schrieb: > Komisch. > Du kannst einen Fahrtregler korrekt ansteuern, weißt aber nicht, wie das > Signal aufgebaut ist? > > Hmm. Das gibt mir zu denken. Wie gesagt, Ich hab mit einem Multimeter die Spannung des Signals gemessen (Unsinniger Wert, da die Impulse irgend eine Unsinnsspannung vorgegaukelt haben). Habe eine Steuerung für diese Spannungen gebaut und sie mit Potentiometern ausgetestet. Wäre das Signal nicht auf Impulsen sondern auf Spannung konzipiert, hätte meine Steuerung funktioniert. Den Fahrtenregler habe ich nicht korrekt angesteuert, nur meine selbst gemachte Kontrolliereinheit. Ich wollte damit nur sagen, das mein Fehler weder in meiner Hardware, noch in meiner Programmierkunst liegt, sondern lediglich in den fehlenden Kenntnissen über Servos. Das hat sich jetzt ja aber. Michael schrieb: > timo k. schrieb: >> Ist das Verhältnis zwischen High und Low oder die absolute Zeit des High >> wichtig? > > Die Signalbeschreibung findest du z.B. bei Wikipedia > http://de.wikipedia.org/wiki/Servo#Ansteuerung Da wurd es mir nicht eindeutig genug. Wollte nicht alles falsch ausrechnen und dann falsch kalibrieren. Deshalb fragte ich das 2-3 mal und habe auf eine JA/NEIN Antwort gewartet.
timo k. schrieb: > Habe eine Steuerung für diese Spannungen gebaut und > sie mit Potentiometern ausgetestet Na, auf die bin ich gespannt! Würdest du uns die bitte zeigen?!
Vorab: STK500-Besitzer schrieb: > timo k. schrieb: >> Habe eine Steuerung für diese Spannungen gebaut und >> sie mit Potentiometern ausgetestet > > Na, auf die bin ich gespannt! > Würdest du uns die bitte zeigen?! Hört mir eigentlich niemand zu? Das war eine falsche Steuerung -> Die lief NICHT an einem Servo oder Regler. Streicht das aus dem Text meinetwegen. Ich wollte nur verdeutlichen, dass ich an einem komplett falschen Ansatz hatte und der Fehler nicht daran liegt das ich nicht löten kann oder so. Ich erklärs mal einfach: Variable Spannung mit Poti an ADC. Modulierte Spannung an PWM raus. Bringt nur nichts, weil dem Servo die Spannung egal ist. Ist doch auch TOOOOOTTTAAALLL egal jetzt. Ich weiß jetzt, dass die Schaltung am Servo nicht funktioniert und habe es geändert. Warum sollte ich sie dir dann bitte schön zeigen?! Und jetzt mal wieder zum Thema. Habe das Programm woweit geändert. Das Programm funktioniert nur leider nicht. Wenn ich eine feste Impulsgröße programmiere läuft der Motor. Mache ich die Variable jedoch abhängig vom Eingangsimpuls, so funktioniert es nicht. Habe das blöde Gefühl als wenn der Fehler bei der INT0 Interrupt sitzt. Falls jemand Zeit und Lust hat einen Fehler zu suchen wäre nett, wenn er sich den Code anschaut. Achja das Programm ist im Moment so geschrieben, dass es den Motor bei positivem Ausschlag mit Vollgas ansteuert und bei negativem Ausschlag mit Vollgas in Rückrichtung. In der Praxis sieht es so aus, dass der Motor in Rückrichtung fährt egal welches Eingangssignal anliegt.
1 | include <avr/io.h> |
2 | #include <util/delay.h> |
3 | #include <stdint.h> |
4 | #include <avr/interrupt.h> |
5 | |
6 | volatile uint8_t signalinput; |
7 | volatile uint8_t signaloutput; |
8 | volatile uint8_t u_middle; |
9 | volatile uint8_t drehrichtung; |
10 | |
11 | //Funktion long_delay(); für Zeitverzögerung
|
12 | void long_delay(uint16_t ms) |
13 | {
|
14 | for(; ms>0; ms--) _delay_ms(1); |
15 | }
|
16 | |
17 | ISR(INT0_vect) |
18 | {
|
19 | cli(); |
20 | if ( MCUCR & ( 1 << ISC00 ) ) |
21 | {
|
22 | TCNT0 = 0x00; // Timer initialisieren |
23 | MCUCR |= (1 << ISC00); // Fallende Flanke |
24 | }
|
25 | |
26 | else
|
27 | {
|
28 | signalinput = TCNT0; // Timerzeit abspeichern |
29 | MCUCR &= (1 << ISC00); // Steigende Flanke |
30 | }
|
31 | sei(); |
32 | }
|
33 | |
34 | void signalbearbeitung() |
35 | {
|
36 | if(signalinput>=u_middle) //Motorrichtung 1 |
37 | {
|
38 | if(drehrichtung==2) |
39 | {
|
40 | PORTD=0b00000000; |
41 | long_delay(100); |
42 | }
|
43 | PORTD=0b01001000; |
44 | signaloutput=0x28; //Ausgang definieren |
45 | drehrichtung = 1; |
46 | }
|
47 | |
48 | if(!(signalinput>=u_middle))//Motorrichtung 2 |
49 | {
|
50 | if(drehrichtung==1) |
51 | {
|
52 | PORTD=0b00000000; |
53 | long_delay(100); |
54 | }
|
55 | PORTD=0b00110000; |
56 | signaloutput=0x13; //Ausgangssignal konvertieren |
57 | drehrichtung=2; |
58 | }
|
59 | |
60 | OCR1AL=signaloutput; //Ausgabe des Outputsignals |
61 | |
62 | }
|
63 | |
64 | |
65 | |
66 | int main() |
67 | {
|
68 | |
69 | /* Setzt das Richtungsregister des Ports B auf 0xff
|
70 | (alle Pins als Ausgang, vgl. Abschnitt Zugriff auf Ports): */
|
71 | DDRD = 0b11111000; |
72 | |
73 | /* Setzt das Richtungsregister des Ports B auf 0xff
|
74 | (alle Pins als Ausgang, vgl. Abschnitt Zugriff auf Ports): */
|
75 | DDRB = (1 << PB1 ); |
76 | |
77 | |
78 | //PWM Signal; Vorteiler 64 (Periode ca. 4,1ms)
|
79 | TCCR1A = 0b10000001; |
80 | TCCR1B = 0b00001011; |
81 | |
82 | |
83 | //Variablendeklaration
|
84 | u_middle = 0x03; |
85 | |
86 | //INT0 Interrupt Einstellungen
|
87 | GICR &= (1 << INT0); |
88 | MCUCR &= ( (1 << ISC01) | (1 << ISC00)); //Steigende Flanke |
89 | |
90 | //TIMER 0 Einstellung TCNT0 ist das Zählregister
|
91 | //Vorteiler 64; Messweite ca.4,1 ms
|
92 | TCCR0 = 0b00000011; |
93 | |
94 | long_delay(1000); //Pause am Anfang |
95 | |
96 | sei(); |
97 | //Programmschleife
|
98 | while (1) |
99 | {
|
100 | signalbearbeitung(); |
101 | };
|
102 | }
|
timo k. schrieb: > Das Programm funktioniert nur leider > nicht. Dann schau doch mal, wie es andere Leute machen, die Programme schreiben, die auch funktionieren... http://www.hanneslux.de/avr/mobau/fr_t15/fr_t15.html http://www.hanneslux.de/avr/mobau/fr_2313a/2313fra.html http://www.hanneslux.de/avr/mobau/fr_2313a/2313frd.html ...
timo k. schrieb: > Hört mir eigentlich niemand zu? Das war eine falsche Steuerung -> Die > lief NICHT an einem Servo oder Regler. Streicht das aus dem Text > meinetwegen. Ich wollte nur verdeutlichen, dass ich an einem komplett > falschen Ansatz hatte und der Fehler nicht daran liegt das ich nicht > löten kann oder so. Angeblich hattest du sie ja getestet... Welchen Controller verwendest du? Controller, die auch eine InputCapture-Einheit besitzen, erledigen deine Pulslängenmessung fast komplett in Hardware.
1 | //Vorteiler 64; Messweite ca.4,1 ms
|
wenn dein Impuls nur zwischen 1 und 2ms lang sein soll, stimmt deine Kommentar nicht.
Bei meiner cpu frequenz und dem vorteiler liegt der messbereich bei 8 bit von 0-4,1 ms. Das liegt 2 ms am nãhsten Verwende einen atmega8 Wo fehlt die tilde?
So, ich hab das Projekt jetzt beendet. Regler läuft, danke an alle die geholfen haben! Gute Nacht!
Hi, nur mal so nebenbei.... wenn du das mit dem Umpolen machst kannst du dir bestimmt bald mindesten neu Zahnräder kaufen gehn wenn nicht mehr. Mal abgesehn davon das das Auto unkontrollierbar wird.... wenn du bei Vollgas Vorwärts mal schnell den Rückwärtsgang reinhaust. Wenn du dir schon sowas bastelst.... mach doch gleich nen ganzen Regler selbst ;) bye
Stefan S schrieb: > wenn du das mit dem Umpolen machst kannst du dir > bestimmt bald mindesten neu Zahnräder kaufen gehn wenn nicht mehr. Das kommt aber auch auf die Software an. Z.B. haben meine Fahrtregler mit Umpolrelais (Gartenbahn) Rampen für Beschleunigung und Verzögerung und das Relais wird nur im Stillstand des Motors geschaltet. ...
naja, je nach Motor wird das Relais das wohl nicht lange mit machen. Da kommen so einige Ströme zusammen. Ich hätte das so belassen. Ein Verbrenner fährt ja auch nur vorwärts. Meiner jedenfalls. Wenn das erstmal klebt dann viel Spaß beim anhalten.
Wenn Du in die Richtung "Bremsen / Rückwärtsgang" steuerst, dann wird Dein Regler denken, dass Du immer härter Bremsen willst. Also musst Du doch nur mit einem 3. Kanal die Fahrtrichtung mit den Relais umschalten und Dein Fahrtregler gibt weiterhin vorwärts Gas, wenn Du den Hebel am Sender ziehst und bremst, wenn Du den Hebel nach vorne schiebst. Du musst Dir nur eines der gefühlt 1,5 Mio. Programme raussuchen mit denen Du die Impulslänge des 3. Kanal misst und z.B. bei Impulslänge über 1,0 ms den Vorwärstgang schaltest und bei allen Signallängen unter 1,0 ms den Rückwärtsgang einschaltest. Abgesehen davon gibt es beim Hobbykönig in HongKong Bruschlessregler mit Rückwärtsgang und halbwegs brauchbare Motoren für einen annehmbaren Preis. Ein Gastleser
Eben, ich finde auch, daß ein zusätzlicher Kanal der nur ein Umpolrelais schaltet, die beste Wahl wäre. Und das schöne daran: So was gibt es fertig. Vorausgesetzt, die Fernsteuerung hat einen weiteren Kanal.
Habe leider keinen weiteren Kanal. Naja ich werde es so lassen. Ich weiß dass ich das ganze hätte kaufen können. Hätte sich Arbeitskosten-Nutzen tchnisch auch ausgezahlt schätz ich. Bin aber ein "relativer" Anfänger wenn es um ICs geht und ich mach das nur aus Spaß. Das Auto fährt nun so wie ich es mir vorgetellt habe und das reicht mir. Find es einfach klasse eine Steuerung frei nach seinen Vorstellungen zu bauen. Naja besten Dank für die Hilfe!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.