Unkontulliertes LED geblinke

OP #2280716
Lesenswert?

Hallo Leute
Ich versuche schon seit einigen Wochen einen alten Bohrplotter wieder in 
Gang zu kriegen. Ich habe mir daher eine neue Steuerung mit einem AVR 
entwickelt der Steuersignale per UART erhält, umrechnet und an drei 
Motortreiberplatinen (jede Achse eine) die als Kern einen L298 und einen 
L297 besitzen, weiterleitet.
Leider habe ich jetzt das Phänomen, das mir sobald ich eine 
Motortreiberplatine anschließe die Ausgänge des AVR's durch drehen. Das 
heist die angeschlossenen LED's blinken wie wild und ungleichmäßig. Der 
Ausgang zur Richtungsänderung des Motors kippt auch hin und wieder mal 
um. Nur beim Taktsignal-Ausgang für die Motortreiberplatine sowie die 
dazugerhörige LED (anderer PIN am AVR) scheinen korrekt zu 
funktionieren. Das kann aber auch sein das durch den schnellen Flanken 
wechsel da nichts auffällt.

Ich habe jetzt das Programm mal so klein wie möglich neu geschrieben um 
einen Programmierfehler aus zu schließen.
Jetzt Läuft der der X-Achsenmotor wenn ich einen Taster (mit externen 
Pull-Down Widerstand) betätige.
1
#include <avr/io.h>
2
#define F_CPU 8000000UL 
3
#include <avr/interrupt.h>
4
#include <util/delay.h> 
5
 
6
#define BAUD 9600UL      // Baudrate
7
#define sbi(ADRESSE,BIT)   ((ADRESSE) |= (1<<(BIT)))
8
#define cbi(ADRESSE,BIT)   ((ADRESSE) &= ~(1<<(BIT)))
9
#define  toggle(ADRESSE,BIT)  ((ADRESSE) ^= (1<<(BIT)))
10
#define MOTORAUSGANG_X  5
11
#define MOTORRICHTUNG_X 4
12
#define DIODE_X      2
13
#define DIODE_Y      3
14
#define DIODE_Z      4
15

16
//globale Variablen
17
volatile int  motor_x;
18
volatile int  motor_y;
19
volatile int  motor_z;
20

21
int main(void)
22
{
23
//----------------Initialisierung---------------------
24
  //Ein- und Ausgänge setzen (1 steht für Ausgang)
25
  DDRB = 0b00100000;
26
  DDRC = 0b00111111;
27
  DDRD = 0b00111111;
28

29
  //Pullup-Widerstände der Eingänge Aktivieren
30
  PORTB = 0b00100000;
31
  PORTC = 0b00111111;
32

33
  //
34
  
35
  // Timerteiler CPU-Takt 
36
  TCCR2 = (1<<CS21)|(1<<CS20);
37
 
38
  // Timer/Counter2 Überlauf Interrupt erlauben
39
  TIMSK = (1<<TOIE2);
40

41
  TCNT2 = 70;
42
 
43
  //UART Initialisieren
44
  uart_init();
45
  
46
  //Motoren auf 0 setzen
47
  motor_x = 0;
48
  motor_y = 0;
49
  motor_z = 0;
50

51
  // Global Interrupts aktivieren
52
  sei();
53

54
//-----------------Programmanfang----------------------
55
  sbi(PORTC,MOTORAUSGANG_X);
56
  sbi(PORTD,DIODE_X);
57
  while(1)
58
  {
59
    
60
  if(!(PINB & (1<<3)))    //Kurzer Motorcheck
61
  {
62
    motor_x = 1;
63
  }
64
  else
65
  {
66
    motor_x = 0;
67
    sbi(PORTD,DIODE_X);
68
    sbi(PORTC,MOTORAUSGANG_X);
69
  }
70
  }
71
  return(0);
72
}
73

74
ISR (TIMER2_OVF_vect)
75
{
76
  if(motor_x != 0)
77
  {
78
    toggle(PORTC,MOTORAUSGANG_X);
79
  toggle(PORTD,DIODE_X);
80
  }
81
 
82
  TCNT2 = 70;
83
  toggle(PORTD,DIODE_Y); //zur Kontrolle
84
}

Jetzt blinken trotz dem noch die LED Z und eine weitere StatusLED wie 
wild.
Bitte macht mir die Motortreiberplatinen nicht madig, von wegen L298 und 
L297 sind ja uhr alt nimm andere. Die Motortreiberplatinen waren vorher 
schon da und die beiden IC's wurden schon auf allen Treiberplatinen 
gewechselt. Die Schaltung auf den Treiberplatinen sind quasi identisch 
mit denen der auf den Datenblättern der IC's.
OP #2280776
Lesenswert?

Die neue Steuerplatine wurde per Lochraster gefertigt. Das Problem tritt 
ja nur auf wenn ich eine Motortreiberplatine an schließe und diese waren 
ja bereits vorher in dem Gerät.

Zur Erläuterung des Schaltplans: die Kästen mit den a und c Nummern sind 
eine zusammanhängende 32 polige Steckerleiste. Und mir ist gerade auf 
gefallen es soll natürlich heißen 8MHz und nicht KHz
Angehängte Dateien:
Persönliche Seite #2280788
Lesenswert?

Mach doch mal parallel zu C3 noch einen Elko mit, sagen wir mal, 470µF. 
Wenn deine Motoren an der selben Spannungsquelle hängen, solltest du 
lieber 4700µF oder noch mehr nehmen. Außerdem solltest du AVCC mit VCC 
verbinden. Und ganz wichtig: Bei solch EMV-Belasteten Umgebungen den 
RESET-PIN NIEMALS OFFEN LASSEN!!! Mach den mal mit ca. 1k Ohm auf VCC. 
Sonst sieht alles ganz gut aus.


Gruß
Jonathan
Gast #2280802
Lesenswert?

Dein Programm ist aber auch nicht klar.

Die LED blinkt natürlich, du machst ja auch toggle,
und das wohl so schnell, daß du es nicht sehen kannst.

Aber wenn sich die Schaltung bei Anschluss der Motorplatine
anders verhält, dann sind Störungen nicht verwunderlich,
denn Motoren sind bekannte Störquellen, die gut verdrahtet
werden wollen, mit sauberer Masseführung, Funkentstörspulen
und Siebelkos.

Wenn man das nicht so gut kann, dann helfen oftmals Optokoppler,
um alle Signalleitungen und die Versorgungsspannungen komplett
zwischen MOtor und uC trennen zu können, aber bei Schrittmotoren
müssen es meist schnelle Optokoppler sein, wenn man da einfach
was hinpfuscht "10k reichen schon" dann handelt man sich leicht
Probleme ein mit zu langsamen Signalen. Bei Gleichstrommotoren
weniger dringend.
OP #2280810
Lesenswert?

Naja wie ich schon beschrieben habe der motor fährt sauber auch die dazu 
gehörige LED, die ja ich weis mit getoggelt wird blinken (bzw. dimmen) 
sauber und gleichmäßig. Um ein Reset aus schließen zu können habe ich 
die Y LED auf dauerblinken (dimmen) geschaltet. Nach meiner Aufassung 
nach müsste doch wenn der AVR resettet wird die Y LED wenigstens kurz 
unregelmäßig flackern.
#2280812
Lesenswert?

-AVCC offen -> An VCC anklemmen
-Relais K1-A hat keine Freilaufdiode
-wie sieht der 5V-Teil aus, der den uC versorgt?
-Was macht Referenzspannung Motor Z/Y/X? Eventuell koppelst Du Dir 
rückwirkend über T2 auf PinD.7 Störungen ein. Eventuell 
Spannungsberenzung mit Z-Diode
-Endschaltereingänge solltest mit z.B. 100Ohm + Z-Diode und nem C gegen 
Masse schützen

Merke: Keine Pins eine uC direkt nach aussen führen! Schutzbeschaltung!
#2280832
Lesenswert?

Das das hier wie Beschrieben nicht passt ist doch auch klar:
  //Ein- und Ausgänge setzen (1 steht für Ausgang)
  DDRB = 0b00100000;
  DDRC = 0b00111111;
  DDRD = 0b00111111;

  //Pullup-Widerstände der Eingänge Aktivieren
  PORTB = 0b00100000;
  PORTC = 0b00111111;

Deine Endschalter haben keinen PullUp.
OP #2282148
Lesenswert?

Des mit dem Vorwiederstand hab ich auch schon bemerkt is nur falsch 
gezeichnet. Sorry
Die 8KHz hab ich schon im ersten Post erklärt.

Morgen kann ich wieder aktiv weiter dran arbeiten. Ich werde nach und 
nach eure Empfelungen testen. Mal sehen wo ran es liegt.

AVCC an 5V
Reset über Widerstend an 5V
weiteren Elko an 5V und GND des µC

Wenn ich dann nichts finde werde ich wohl die komplette platine neu an 
fertigen.

Achso die Freilaufdiode an K1 wie konnte ich die nur vergessen uiui
Gast #2282164
Lesenswert?

wenn die motoren stehen, geht alles? für emv tests kannst du ja mal 
einen der motoren extern mit 12v versorgen, trenne jeweils eine seiner 
versleitungen von den treiberplatinen. tritt das problem dann auch auf?

den reset wirst du an der y led fast nicht erkennen - du benötigst eine 
variable, die VOR einem tastendruck 0 ist und somit die led aus ist - 
nach einem reset müsstest du dann erst eine bel taste drücken, damit die 
y led wieder aktiv wird...

shift war das thema nicht wert.

Klaus.
OP #2282193
Lesenswert?

Ne also wirklich meine Zeichnung kann man ja echt in die Tonne drücken! 
Der Quarz ist natürlich richtig eingebaut. Ich glaube nach meiner 
Zeichnung würde der µC überhaupt nicht funtzen.

Die Störungen treten auf so bald ich die Motortreiberplatine an stecke 
ohne den Motor fahren zu lasen (der Motor ist aber sofort in 
Haltestellung da Motor-Enable immer high ist)

Ein dierecktes Motorproblem schließe ich aus, da dieser Fehler bei allen 
drei Motoren auf tritt. Die unterschiedlichen Treiberplatinen konnte ich 
noch nicht testen da nur eine Treiberplatine das RC Glied für den 
Choppermodus hat und diesen durch den L297 weiter auf die anderen 
Platinen weiter geleitet wird.

Das extra Anschalten der Y-Diode ist eine gute Idee das werde ich mal so 
programmieren.
#2283759
Lesenswert?

Ben S. schrieb:
> ja aber warum spielen die LED's an PortD verrückt

Ganz genau können dir das nur die Leute von Atmel erklären. Wenn 
überhaupt.
Aber ich spekuliere mal:
Du hast ja am Port C einige Ausgänge benutzt. Da du aber für diesen Port 
keine Stromversorgung hast (Avcc hängt in der Luft), wird sich der Port 
irgendwie anders, auf nicht vorgesehenen Wegen mit Strom versorgen. Denn 
irgendwoher muss ja der Strom kommen, mit dem du deine Motorsteuerung 
ansteuerst.
Iregendwelche anderen unvorhergesehenen Wege klingt aber nicht gut, das 
kann alles mögliche sein und zb soweit gehen, dass dieser Stromfluss 
anderen Komponenten im AVR den Strom abgräbt. -> Alles mögliche kann 
passieren.


Daher die einfache Grundregel: Wenn ein IC mehrere 
Versorgunsspannungsanchlüsse hat, dann werden immer alle beschaltet. Es 
sei denn das Datenblatt sagt, dass es in Ordnung ist ein paar 
auszulassen.

Und schon hast du ein Problem weniger. Die Leute, die den Chip fertigen 
sind ja auch keine Trottel. Die schreiben nicht ohne Grund in ihr 
Datenblatt, was du alles beschalten musst.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren