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
Ein Schaltplan (mitsamt Signalquelle) und Oszillogramm wäre jetzt hilfreich. Störungen löst man nicht durch herum raten.
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
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.
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?
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.
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.
@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.
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 :=)
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
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
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
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.
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?
Morgy schrieb: > Der 7805 stirbt mir manchmal, Irgendwas machst Du falsch und eine Absicherung gegen den Tod des Reglers ist da der falsche Ansatz.
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.
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.
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. :)
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)
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?
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.