Hallo Leute, ich habe mir die folgende schaltung: http://www.roboternetz.de/bilder/l298standard.gif aus dem roboternetz für eine schrittmotoransteuerung aufgebaut und habe dazu eine kurze frage: ich habe alles fertig und den eingang clock mal mit einem tastimpuls beschalter -> bit_is_clear -> impuls bit_is_set rücksetzen des pins. und getestet, wenn ich also n mal drücke dreht er sich ein wenig weiter ich benötige also einen taktgenerator, der mir definiert impulse ausgibt. wie gehe ich am besten vor? wie definiere ich einen schritt? wenn ich weiß was ein schritt ist, also was ich dafür tun muss, dann finde ich sicherlich heraus, wie ich n schritte mache. aber im moment stehe ich aufm schlauch. gruß sven
Sven Weinmann schrieb: > ich benötige also einen taktgenerator, der mir definiert impulse > ausgibt. Die Roboter wird doch bestimmt von einem Controller gesteuert, der macht auch die Impulse > > > wie gehe ich am besten vor? tue es > > wie definiere ich einen schritt? ??? jeder Schritt macht ein paar Grad Radumdrehung
ich nutze einen atmega 8 µC keinen roboter. der gibt ja nicht einfach impulse aus! ich kenne von der sps programmierung die möglichkeit sowas mit zwei zeitgliedern zu bauen. beim µC weiß ich jedoch nicht wie ich anfangen soll
Sven Weinmann schrieb: > ich nutze einen atmega 8 µC keinen roboter. der gibt ja nicht einfach > impulse aus! Warum nicht? Pin ist auf Ausgang programmiert Pin auf 1 setzen bischen warten Pin auf 0 setzen und schon hast du deinen Puls. Wo ist da jetzt das Problem? zu ersten Testzwecken
1 | ....
|
2 | |
3 | |
4 | int main() |
5 | {
|
6 | DDR... = ..... // Pin auf ausgang setzen |
7 | |
8 | while( 1 ) { |
9 | PORT... |= ( 1 << Pinnummer ); |
10 | _delay_ms( 500 ); |
11 | PORT... &= ~( 1 << Pinnummer ); |
12 | _delay_ms( 500 ); |
13 | }
|
14 | }
|
Wie hast du denn in deinen Sturm und Drang Jahren eine LED zum Blinken gebracht? Genau das ist das Erzeugen von Pulsen. Da hat halt eine LED einmal geleuchtet und dann wieder nicht geleuchtet und jetzt reagiert halt ein Schrittmotortreiber auf die Abfolge von 0 und 1 am Portpin.
hm... ich habe neulich in einem anderen thema auch delay´s benutzt, da ist man fast umgefallen, ich solle mich davon lösen, das wäre nicht gut für c programme usw, weil es zeit benötige und und und.... da ging es darum, dass mein interupt das programm abbrechen solle....
Sven Weinmann schrieb: > hm... > > ich habe neulich in einem anderen thema auch delay´s benutzt, da ist man > fast umgefallen, ich solle mich davon lösen, das wäre nicht gut für c > programme usw, weil es zeit benötige und und und.... Ist es auch. Für ein erstes Testprogramm kannst du es benutzen. Aber im Endeffekt wirst da das natürlich durch eine Timersteuerung ersetzen. Aber so wie ich das sehe, ist es ja schon mal ein Erfoglserlebnis, wenn sich der Motor erst mal überhaupt dreht. Auch Rom ist nicht an einem Tag erbaut worden. Nur wenn du schon so fragst "Wie erzeuge ich einen Puls", dann muss ich davon ausgehen, dass dein Wissen noch nicht allzugroß ist. Denn sonst hättest du etwas spezifischer gefragt.
hehe spezifische frage: wie kann ich einen takt mit einem timer in C programmieren?
z.B. http://www.mikrocontroller.net/articles/Absolute_Beginner-AVR_Steckbrettprojekte#LED_blinken_lassen
Sven Weinmann schrieb: > hehe > > spezifische frage: > > wie kann ich einen takt mit einem timer in C programmieren? FAQ: Timer
vielen dank. ich habe nun ein script, mit dem ich nun den timer ein wenig kennenlerne. ich teste gerade die prescaler aus. bei einem schrittmotor kommt es mir garnicht auf die geschwindigkeit an, vielmehr auf den schritt den er macht und dass ich diesen n-mal wiederholen lasse. wie lege ich denn mit einem funktionierenden timer einen schritt fest? oder macht man in der praxis den schritt anhand einer umdrehung aus?
Sven Weinmann schrieb: > vielen dank. > > ich habe nun ein script, mit dem ich nun den timer ein wenig > kennenlerne. > > ich teste gerade die prescaler aus. > > bei einem schrittmotor kommt es mir garnicht auf die geschwindigkeit an, > vielmehr auf den schritt den er macht und dass ich diesen n-mal > wiederholen lasse. Na, ja. Zu schnell dürfen die Schritte dann auch nicht sein. Sonst kommt der Motor nicht mehr mit. Und wenn er wegstartet müssen die Schritte langsamer kommen. Denn erst mal muss ja der Motor seine träge Masse erst mal in Schwung bringen. > wie lege ich denn mit einem funktionierenden timer einen schritt fest? Bei jedem Aufruf der Timer-ISR ganz einfach den Ausgangspin umschalten. So wie eine LED zum blinken gebracht wird, nur eben ein wenig schneller.
ja das ist alles schon am laufen nun habe ich einen timer, der läuft und bringt mit bei CPU: 3686400Hz und einem Prescaler von 8 -> 3686400 / 8 = 460800 bei 256 Schritten macht das 460800 / 256 = 1800 Overflows pro Sekunde. damit dreht sich der motor kontinuierlich. in einer undefinierbaren geschwindigkeit. d.h. nicht schnell aber auch nicht langsam. da der motor ein getriebe vorgeschaltet hat und ein ca 1,5cm breites zahnrad (durchmesser) drann sitzt sieht das relativ träge aus! nun möchte ich aber nicht, dass er sich kontinuierlich dreht, sondern nur einen zahn weiter. d.h. ich muss die CS bits auf 0 setzen, damit ich ihn starte/stoppe die frage ist nur, wie lange lasse ich ihn laufen damit er eine von mir festgelegte drehung dreht? also wie definiere ich das er z.b. eine viertelumdrehung macht? benötige ich dafür eine PWM zusätzlich zum timer, um mir diese umdrehung zu definieren?
Sven Weinmann schrieb: > nun möchte ich aber nicht, dass er sich kontinuierlich dreht, sondern > nur einen zahn weiter. d.h. ich muss die CS bits auf 0 setzen, damit ich > ihn starte/stoppe kannst du. Musst du aber nicht. Der Timer kann ja auch weiterlaufen. Lediglich das Pingewackel in der ISR muss zur rechten Zeit (bzw. nach der richtigen Anzahl Wackeloperationen) aufhören. > die frage ist nur, wie lange lasse ich ihn laufen damit er eine von mir > festgelegte drehung dreht? also wie definiere ich das er z.b. eine > viertelumdrehung macht? Indem du die Schritte mitzählst und nach einer definierten Anzahl aufhörst den Pin zu toggeln?
1 | volatile uint16_t Schritte; |
2 | |
3 | ISR( .... ) |
4 | {
|
5 | if( Schritte > 0 ) |
6 | {
|
7 | Schritte--; |
8 | PORT... ^= ( 1 << Pinnummer ); |
9 | }
|
10 | }
|
11 | |
12 | int main() |
13 | {
|
14 | ....
|
15 | |
16 | sei(); |
17 | |
18 | while( 1 ) |
19 | {
|
20 | if( irgendwas ) |
21 | {
|
22 | cli(); |
23 | Schritte = 800; // Lass den Motor 400 Schritte machen |
24 | sei(); |
25 | }
|
26 | }
|
27 | }
|
hm wie soll ich denn die schritte mitzählen bei 1/1800 Hz?? :) so sieht mein quellcode aus, aber ich frage mcih, wo ich da was toggeln soll
1 | //-------------------------------------------------------------------------
|
2 | |
3 | ISR( TIMER0_OVF_vect ) // Overflow Interrupt Vector |
4 | {
|
5 | PORTB ^= _BV(PB1); // Pin B5 invertieren bei jeden Aufruf |
6 | }
|
7 | |
8 | //-------------------------------------------------------------------------
|
9 | |
10 | void timer0(void) |
11 | {
|
12 | TCCR0 |= (1<<CS01); // Vorteiler 8 |
13 | TIMSK |= (1<<TOIE0); // Overflow Interrupt des Timers freigeben |
14 | }
|
15 | |
16 | //-------------------------------------------------------------------------
|
17 | |
18 | |
19 | int main() |
20 | {
|
21 | |
22 | DDRB = 0b11111111; // irgendein Port, damit wir auch was sehen |
23 | |
24 | timer0(); // Timer0 Aufruf für Schrittmotor |
25 | |
26 | sei(); // alle Interruptquellen freigeben |
27 | |
28 | |
29 | while( 1 ) |
30 | {
|
31 | |
32 | // Schrittmotoransteuerung
|
33 | //-------------------------------------------------------------------------
|
34 | |
35 | // B,0 => 10 Enable
|
36 | // B,1 => 18 Clock -> Counteransteuerung für die Impulse
|
37 | // B,2 => 11 Control
|
38 | // B,3 => 17 CW/CCW
|
39 | |
40 | PORTB |= (1<<0); |
41 | PORTB |= (1<<2); |
42 | PORTB &= ~(1<<3); |
43 | |
44 | // ------------------------------------------------------------------------
|
45 | |
46 | } // Ende while(1) |
47 | } // Ende main |
Sven Weinmann schrieb: > hm wie soll ich denn die schritte mitzählen bei 1/1800 Hz?? :) DU WEISST DOCH WO DU DIE SCHRITTIMPULSE GENERIERST ! > > so sieht mein quellcode aus, aber ich frage mcih, wo ich da was toggeln > soll Na hier toggelst du den Pin, an dem der Pulseingang vom Motortreiber drann hängt > ISR( TIMER0_OVF_vect ) // Overflow Interrupt Vector > { > PORTB ^= _BV(PB1); // Pin B5 invertieren bei jeden Aufruf > } Da zählst du einfach mit, wie oft das gemacht wird (oder zählst von der gewünschten Anzahl runter bis 0 erreicht ist.) Und wenn die Anzahl erreicht ist (oder 0) dann wird eben nicht mehr getoggelt
1 | volatile uint16_t Schritte; |
2 | |
3 | ISR( .... ) |
4 | {
|
5 | if( Schritte > 0 ) |
6 | {
|
7 | Schritte--; |
8 | PORTB ^= _BV(PB1); |
9 | }
|
10 | }
|
11 | |
12 | int main() |
13 | {
|
14 | ....
|
15 | |
16 | sei(); |
17 | |
18 | while( 1 ) |
19 | {
|
20 | if( irgendwas ) |
21 | {
|
22 | cli(); |
23 | Schritte = 800; // Lass den Motor 400 Schritte machen |
24 | sei(); |
25 | }
|
26 | }
|
27 | }
|
Fertig. Was ist denn da jetzt schwer drann?
war dein quellcode eben schon da? falls ja hab ich den echt nicht gesehen..... aber es ist verständlich und ersichtlich danke
Sven Weinmann schrieb im Beitrag #2849185:
> woran liegt es eigentlich, dass der schrittmotor so pfeift?
Da passt dann die Schrittfrequenz nicht ganz bzw. liegt auf einer
Frequenz bei der es im Motor zu Resonanzen kommt. Probier einfach mal
eine etwas andere Timergeschwindigkeit.
ich habe gerade davon gelesen, dass das Pfeifen vom Chopper kommt. Beitrag "Schrittmotoren Pfeifen / Summen" ich habe den ton nur im "Stillstand" ich probiere einfach die frequenz ein wenig anzupassen
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.