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