Forum: Mikrocontroller und Digitale Elektronik Schrittmotor / Taktgenerator


von Sven W. (sickone4)


Lesenswert?

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

von Düsendieb (Gast)


Lesenswert?

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

von Sven W. (sickone4)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Sven W. (sickone4)


Lesenswert?

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....

von Karl H. (kbuchegg)


Lesenswert?

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.

von Sven W. (sickone4)


Lesenswert?

hehe

spezifische frage:

wie kann ich einen takt mit einem timer in C programmieren?

von Düsendieb (Gast)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

Sven Weinmann schrieb:
> hehe
>
> spezifische frage:
>
> wie kann ich einen takt mit einem timer in C programmieren?

FAQ: Timer

von Sven W. (sickone4)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Sven W. (sickone4)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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
}

von Sven W. (sickone4)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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?

von Sven W. (sickone4)


Lesenswert?

war dein quellcode eben schon da?

falls ja hab ich den echt nicht gesehen..... aber es ist verständlich 
und ersichtlich danke

von Karl H. (kbuchegg)


Lesenswert?

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.

von Sven W. (sickone4)


Lesenswert?

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
Noch kein Account? Hier anmelden.