PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schrittmotor einzelne Steps mit Taster



Ratereducer
29.05.2013, 15:48
Hallo.
Da das mein erster Post in diesem Forum ist stelle ich mich einmal vor.
Mein Name ist Daniel. Ich komme aus Österreich. Ich beschäftige mich schon seit einigen Jahren mit Elektronik und Hochspannung.
Vor einigen Tagen hab ich angefangen einen Atmega 8 in C zu programmieren. Angefangen hab ich mit blinkenden LEDs, Lauflichtern etc.
Jetzt hab ich versucht einen Schrittmotor anzusteuern, was auch funktioniert hat. Ich hab einen bipolaren Stepper der von 2 Vollbrücken aus BD139 angesteuert wird.
Mit ein paar zusätzlichen Schleifen kam dann sowas dabei raus: http://www.youtube.com/watch?v=aA6cN2mLKbQ

Jetzt will ich aber ein Programm das mir pro Tastendruck (Taster an PORTC.0 an +5V, Pulldown 10k gegen GND) und später dann pro Puls aus einer anderen Schaltung den Motor um 1 Step weiterdreht. Ich habs mal mit switch case versucht aber es geht nicht. Eine Entprellung brauche ich auch noch - weis aber nicht genau wie.

hier mein Programm.




#include <avr/io.h>

uint8_t a=0;

void main()
{

DDRD=0b11111111; // kompletter PORTD als Ausgang
DDRC&=~(1<<PC0); // PORTC.0 als Eingang
PORTD|=0b10101010; // Anfangszustand definieren, Schrittmotor haltet


while(1)
{

if(PINC&(1<<PINC0)) // Pin C0 abfragen, ist er 5V? wenn ja...



{

switch (PORTD)

{

case 10101010:

PORTD|=0b01011010;
break;

case 01011010:

PORTD|=0b01010101;
break;

case 01010101:

PORTD|=0b10100101;
break;

case 10100101:

PORTD|=0b10101010;
break;





}
}

}

}



Kann mir jemand erklären woran es scheitert?

mfg

Geistesblitz
29.05.2013, 21:37
Ich vermute Folgendes:
wenn du den Taster gedrückt hältst, dann wird in jedem Schleifendurchlauf die nächste Schrittstellung eingestellt. Da kein Verzögerndes Element wie ein Wait-Befehl vorkommt, dürfte die Frequenz, in der umgeschaltet wird, viel zu hoch sein (vermutlich im einstelligen GHz-Bereich). Da schafft es kein Schrittmotr mitzukommen, geschweige denn anzufahren. Du bräuchtest erstmal einen Wait-Befehl in der Schleife und dann noch eine Variable, mit der verhindert wird, dass die Stellung ständig wechselt, solange du drückst.

hbquax
29.05.2013, 23:13
Vielleicht hilft dir das:
https://www.roboternetz.de/community/threads/61550-Probleme-mit-RNstepp297?highlight=hbquax

Hubert.G
30.05.2013, 09:46
Hier gibt es auch was über Entprellen:
http://www.mikrocontroller.net/articles/Entprellung
Ich arbeite bei solchen Sachen gerne mit Flags.
Nach der Entprellung Flag Taste gedrückt
Wenn Flag Taste gedrückt und Impuls nicht ausgegeben in die Funktion Impuls springen und Flag Impuls setzten. Wenn Impuls aus, Flag Impuls aus setzen.
Wenn Taste losgelassen Flag Taste ist 1 und Flag Impuls ist 0 alle Flags zurücksetzen.
Wenn man den Flags vernünftige Namen gibt bleibt das ganze übersichtlich und man kann alles gegenseitig verriegeln.

Bumbum
30.05.2013, 09:55
Ja genau, hier liegt das Problem:


if(PINC&(1<<PINC0))

Du musst danach warten, bis der Taster wieder losgelassen wird. Ich würde nach dem Switch-Element noch folgende zwei Zeilen programmieren:

while (PINC&(1<<PINC0))
_delay_ms (10);

Damit hast du dann auch gleich deine Entprellung.

Viele Grüße
Andreas

rideyourstyle
30.05.2013, 10:01
Ich habe nicht das ganze Programm angeschaut, aber deine switch-Anweisung wird so nicht funktionieren:



switch (PORTD)
{
case 10101010:
PORTD|=0b01011010;
break;
...


In der switch-Anweisung hast du PORT D, und der ist 8-bit gross. Nachher hinter dem case hast du eine 8-stellige Zahl die für den ersten Fall 10.101Mio bedeuten. Entweder du machst beim case auch ein 0b... davor oder du machst alles direkt in Hex-Werten. Ich meinte mal gelesen zu haben dass C die 0b.... Darstellung nicht unterstützt!

Bumbum
30.05.2013, 11:44
...weil ich es gerade sehe:

Es muss auch



case 0b10101010:


heißen!?

- - - Aktualisiert - - -

...und gleich noch ein Fehler:

[code]

PORTD = 0b01011010;
[code]

ohne das |= das "verodert" dir sonst dein PortD und dann sind alle Bits 1.

Ratereducer
30.05.2013, 19:22
Ich hab mein Ziel erreicht! :p

http://www.youtube.com/watch?v=DIhq1Y1x1ow