Forum: Mikrocontroller und Digitale Elektronik Roboter will nicht rückwärts fahren


von Jonas Wühr (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich habe einen Roboter gebaut, dessen Antriebsmotor über einen TIP41C 
zur Leistungsregelung und einem zweifachen Wechslerrelais geregelt wird. 
Zur Steuerung verwende ich einen ATmega 32.
Vorwärtsfahren klappt ja soweit wie geplant, doch leider Will das Ding 
nicht rückwärts fahren.
Was habe ich falsch gemacht?
Im Anhang sind C-Code für den ATmega und eine Schaltskizze.
Danke im Voraus!

Viele Grüße,
Jonas Wühr

von frank (Gast)


Lesenswert?

Einen Schaltplan auf dem Kopf zu lesen ist schwer.

Hast du schon gemessen ob der uC auch den Pin schaltet wo dein Relais 
hängt?

von Karl H. (kbuchegg)


Lesenswert?

Bring erst mal einen COde in Ordnung.
Ich seh in deinem Code nichts, warum der Motor überhaupt auf rückwärts 
schalten sollte.

Da steht
1
int main()
2
{
3
   .... Initialisierung
4
5
  while( 1 )
6
  {
7
     Haufen auskommentiertes Zeug
8
  }
9
}

in anderen Worten: Der Robot macht nichts, weil du das genau so 
programmiert hast, das er nichts tun soll.

: Bearbeitet durch User
von oszi40 (Gast)


Lesenswert?

Dann prüfe doch erst mal systematisch ob mechanisch sich alles rückwärts 
bewegen lässt und das Polwenderelais wirklich schaltet. Außerdem ist 
eine kleine zeitliche Pause zwischen vor-und rückwärts nötig, da sonst 
der Motor noch als Generator arbeitet und viel Strooom fließt.
Weiterhin vermisse ich eine Freilaufdiode am Relais, um die böse 
induktive Abschaltspannung zu verhindern. Lies 
http://www.mikrocontroller.net/articles/Relais_mit_Logik_ansteuern

von Jonas Wühr (Gast)


Lesenswert?

Nein, mechanisch passt alles. Das relais schaltet. Und die 
Freilaufdioden hängen leider bei der post fest :(

von Karl H. (kbuchegg)


Lesenswert?

Ich hab mir mal ein paar andere Posts von dir angesehen.
In einigen davon immer der gleiche 'Fehler'

In C kann man offiziell keine Funktionen innerhalb anderer Funktionen 
definieren.

man kann also nicht schreiben
1
int main()
2
{
3
4
  ....
5
6
  void vorwaerts(int v)
7
  {
8
    ...
9
  }
10
11
  ....
12
}

In C wird jede Funktion für sich selbst geschrieben, also nicht 
geschachtelt
1
void vorwaerts(int v)
2
{
3
  ...
4
}
5
6
int main()
7
{
8
9
  ....
10
11
12
  ....
13
}

Das das bei dir keine Fehlermeldung gibt, liegt an einer gcc 
Erweiterung, die du besser ignorierst.
Ausserdem scheinst du der Meinung zu sein, nur dadurch, dass du eine 
Funktion definierst, wird sie auch schon ausgeführt. Da muss ich dich 
enttäuschen: aufrufen musst du sie schon auch. Eine Funktionsdefinition 
ist erst mal genau das: wie sieht die Funktion aus. Ausgeführt wird sie 
erst, wenn sie aufgerufen wird.
1
void vorwaerts(int v)
2
{
3
  ...
4
}
5
6
int main()
7
{
8
9
  ....
10
11
  while( 1 ) {
12
    vorwaerts( 20 );
13
    ....
14
  }
15
}


Also bring deinen Code in Ordnung.
Und kauf die ein C-Buch. Das sind eigentlich banale Sprach-Grundlagen, 
die dir jedes C Buch problemlos beibringen kann. Kaum zu glauben, dass 
du den UART Teil selbst geschrieben hast, wenn es schon an solch simplen 
Sachen scheitert.

: Bearbeitet durch User
von Jones (Gast)


Lesenswert?

Nein, die funktion ist nur im code oben nicht aufgerufen.

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.