Hallo, ich habe die Aufgabe einen Schrittmotor mit enem ATMega128 zu steuern. Der Microcontroller arbeitet mit 4MHz. Ich habe den folgenden Code zur Probe erstellt,der Motor macht,aber nur ein Schritt in der entsprechenden Richtung und bleibt stehen. Was mache ich da falsch? Ich glaube, dass meine warte() Funktion nicht stimmt,was soll ichda ändern? #include <avr/io.h> #ifndef F_CPU #define F_CPU 3686400UL /* Quarz mit 3.6864 Mhz */ #endif #include <inttypes.h> void warte(void); int main(void) { DDRC=0xff; for (uint8_t i=0;i<50;i++){ PORTC=42; // C ist mit dem Motor verbunden warte(); } while(1){ } return 0; } void warte(void){ volatile unsigned long p; for(p=0;p<80;p++); }
Wenn du immer nur das gleich Bitmuster ausgibst (42), dann ist es ganz normal das nichts passiert...
Ahso... ich habe gedacht,dass dieses Bitmuster ein Schritt in bestimmer Richtung bedeutet nd,dass durch die Schleife,werden einfach mehrere(in dem Fall 50) Schritte gemacht.
Hi Da stellt sich gleich die Frage, wie der Schrittmotor angeschlossen ist. MfG Spess
Hi, wie meinst du es genau? Ich kenne mich nicht so gut aus. Ich habe den Motor an dem C port angeschlossen und versuche den in bewegung zu bringen :-))
>Ich habe den Motor an dem C port angeschlossen >und versuche den in bewegung zu >bringen :-)) Mit oder ohne Treiber. Ohne kannste knicken;) Und eine Steppersequenz besteht nicht aus einer 42. Wobei die Zahl mir gerade sehr bekannt vorkommt;)
Ich habe Schrittmotorsteuerung und Treiber alles auf einer Plattine zur Verfügung. Was soll ich eingeben wenn ich z.B den Motor 5 Schritte nach rechts drehen will? Kannst d mir ein Beispielcode geben,so kann ich vielleicht besser versteen wie das Ganze funktioniert. Danke!
>Ich habe Schrittmotorsteuerung und Treiber alles auf einer Plattine zur >Verfügung. Was soll ich eingeben wenn ich z.B den Motor 5 Schritte nach >rechts drehen will? Lies das Handbuch zu deiner Platine deren Namen hier keiner kennt.
Hi >Kannst d mir ein Beispielcode geben,so kann ich >vielleicht besser versteen wie das Ganze funktioniert. Ohne deine Hardware zu kennen? Da musst du schon mit ein paar mehr Informationen herausrücken. Am besten mit dem Schaltplan der Schrittmotorplatine. MfG Spess
Ich habe leider kein Handbuch,diese Platine wurde in einem Labor gebaut und dazu wurde mir ein Assembler- Code als Beispiel gegeben. Davon habe ich die Zal 42 auch genommen.
Hi >Ich habe leider kein Handbuch,diese Platine wurde in einem Labor gebaut >und dazu wurde mir ein Assembler- Code als Beispiel gegeben. Davon habe >ich die Zal 42 auch genommen. Dann stell wenigsten das Assemblerprogramm hier rein. Und sieh nach, was auf der Platine für Bauelemente/ICs drauf sind. MfG Spess
ich habe einen L297 Stepper Motor controller, L298N Dual Bridge Driver. Assembler Code: .INCLUDE"m128def.inc" .CSEG rjmp progstart progstart: ldi r16,LOW(RAMEND) out SPL,r16 ldi r16,HIGH(RAMEND) out SPH,r16 lds r16,0x006A cbr r16,1 sbr r16,2 sts 0x006A,r16 in r16,EIMSK sbr r16,1 out EIMSK,r16 sei : Interrupts global freigeben ldi r16,0 out DDRD,r16 ldi r16,0b11111110 : Port C Ein-/Ausgang out DDRC,r16 ldi r16,0b00101010 : Schrittmotor Modus setzen out PORTC,r16 ldi r18,50 : Zahl der Schritte clock: cbi PORTC,3 : Port C als Clock rcall warte sbi PORTC,3 rcall warte dec r18 brne clock loop2: rjmp loop2 warte: : Wartezeit erzeugen in r17,SREG push r17 ldi r24,0 warte1: ldi r25,0x50 warte2: dec r25 brne warte2 dec r24 brne warte1 pop r17 out SREG,r17 ret .exit
Hi > cbi PORTC,3 : Port C als Clock > rcall warte > sbi PORTC,3 > rcall warte > dec r18 > brne clock Damit wird der Takt für den Treiber erzeugt. Das fehlt in deinem Programm völlig. MfG Spess
hi, ok,soll ich das als eine Interrupt-Routine programmieren?
Hi >ok,soll ich das als eine Interrupt-Routine programmieren? Und an welchen Interrupt hättest du so gedacht? In dem Assemblerprogramm steht auch einiger Müll drin: >lds r16,0x006A -> EICRA > cbr r16,1 -> gehört zu INT0 > sbr r16,2 -> gehört zu INT1 > in r16,EIMSK > sbr r16,1 -> INT1 freigeben > out EIMSK,r16 > sei : Interrupts global freigeben Interrupts freigeben, und weder eine Interruptsprungtabelle noch eine ISR zu haben ist mehr als Dilettantismus. MfG Spess
Den Assembler_Code habe ich nicht geschrieben. Da ich mich mit assembler nicht beschäftigt habe, sollte ich mir Schritt nach Schritt alles übersetzen. Genau sei() hat mit die Routine-Idee gegeben. Ok ich lasse die Interrupts. ich glaube ich kann mir das ganze nicht so gut vorstellen. Ich muss ein Takt erzeugen und auch noch meine Schrittenzahl, Richtung usw. dem Motor auch übergeben. Ich dachte mit dem bitmuster an PORT C und die Warte- Funktion wird das erledigt.
Hi >Ich dachte mit dem bitmuster an PORT C und die Warte- Funktion wird das >erledigt. Nein. Aber kennst du wenigsten die Bedeutung der Bits an PortC. Bit3 ist schon mal der Takt. Ein Bit sollte z.B. für die Richtung sein. Und hast du mal nachgesehen, welche ICs ( z.B. L...) auf der Treiberplatine sind? MfG Spess
Du solltest dich erst mal darüber informieren, was ein Schrittmotor ist, wie der funktioniert und wie man den ansteuert, bevor du ohne irgendwelches Grundwissen ziel- und planlos halbverstandenen Code übersetzt. Das kann doch nur schiefgehen. http://www.roboternetz.de/schrittmotoren.html Da findest du auch die Schaltung mit L297/L298 inklusive Beschreibung.
Hi, Ich habe gesehen dass der Bit3 irgendwie den Takt sein soll. Die Zeile: ldi r16,0b00101010 : Schrittmotor Modus setzen soll auch Enable,CW/CCW,CLOCK usw. setzen. Nun weiss ich nur nich wie ich das als C-programm genau umschreiben soll. Ich habe einen L297 Stepper Motor controller und L298N Dual Bridge Driver auf der Platine.
Hi >Ich habe einen L297 Stepper Motor controller und L298N Dual Bridge >Driver auf der Platine. Dann passt der Hinweis von Andreas schon ganz gut. Dort findest du eine Schaltung mit diesen ICs. Bleibt noch die Frage, mit welchen Bits die Signale Enable,CW/CCW... korrespondieren. >Nun weiss ich nur nich wie ich das als C-programm genau umschreiben soll. Dann mach dich erst mal schlau, wie man in C einzelne Bits setzt und löscht. Und verabschiede dich von der dezimalen Schreibweise. Deine Umrechnung, wenn auch richtig, von 0b00101010 nach 42 stiftet nur Verwirrung. MfG Spess
Ok,danke :-) ich lese erstmal alles durch.
Ich kanns nicht mit ansehen. Wieder mal ein Fall von: Denn sie wissen nicht was sie tun. Und von dem was sie tun haben sie keine Ahnung.
1 | #define F_CPU 3686400UL /* Quarz mit 3.6864 Mhz */ |
2 | |
3 | #include <avr/io.h> |
4 | #include <utils/delay.h> |
5 | #include <inttypes.h> |
6 | |
7 | #define MOTOR_DDR DDRC
|
8 | #define MOTOR_PORT PORTC
|
9 | #define CLOCK_PIN PC3
|
10 | |
11 | int main(void) |
12 | {
|
13 | MOTOR_DDR = 0xFE; |
14 | |
15 | MOTOR_PORT |= (1<<PC1) | (1<<CLOCK_PIN) | (1<<PC5); |
16 | |
17 | Steps = 50; |
18 | |
19 | for( uint8_t i = 0; i < 50; i++ ) { |
20 | |
21 | MOTOR_PORT &= ~(1<<CLOCK_PIN); |
22 | _delay_ms( 100 ); |
23 | MOTOR_PORT |= (1<<CLOCK_PIN); |
24 | _delay_ms( 100 ); |
25 | }
|
26 | |
27 | while( 1 ) { |
28 | }
|
29 | return 0; |
30 | }
|
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.