Forum: Mikrocontroller und Digitale Elektronik Unkontulliertes LED geblinke


von Ben S. (theben)


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.

von Alex W. (a20q90)


Lesenswert?

Hört sich nach Störeinstrahlung an!
Poste mal bitte den Schaltplan mit dem AVR drauf, und eventuell das 
Board-File! Warscheinlich wirkt eine Ground-Leitung als Antenne

von Ben S. (theben)


Angehängte Dateien:

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

von Jonathan S. (joni-st) Benutzerseite


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

von Hubert G. (hubertg)


Lesenswert?

Sollte AVCC tatsächlich nicht mit VCC verbunden sein, würde ich das als 
den Fehler bezeichnen.

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

>Sollte AVCC tatsächlich nicht mit VCC verbunden sein, würde ich das als
>den Fehler bezeichnen.

Ich tippe mal auf den offenen Reset-Pin. Offener Reset + Motor = 
...örgs.

von Ben S. (theben)


Lesenswert?

Offener Reset Pin? aber dann würde doch der AVR einfach nur an dauernd 
in Reset gehen?

von MaWin (Gast)


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.

von Simon B. (nomis)


Lesenswert?

Ben S. schrieb:
> Offener Reset Pin? aber dann würde doch der AVR einfach nur an dauernd
> in Reset gehen?

Und Du bist sicher, dass er das nicht tut?

Zitat von Dir:
> Das heist die angeschlossenen LED's blinken wie wild und ungleichmäßig.

Jop. Klingt wie unkontrolliertes resetten  :)

Viele Grüße,
        Simon

von Ben S. (theben)


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.

von Alex W. (a20q90)


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!

von Hubert G. (hubertg)


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.

von Ben S. (theben)


Lesenswert?

@Hubert G.: ja aber ich habe schon oben beschrieben das ich externe pull 
down Widerstände ab

Aber danke das das sich hier so viele einen Kopp über meine Schaltung 
machen.

von Route_66 (Gast)


Lesenswert?

Hallo!
Ist der Quarz so angeschlossen oder ist das ein Zeichenfehler?

von Thomas K. (rlyeh_drifter) Benutzerseite


Lesenswert?

Route_66 schrieb:
> Hallo!
> Ist der Quarz so angeschlossen oder ist das ein Zeichenfehler?

8kHz Quarz in Serienresonanz für einen Atmega8 klingt bedenklich ;-)

T1 hat auch keinen Vorwiderstand.

von Ben S. (theben)


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

von Thomas K. (rlyeh_drifter) Benutzerseite


Lesenswert?

Ben S. schrieb:
> Die 8KHz hab ich schon im ersten Post erklärt.

Ah, stimmt.
Die Kondensatoren sollten aber parallel liegen, schau mal ins Atmega8 
Datenblatt.

von klaus2 (Gast)


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.

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Dein Quarz ist außerdem recht komisch angeschlossen. So sollte es besser 
funktionieren:
1
 .---| |-------- XTAL 1
2
 |   22pF |
3
 |      Quarz
4
 |        |
5
 |---| |-------- XTAL 2
6
 |   22pF
7
 |
8
---
9
GND


Gruß
Jonathan

von Ben S. (theben)


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.

von Ben S. (theben)


Angehängte Dateien:

Lesenswert?

So es ist geschafft!!!

Schuld war der offene AVCC.

Um eine korrekte Schaltung vor weisen zu können abe ich natürlich die 
anderen Punkte mit bearbeitet.

Danke Leute!

Jetzt stellt sich mir nur noch die Frage warum???
Was hat der offene AVCC Pin jetzt genau mit dem µC gemacht?

von Hubert G. (hubertg)


Lesenswert?

Der Port C ist für den ADC und hat daher eine eigene Stromversorgung.
Steht aber alles im Datenblatt.

von Ben S. (theben)


Lesenswert?

ja aber warum spielen die LED's an PortD verrückt

von Karl H. (kbuchegg)


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.

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.