Forum: Mikrocontroller und Digitale Elektronik Signalumformung Fahrtenregler mit AtMega8


von Timo K. (timok)


Lesenswert?

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?

von STK500-Besitzer (Gast)


Lesenswert?

Dein Fahrtregler verhält sich wie ein Modellbau-Servo. Und dazu gibt es 
hier gefühlt einige Millionen Beiträge.

von Karl H. (kbuchegg)


Lesenswert?

>  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.

von Timo K. (timok)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Timo K. (timok)


Lesenswert?

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?

von Michael (Gast)


Lesenswert?

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

von Timo K. (timok)


Lesenswert?

Habe bereits das Signal analysiert ;)
Trotzdem danke

von Karl H. (kbuchegg)


Lesenswert?

Komisch.
Du kannst einen Fahrtregler korrekt ansteuern, weißt aber nicht, wie das 
Signal aufgebaut ist?

Hmm. Das gibt mir zu denken.

von Timo K. (timok)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

> Bei PWM 8bit phase correct

Wozu phase correct?

Nimm eine stink normale gewöhnliche Fast-PWM und gut ists. Rechnet sich 
auch einfacher.

von Karl H. (kbuchegg)


Lesenswert?

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

von Timo K. (timok)


Lesenswert?

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.

von STK500-Besitzer (Gast)


Lesenswert?

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?!

von Timo K. (timok)


Lesenswert?

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
}

von Hannes L. (hannes)


Lesenswert?

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

...

von STK500-Besitzer (Gast)


Lesenswert?

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.

von STK500-Besitzer (Gast)


Lesenswert?

1
MCUCR &= (1 << ISC00)

da fehlt ne Tilde "~".

von STK500-Besitzer (Gast)


Lesenswert?

1
//Vorteiler 64; Messweite ca.4,1 ms

wenn dein Impuls nur zwischen 1 und 2ms lang sein soll, stimmt deine 
Kommentar nicht.

von Timo K. (timok)


Lesenswert?

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?

von Timo K. (timok)


Lesenswert?

So, ich hab das Projekt jetzt beendet.
Regler läuft, danke an alle die geholfen haben!

Gute Nacht!

von Stefan S (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Stephan (Gast)


Lesenswert?

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.

von Mitleser (Gast)


Lesenswert?

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

von MaWin (Gast)


Lesenswert?

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.

von Timo K. (timok)


Lesenswert?

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
Noch kein Account? Hier anmelden.