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
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?
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
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
Nein, mechanisch passt alles. Das relais schaltet. Und die Freilaufdioden hängen leider bei der post fest :(
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
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.