PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Motor macht was er will



Blinzl0r
20.01.2012, 07:18
Hallo,

ich habe gestern zum ersten mal einen Motor über nen Mikrocontroller angesteuert (ohne PWM).

Jetzt wollte ich den Motor über Tastendruck ausschalten. Aber seit ich das einprogrammiert habe macht er was er will.
Der Motor schaltet ein, aus, dreht langsam usw. ganz von allein. Der Motor verändert seine Geschwindigkeit durch meine Körperbewegungen oder wenn ich den motor im Raum bewege.

Was kann das sein??? Der Motor ist entstört und die Leitung des tasters liegt ganz wo anderst wie die des Motores.


Hier mal das Programm

#include <avr/io.h>

int main (void)

{
while (1)
{
DDRB &= ~(1<< PB1); //PortB Pin2 als Eingang definieren
PORTB |= (1<< PB1); //PortB Pin2 Pullup aktivieren

if (!(PINC & (1<<PINC1)))
{
DDRB |= (1<< PB0); //als Ausgang definieren
PORTB |= (1<< PB0); //auf high setzen
DDRB |= (1<< PB5); //als Ausgang definieren
PORTB &= ~(1<< PB5); //auf low setzen
DDRD |= (1<< PD3); //als Ausgang definieren
PORTD |= (1<< PD3); //auf high setzen
}
else
{
DDRB |= (1<< PB0) | (1<< PB5) | (1<< PB3);
PORTB &= ~(1<< PB0) |(1<< PB5) |(1<< PB3);
}

}

return 0;
}

MfG Ralf

Geistesblitz
20.01.2012, 09:02
Ich kenn mich zwar nicht so mit C aus, aber irgendwie hört es sich so an, als ob der Pin nicht auf Output geschaltet wurde und somit der Transistor für den Motor kein definiertes Signal bekommt.

Hubert.G
20.01.2012, 10:09
if (!(PINC & (1<<PINC1)))


MfG Ralf

Du setzt PortB als Eingang und fragst PortC ab?
Du setzt ausserdem die Port auf Ein- oder Ausgang bei jedem Duchlauf der while neu, das macht man nur wenn sich was ändert.

Blinzl0r
20.01.2012, 10:27
Hi,

oh man richtig.
Jetzt muss ich aber noch einen Programmfehler haben.
Jetzt macht der Motor gar nichts mehr. Ich bekomm ihn nicht mehr gestartet.

MfG Ralf

Calis007
20.01.2012, 10:29
"Der Motor verändert seine Geschwindigkeit durch meine Körperbewegungen oder wenn ich den motor im Raum bewege."

Cool, Du kannst damit Signale von Ausserirdischen empfangen. Oder auch die Aura Deines Koerpers messen.. sehr esoterisch!

Ne, im Ernst: Da liegt ein undefiniertes Signal an und der Eingang reagiert auf minimalste Schwankungen von wasweissichwas.
Der Fehler liegt wohl am PINC, wie es schon Hubert geschreiben hat.

Blinzl0r
20.01.2012, 10:31
"Der Motor verändert seine Geschwindigkeit durch meine Körperbewegungen oder wenn ich den motor im Raum bewege."

Cool, Du kannst damit Signale von Ausserirdischen empfangen. Oder auch die Aura Deines Koerpers messen.. sehr esoterisch!

Ich war auch schon begeistert.^^
ich konnte durch meine Handbewegung die Geschwindigkeit des Motors analog steuern.

Mfg Ralf

Calis007
20.01.2012, 10:49
Und? Fehler schon gefunden? Ansonsten: Wie sieht das Programm nun aus? Verkabelung noch in Ordnung?

Hubert.G
20.01.2012, 10:50
Ich weiß nicht wo der Motor drauf ist, aber PB5 ist immer low.

Blinzl0r
20.01.2012, 11:08
Hallo,

ich hab den Fehler gefunden. Und zwar bin ich es gewohnt (SPS), dass 12V am Eingang anliegen müssen, damit dieser high meldet. und somit habe ich den Port anschluss über den Taster mit 5V verbunden, damit ich bei geschlossenem Taster 5V am Port an liegen habe (wie bei ner SPS).
Ich hab jetzt durch messen herausgefunden, dass ich wenn ich den Eingang definier, 5V an Port anliegen habe. Jetzt habe ich den Taster zwischen Ground und Port gehängt und es geht wie gewünscht.

Kann mir einer sagen warum das beim Mikrokontroller so ist?


MfG und Danke

Calis007
20.01.2012, 11:09
Hmm.. im IF, das
PORTD |= (1<< PD3); //auf high setzen
passiert auch nur einmal und wird nie rueckgesetzt.. hat damit vermutlich nichts zu tun, sieht aber auch sonderbar aus, sollte wohl ein PB3 sein, oder?

5V ist eigentlich ueblich hier, oder auch nur 3.3V.

siehe auch gaengige Logikpegel:
http://de.wikipedia.org/wiki/Logikpegel

Hubert.G
20.01.2012, 11:21
Wenn du einen Port als Eingang definierst, ist dieser erst mal hochohmig. Dann kannst du den internen PullUp aktivieren.
Damit ist dieser Port bei der Abfrage if(Pin....) auf high. Ein Taster macht dann nur Sinn wenn er auf GND schaltet.
Wenn du es umgekehrt haben willst geht das natürlich auch. Es ist dann ein externer PullDown notwendig und die Taste nach +5V.
Der interne PullUp darf dann nicht aktiviert werden.

Blinzl0r
20.01.2012, 11:22
Hmm.. im IF, das
PORTD |= (1<< PD3); //auf high setzen
passiert auch nur einmal und wird nie rueckgesetzt.. hat damit vermutlich nichts zu tun, sieht aber auch sonderbar aus, sollte wohl ein PB3 sein, oder?

5V ist eigentlich ueblich hier, oder auch nur 3.3V.

siehe auch gaengige Logikpegel:
http://de.wikipedia.org/wiki/Logikpegel

hab ich auch grad gelesen^^

jetzt funktionierts.

#include <avr/io.h>

int main (void)

{
while (1)
{
DDRC &= ~(1<< PC1); //PortC Pin2 als Eingang definieren
PORTC |= (1<< PC1); //PortC Pin2 Pullup aktivieren

if (!(PINC & (1<<PINC1))) //Läuft bei Taster geschlossen los
{
DDRB |= (1<< PB0); //als Ausgang definieren
PORTB |= (1<< PB0); //auf high setzen
DDRB |= (1<< PB5); //als Ausgang definieren
// PORTB |= (1<< PB5); //auf high setzen
PORTB &= ~(1<< PB5); //auf low setzen
DDRD |= (1<< PD3); //als Ausgang definieren (Motor enable)
PORTD |= (1<< PD3); //auf high setzen (Motor enable)
}
else
{
DDRB |= (1<< PB0) | (1<< PB5);
PORTB &= ~(1<< PB0) |(1<< PB5);
DDRD |= (1<< PD3);
PORTD &= (1<< PD3);
}

}

return 0;
}


Aber wo ich grad dran bin. Kann mir einer sagen wie das mit ner PWM aussehen muss?

Danke
mfg

Hubert.G
20.01.2012, 11:34
Für die PWM musst du dich mit Timer auseinander setzen.
Dein Programm ist allerdings sehr unübersichtlich. Wenn es mal länger wird, kennst du dich sicher nicht mehr aus.


#include <avr/io.h>

int main (void)
DDRC &= ~(1<< PC1); //PortC Pin2 als Eingang definieren
PORTC |= (1<< PC1); //PortC Pin2 Pullup aktivieren
DDRB |= (1<< PB0); //als Ausgang definieren
DDRB |= (1<< PB5); //als Ausgang definieren
DDRD |= (1<< PD3); //als Ausgang definieren (Motor enable)

{
while (1)
{

if (!(PINC & (1<<PINC1))) //Läuft bei Taster geschlossen los
{

PORTB |= (1<< PB0); //auf high setzen

// PORTB |= (1<< PB5); //auf high setzen
PORTB &= ~(1<< PB5); //auf low setzen

PORTD |= (1<< PD3); //auf high setzen (Motor enable)
}
else
{

PORTB &= ~(1<< PB0) |(1<< PB5);

PORTD &= (1<< PD3);
}

}

return 0;
}

Jetzt hast du es übersichtlicher was du setzt und rücksetzt, PB5 ist hier immer low.

Blinzl0r
20.01.2012, 11:39
Danke,

ja PB5 ist immer low.

Mit PB0 und PB5 wird der Rechts- (PB0=high/PB5=Low), Linkslauf (PB5=high/PB0=Low) und die Bremse(PB0=high/PB5=high) geschalten.

edit: Naja ich will ja nicht Klugscheißen aber die Semikolons müssen oben noch weg :cool:

MfG