Forum: Mikrocontroller und Digitale Elektronik Mikrocontroller Ansteuerung von Schrittmotor (l297/l298)


von Martin (Gast)


Lesenswert?

Hallo,
ich hatte vor ein paar Wochen schonmal hier nach der 
Schrittmotorsteuerung gefragt, und habe sie jetzt auf einer Platine 
zusammengelötet.
Und zwar habe ich diesen
http://i0.wp.com/www.precifast.de/wp-content/uploads/2013/11/schaltplan.png
Schaltplan verwendet, allerdings nur die 9V Spannungsquelle genommen, 
also keine zusätzliche Spannungsquelle wie im Schaltplan.
Die Ansteuerung wird über einen ATmega32 gemacht.
Leider bekomme ich aber keine definierten Schritte hin (Der Schrittmotor 
ist aus einem Scanner), sondern nur scheinbar regellose  Drehungen in 
einem bestimmten Takt (nicht immer dieselbe Schrittweite und nicht immer 
dieselbe Richtung).
Die Frage ist natürlich, wo ist der Fehler ;)
Zunächst mal mein Code:
1
#define F_CPU 8000000UL
2
#include <avr/io.h>
3
#include <util/delay.h>
4
#include <avr/interrupt.h>
5
6
int main(void)
7
{
8
  // Variablen
9
  
10
  uint8_t pwm_soll = 95; // pwm_soll=100-(U_wunsch/U_ausgang*100) ?
11
  uint8_t pwm_phase = 0; // Laufwert der Schleife 0..100
12
13
  
14
  // Alles an Port A : 1-> En, Clock, CCW/CW, Reset, VRef, Half/Full,Control <-8
15
  DDRA=0xFF; //PORTA als Output
16
  PORTA=0x9; // 8-> 0001001 <-1
17
  
18
  // Timer einstellen für die taktgebung
19
  TIMSK |= (1<<TOIE0);  // den Overflow Interrupt des Timers freigeben
20
  TCCR0 = (1<<CS01);    // Vorteiler 8, jetzt zählt der Timer bereits
21
  
22
  sei();                // und Interrupts generell freigeben
23
  
24
  
25
  while(1)
26
  {
27
    
28
     //V_ref einstellen
29
     if( pwm_soll == pwm_phase )
30
     {
31
       PORTA |= (1<<PA4); // active low LED aus
32
     }
33
     pwm_phase++;
34
     if( pwm_phase == 100 )
35
     {
36
       pwm_phase = 0;
37
       PORTA &= ~(1<<PA4); // active low LED an
38
     }
39
  
40
  } //while 1 loop ends
41
} //main ends
42
43
ISR( TIMER0_OVF_vect )       // Overflow Interrupt Vector
44
{
45
  static uint16_t swTeiler = 0;
46
  static uint16_t test=0;
47
  
48
  swTeiler++;
49
  if( swTeiler == 2000 ) {    // nur jeden 2000. Aufruf nuzten
50
   swTeiler = 0;            
51
   test=1;
52
  }  
53
  
54
  if (test==1)
55
  {
56
    PORTA &= ~(1<<PA1);
57
  }
58
  if (swTeiler==200)
59
  {
60
   if (test==1)
61
   {
62
     test=0;
63
     PORTA |= (1<<PA1);
64
   }         
65
  }
66
}

Abgesehen davon, dass ich in der C-Syntax noch nicht fit bin, würde das 
so genügen um zumindest die richtigen Signale an den L297 zu geben? Was 
meiner Meinung nach passieren sollte ist, etwa alle halbe Sekunde das 
Clock Signal auf 0V runterzuziehen und somit einen Schritt auslösen (Der 
Timer mit Interrupt). Sollte der Takt funktionieren?
Die andere Schleife dient zur Einstellung des Motorstroms. Ich dachte 
ich könnte mir die gewünschten V_ref=0,3V einfach mittels PWM vom 
Mikrocontroller ausgeben lassen. Allerdings Frage ich mich inzwischen ob 
das vielleicht auch schon Probleme bereitet, weil ja hier im Prinzip 
ganz schnell zwischen 5V und 0V hin und hergeschaltet wird, sodass 
effektiv 0,3V rauskommen. Da Wäre es vielleicht besser die gewünschte 
Spannung mit einem Potentiometer einzustellen?
Wie man im Code sieht habe ich fast alle Eingänge (En, Clock, CCW/CW, 
Reset, VRef, Half/Full,Control) direkt am Mega32 angeschlossen, ist das 
ein Problem?
Eine weitere mögliche Fehlerquelle, ich habe das Ganze auf einer 
Streifenrasterplatine, könnte das Probleme verursachen, durch lange Wege 
oder ähnlichem?
Wie kann ich Grundsätzlich die Schaltung testen, ohne ein Oszilloskop zu 
besitzen? Sonst könnte ich ja mal schauen ob die richtigen Signale 
ausgegeben werden von den ICs. Gibt es was charakteristisches was ich 
mit nem Multimeter testen könnte, Spannungen an bestimmten Pins z.b.?

Vielen Dank und viele Grüße
Martin

von Michael K. (tschoeatsch)


Lesenswert?

Hallo Martin,
Versuch doch erstmal deine Motorsteuerung. Alles vom MC abklemmen und 
mit entsprechenden Pegel an den Eingängen der Steuerung ordentliche 
Steps erzeugen. Ein Puls an clock, der Motor macht einen stepp, dir 
umpolen, der Motor macht bei einem neuen clockpuls einen step zurück. 
Wenn das klappt, dann den MC drann.
Grüße von tschoeatsch

von Mike (Gast)


Lesenswert?

Martin schrieb:
> allerdings nur die 9V Spannungsquelle genommen,

... und deine Spannungsquelle kann auch den Strom für den Schrittmotor 
liefern?

von Martin (Gast)


Lesenswert?

Hallo, denke das sollte sie können. Hab es jetzt mal mit 12V und 0,5A 
probiert, allerdings das gleiche Verhalten. Aktuell hängt aber auch noch 
keine Last dran.

Ohne MC werde ich morgen mal probieren!

Kann man sonst irgendwie erkennen ob 297/298 kaputt sind?

Danke und viele Grüße,
Martin

von Michael K. (tschoeatsch)


Lesenswert?

Wenn der Deckel aufgeschnappt ist, ist das IC oft kaputt!
Also, teste die Motorelektronik mit Schalter und Taster an den 
Eingängen.Z.B. Taster an clock, Schalter an CW/ccw, Schalter an enable 
usw. Dann kannst du mit einem Multimeter an den Ausgängen der ICs 
wunderbar die Pegel ablesen und mit dem Datenblatt vergleichen.
Grüße und viel Erfolg wünscht tschoeatsch

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.