Forum: Mikrocontroller und Digitale Elektronik Eingang am AVR schalten


von Morgy (Gast)


Lesenswert?

Hi alle zusammen
Ich hab kurz ne kleine Frage, manche wissen vllt dass ich gerade an 
einem Motorenregler für Brushless Motoren arbeite
Angesteuert wird er über PPM, also Standard.
Auf dem Breadboard habe ich den PPM direkt an den INT0 angeklemmt, und 
alles hat geklappt.
Mit bissl Rechnerei kam dann n schöner Wert zwischen 1000 und 2000 ms 
raus.
Auf der Platine funzt das aber kein Stück mehr, der ISR (INT0_vect) löst 
fast ständig aus, und ich bekomm fast immer viel zu kleine oder viel zu 
grosse Pulsbreiten raus.
Deshalb mal die Frage, wie man diese Störung am besten beheben könnte?
Pulldown (10k) wäre mein erster Gedanke, aber ich hab bei nem ähnlichen 
Projekt gesehen (Ansteuerung über I2C), dass da 100 Ohm in Reihe zum 
Eingang geschalten werden.
Auch ein sehr kleiner Kondensator mit TAU weit unter 1ms wäre denkbar.
Was glaubt Ihr wäre am besten?
Gruss
Björn

von Stefan F. (Gast)


Lesenswert?

Ein Schaltplan (mitsamt Signalquelle) und Oszillogramm wäre jetzt 
hilfreich. Störungen löst man nicht durch herum raten.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Morgy schrieb:
> Auf der Platine funzt das aber kein Stück mehr, der ISR (INT0_vect) löst
> fast ständig aus, und ich bekomm fast immer viel zu kleine oder viel zu
> grosse Pulsbreiten raus.

 Wenn du INT_0 nicht auf low level gelassen hast, sind es unsaubere
 Flanken. Sperr mal deine ISR für etwa 1-50mS nach der Abarbeitung.

: Bearbeitet durch User
von Morgy (Gast)


Lesenswert?

Marc Vesely schrieb:
> Wenn du INT_0 nicht auf low level gelassen hast

Was meinst du da damit? Pulldown Widerstand?

Ich hab im Programm ne Zeile hinzugefügt dass er nur weitermacht wenn 
der gelesene Wert zwischen 750 und 2250 ns liegt, dies wird aber NIE 
erreicht.

Ich werd morgen mal mit dem Oszi messen, hab daheim leider keines.

von Morgy (Gast)


Lesenswert?

Also
zuerst ma sorry dass ich keine Screenies vom PPM Signal hab, ging bei 
dem Oszi nicht.
Ich kann aber sagen, dass die Flanken absolut sauber sind und auch die 
Zeit passt, daran liegts also nicht.
Seltsam ist aber, dass die ISR aufm Breadboard sinnvolle Werte 
ausspuckt, auf der Platine aber nicht.
Wie kann ich die noch optimieren?
Oder gibts sonst irgendwie Störquellen?

von Carsten R. (kaffeetante)


Lesenswert?

Morgy schrieb:
> Ich kann aber sagen, dass die Flanken absolut sauber sind und auch die
> Zeit passt, daran liegts also nicht.

Woher willst du das wissen ohne Oszi? Wichtig ist nicht was die 
Signalquelle sendet, sondern was nach dem Weg durch die neue Platine am 
Pin ankommt! Das Layout, Masseführung und anderere Dinge wie 
Abblockkondensatoren in der Versorgung sind ebenfalls wichtig.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Morgy schrieb:
>> Wenn du INT_0 nicht auf low level gelassen hast
>
> Was meinst du da damit? Pulldown Widerstand?

 INT kann Flanken- oder Pegelgesteuert sein. Wenn der Pegelgesteuert
 ist, feuert der INT solange wie der entsprechende Pegel anliegt.
 Beim Flankengesteuerten aber nur einmal, bei der entsprechenden Flanke.
 Das meinte ich.

von Morgy (Gast)


Lesenswert?

@Carsten lies bitte nochmal genau, ich hab mit dem Oszi das Signal am 
INT0 gemessen, aber ich konnte kein Bild davon machen.
Und der INT0 ist Flankengesteuert, also auch das ist OK.
Am Ausgang des 7805 ist ein 4,7uF Tantal und ein 100uF ElKo, am 
Mikrocontroller ein 100nF Blockkondensator (Keramik) und wie im 
Datenblatt beschrieben ist eine 10uH Spule zwischen VCC und AVCC und von 
AVCC 100nF (Keramik) nach Masse, VREF habe ich jetzt nicht mehr mit AVCC 
gekoppelt, sondern ausser einem 10nF (auch Keramik) zu Masse komplett 
leer gelassen.
Da die Platine gefrässt ist, ist alles Kupfer ausser den Signalleitungen 
auf Masse gelegt.
Die INT0 ISR ist auch gewollt sehr kurz gehalten, dass sie nicht von 
timer overflows oder sonstigem unterbrochen wird.

Ich werd jetzt mal n JTAG ICE zum debuggen auftreiben, da mir das AVR 
Dragon aufgrund eines durchgeschlagenen 7805 (SMD) krepiert ist.

Aber mal generell die Frage:
Die Flanken sind wie gesagt sauber, nur ganz oben minimale 
Überschwinger, ob das jetzt die Induktivität der Leitung oder Oberwellen 
sind weiss ich nicht, ist aber definitiv weit unter 0,1 V.
Ab welche Pegelunterschied detektiert der Atmega eine Flanke? Ich denk 
mal nicht dass er 0,1V als Flanke ansieht, wollte es aber trotzdem mal 
nachgefragt haben. Hab im Datenblatt nichts gefunden dazu.

von Fichte (Gast)


Lesenswert?

Morgy schrieb:
> ich hab mit dem Oszi das Signal am
> INT0 gemessen, aber ich konnte kein Bild davon machen.

is bestimmt 'n vampir-oszi, der lässt sich nich ablichten und im spiegel 
siehst du ihn auch nicht :=)

von Morgy (Gast)


Lesenswert?

Nein das nicht ich hatte einfach nur keine Kamera/Handy dabei ^^

von Fichte (Gast)


Lesenswert?

War doch nur spass...

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Morgy schrieb:
> Ab welche Pegelunterschied detektiert der Atmega eine Flanke? Ich denk
> mal nicht dass er 0,1V als Flanke ansieht, wollte es aber trotzdem mal

 Gilt dasselbe wie für Log.0 und Log.1 und steht im Datenblatt.
 0,3V max. für Log. 0
 Alles über 0,7V sollte as Log.1 erkannt werden, aber ich würde es
 erst ab 2,0V als sicher ansehen. Siehe auch:
 "I/O Pin Input Threshold Voltage vs. VCC (VIL, I/O Pin read as ‘0’"
 Zwischen 3 und 5V bist du auf der sicheren Seite.

> Die INT0 ISR ist auch gewollt sehr kurz gehalten, dass sie nicht von
> timer overflows oder sonstigem unterbrochen wird.

 Die kann nur durch RESET unterbrochen werden.
 Was für eine MEGA ist das ?
 Es ergibt einfach keinen Sinn, dass alles auf Breadboard funktioniert,
 aber auf der fertigen Platine nicht. Wenn du deinen Program nicht in
 der Zwischenzeit geändert hast, ist deine Platine fehlerhaft, etwas
 anderes kann es nicht sein.

> Die INT0 ISR ist auch gewollt sehr kurz gehalten

 Warum ?
 Probiere mal gleich beim ISR-Eintritt die Interrupts zu sperren, etwa
 1-10mS Verzögerung in der ISR, Interrupts freigeben, raus aus der ISR,
 nur um zu sehen was dann passiert.

 Du kannst auch so etwas wie der Vorschlag von Karl Heinz einbauen:
> // eindeutige Blinkerei an der LED, damit man erkennt
>   // ob es einen ungewollten Prozessorreset gibt
>   PORTB &= ~(1<<LED);
>   _delay_ms( 1000 );
>   PORTB |= (1 << LED);
>   _delay_ms( 1000 );
>   PORTB &= ~(1<<LED);
>   _delay_ms( 1000 );
>   PORTB |= (1 << LED);

 Das schreibst du ganz am Anfang - LED darf nur einmal blinken und
 muss dann eingeschaltet bleiben.

: Bearbeitet durch User
von Morgy (Gast)


Lesenswert?

Danke für die Vorschläge

also macht das Gezuckel zwischen 4,9 und 5V keine Flanke, gut zu wissen.
Hab ne Vermutung wenn ich das hier lese:
ich hab den 100n am Reset weggelassen, dass ich debug on wire nutzen 
kann.
Wenns ganz blöd läuft liegts daran.

Es handelt sich um inen Mega328P.
Werd morgen mal den Reset Kondensator reinmachen und den Test mit der 
LED, danke und gute Nacht ^^
Bis Morgen

von Morgy (Gast)


Angehängte Dateien:

Lesenswert?

Also
der Regler funzt jetzt auf einmal doch, kein Plan warum.
Vllt war der Akku nicht 100% voll, hab ihn zwischendurch mal geladen und 
alle Lötstellen nachgezogen.
Jetzt hab ich aber noch n kleinen Schönheitfehler.
Hier mal der Code im Anhang
Im Timer2 Overflow zähl ich meinen Softtimer hoch, damit hab ich einen 
Timer/Counter mit einer Frequenz von 47kHz.
In 20ms zählt dieser bis 941.
Wenn der INT0, an dem der Empfänger der Fernsteuerung angeklemmt ist, 
eine Flanke erkennt, wird der Softtimer bei positiver Flanke auf 0 
gesetzt und bei negativer Flanke ausgewertet.
Wenn aber in 20ms keine Flanke erkannt wird (also die softtimer Variable 
übr 941 zählt) geht der Regler auf die "lostsignal" Drehzahl und die 
rote und grüne LED leuchten.
Der C-Code ist ausreichend kommentiert, also keine Scheu mal 
reinzuschauen ^^ .
Wenn aber eine gültige Pulsdauer des Empfängers erkannt wird, wird das 
"messung" flag gesetzt, dass die Batteriespannung misst und 
dementsprechend die Solldrehzahl umsetzt (leere Batterie = 0, schwache 
Batterie = 1/2 des Sollwertes etc) und die LED wird entsprechend gesetzt 
(rot, gelb oder grün).
Soweit zum Soll, jetzt aber zum Ist.

I. Schalte ich meinen Regler ein, ohne das die Fernsteuerung an ist, 
leuchtet rot und grün (wie gewollt, weil ja kein Signal kommt)
II. Mach ich die Funke an, leuchtet grün voll und rot schwach, als ob 
sie PWM angesteuert werden würde.
III. Mache ich die Funke wieder aus, geht der Motor auf die "Lostsignal" 
Drehzahl, aber die rote geht ganz aus, grün leuchtet weiter.

Sprich bei III verhält sie sich, wie bei II gewollt.
Als Empfänger kommt der AR6110 Parkflyer zum Einsatz, glaub aber nicht 
dass das wichtig ist.

Wäre nice wenn sich jemand mal ne Minute Zeit nimmt reinzuschauen :)
Gruss
Björn

von Morgy (Gast)


Lesenswert?

Ach ja
Die Zeile
//adcval = 200;
wurde eingefügt zur Fehlersuche, um einen festen Batteriewert zu haben, 
statt Ihn zu messen, dass der Motor immer mit 100% dreht.

von Morgy (Gast)


Lesenswert?

Mal ne kurze Zwischenfrage
Der 7805 stirbt mir manchmal, wie kann ich da am besten ne Sicherung 
einbauen, mir zerhauts da dann immer den Atmega.
Langt ne Sicherung nach dem Ausgang des 785 und dann ne 6V Zenerdiode 
zwischen den 5V und GND?
Nach dem Motto zerhaut es den 7805, wird die Zener leitend und die 
Sicherung stirbt?

von Rudolph (Gast)


Lesenswert?

Morgy schrieb:
> Der 7805 stirbt mir manchmal,

Irgendwas machst Du falsch und eine Absicherung gegen den Tod des 
Reglers ist da der falsche Ansatz.

von Carsten R. (kaffeetante)


Lesenswert?

Das wäre die falsche Maßahme am falschen Ort. Normalerweise sterben die 
7805er nicht so schnell. Da sollte man die Ursache finden und beseitigen 
anstatt zu versuchen den Schaden jedesmal einzudämmen.

Schaltplan und Layout überprüfen.

von Morgy (Gast)


Angehängte Dateien:

Lesenswert?

Das seltsame ist ja, dass es bei einem grossen, schweren Brushless mit 
dicker Glocke als Aussenläufer gegangen ist, aber als ich den DIAMAND 
Modellbau Brushless eingelötet hab, mir der 7805 krepiert ist.
Dabei sind die Motoren ja gar nich an dem 5V Kreis angeklemmt.
Im Anhang mal die EAGLE Dateien, es sind 2 Platinen übereinander.
Der virtuelle Steckkontakt ist in Layer 2.

von Morgy (Gast)


Lesenswert?

Ich hab jetzt mal ne Schottky vom 7805 Out zum 7805 In reingemacht, 
falls doch IRGENDWIE durch die Motoren ne Rückkommutierung zustande 
kommen sollte, und bis jetzt siehts gut aus. :)

von Morgy (Gast)


Lesenswert?

Sooooo neuer Fehler neues Glück
Ich überprüfe meine Batteriespannung mit einem Spannungsteiler aus einem 
10kOhm und einem 4,7kOhm Widerstand, also müssten ja bei 14,7V 
Batteriespannung 4,7V am Spannungsteiler abgreifbar sein und linear bei 
12V Batteriespannung ca 3,9V am ADC Eingang, diese liegen laut Messgerät 
auch am Pin an.
Wenn ich der Platine Spannung gebe, liest sie anfangs einen ADC-Wert von 
200 ein (Spannungsmessung erfolgt linksorientiert und mit dem DCH Bit, 
also Auflösung von 0-255 und mit externer Spannung von 5V an AVCC), was 
ja ca 4 Volt entspricht, nach 4-5 Messungen sinkt dieser Wert aber auf 
ca. 150, also 3V, und springt dann auf 255 und bleibt dort hängen.
Die Batteriespannung bleibt konstant 12V und die Eingangsspannung am ADC 
hat laut Oszi zwar kleine Ausreisser, aber nur plus minus 0,2V.
Bei dem Wert 255 würden aber über 15V Batteriespannung anliegen.
Zur Fehlerbehebung habe ich dann zwischen Mittelpunkt des 
Spannungteilers und dem ADC Pin einen 3,3kOhm Widerstand eingefügt, der 
verringert zwar die Spitzen auf dem Oszi, aber der Fehler bleibt 
bestehen.
Kann der 100nF Kondensator, der direkt neben dem ADC Eingang gegen Masse 
geht, Fehler verursachen?
Ich glaub nicht, dass der sich über die 10kOhmso schnell auflädt, aber 
man weiss ja nie.
Oder kann es auch einfach sein, dass ich irgendwie den ADC-Eingang 
zerballert hab? Kommt so was öfter vor?
AVCC ist (Schaltplan ist ja oben) mit 10uH auf VCC, 100nF gegen Masse, 
AREF mit 10nF auf Masse.
(Der 3,3kOhm Widerstand ist noch nicht im Layout, sonst alles korrekt)

von Morgy (Gast)


Lesenswert?

OK ich Idiot hab vergessen dass ich mit dem Widerstand und dem Kondi n 
Tiefpass gebastelt habe, mit 480 Hz Grenzfrequenz, aber generell ist das 
ja wie aus dem Lehrbuch.
Trotzdem sollte dieser die Eingangsspannung von 3,9V ja nicht 
verfälschen dürfen, erst recht nicht nach oben oder?

von Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite


Lesenswert?

Kann es sein das die Spannung tatsächlich ansteigt? Z.B. wenn der Motor 
im Bremsbetrieb ist? Mangels Schaltplan kann man hier nur raten...

Mit freundlichen Grüßen
Thorsten Ostermann

von Morgy (Gast)


Lesenswert?

@Thorsten 4 Beiträge über dir am 23.9 Schaltplan und Platinenlayout
Und die falschen Werte misst er auch im Betrieb.
Meine Vermutung ist mehr, dass durch Spannungseinbruch die AVCC sinkt, 
und dann ist der gemessene Wert natürlich höher.
Ich werd nochmal die 1,1V interne Spannung verwenden.

Ich bin allerdings echt dankbar über die Hilfe hier im Forum und sag 
danke an alle die geholfen haben dass ich soweit bin.

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.