PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega 8 startet unkontrolliert neu.



striker1985
18.01.2012, 23:52
Hallo liebe Roboternetz community.

Ich habe folgendes Problem, wenn ich versuche die Motoren anzusteuern zucken sie nur kurz und der Mikrocontroller startet neu. Zumindest verlässt er die Endlosschleife arbeitet den Teil davor ab und geht wieder in die Endlosschleife. Das PWM Signal bleibt manchmal erhalten und manchmal verschwindet es, manchmal laufen sie auch problemlos aber eher selten. Das ganze wirkt sehr zufällig.
Der Aufbau meiner Schaltung sowie den Schaltplan der Mikrocontrollerplatine habe ich als Skizze angehängt da es schwer zu erklären ist.
Als ich den L7805 an meinem Labornetzteil betrieben habe und nur die Motorspannungsversorgung über die Batterie lief das ganze / läuft das ganze wunderbar. Masse war natürlich verbunden.
L7805 ist nach Datenblatt beschaltet.
Zur Hardware:
Motorcontroller ist ein RN2V2 Dualmotor
Foxboard G20 über I²C mit einem Atmega 8 verbunden.
Motoren sind folgende: http://www.conrad.de/ce/de/product/191895/PLANETENGETRIEBEMOTOR-PD4266-12-61-BFEC
Habe es auch schon mit drosselspulen in der Motorleitung versucht leider ohne Erfolg.
PWM Frequenz ist 2KHz habe es auch mit 15KHz versucht, selbes Phänomen.

Im Voraus vielen Dank für eure Hilfe.
Mit freundlichen Grüßen
Striker1985

striker1985
18.01.2012, 23:54
Hier noch die restlichen Bilder.

Andree-HB
19.01.2012, 05:40
...hast Du das Problem auch bei abgezogenem RS232/ISP ?
Die durch den Transistor geschaltete Reset-Leitung fällt mir als Kandidat auf...

striker1985
19.01.2012, 08:29
Hallo Andree-HB,

Ich werde es heute Abend direkt testen, glaube aber das das Problem auch mit abgezogenem RS232 Kabel da war.
Was ich allerdings vergessen habe zu erwähnen ist das das ganze super funktioniert wenn ich am RN2V2 die Motoren abklemme und nur schaue ob ein PWM signal anliegt. Sobald ich die Motoren anschließe egal ob einen oder beide fängt das Problem an. Auch bleibt wie erwähnt während diesem "reset" das PWM Signal manchmal erhalten auch wenn die Motoren nicht drehen. Drücke ich aber den Reset Taster ist das signal direkt weg.

Mit freundlichen Grüßen
Striker1985

021aet04
19.01.2012, 08:42
Hast du schon versucht die Reset Leitung mit einem 100nF Kerko zu entstören?
Du könntest auch noch versuchen den µC mit einem Elko zu puffern. Sollte das nicht funktionieren mit einer Diode den Hauptstromkreis (Motoren) vom µC Kreis zu trennen und den µC dann mit einem Elko stützen. Die Diode ist dafür da das die Motoren nicht den Pufferellko für den µC "leersaugen".

MfG Hannes

BastelWastel
19.01.2012, 09:31
Ich gehe davon aus dass dein Akku voll ist?

oberallgeier
19.01.2012, 10:03
... der Mikrocontroller startet neu .... Das ganze wirkt sehr zufällig ...Ich habe generell in meiner main eine Blinkroutine - nach der Portdefinition und VOR jeglichen anderen Initialisierungen und VOR dem Erlauben von Interrupts. An der spezifischen Frequenz (ca. 0,1 sec) und der Anzahl der Blinkies kann ich eindeutig irgendwelche zufälligen Resets erkennen. Siehe Codebeispiel zwischen den "Ausrufungszeichen". Ich habe auch eine Testroutine die nur fallweise eingeklinkt wird und entsprechende Signalfolgen mit unterschiedlichen Blinkzeichen generiert, je nachdem, welcher Resetvektor gerade angesprungen wurde. Damit finde ich mich bei ähnlichen Fehlersuchen relativ schnell zurecht.

// ================================================== ============================ =
// === HAUPTProgramm ================================================== ========= =
// Initialisierungen, LED1 kurzblinken als Signal für Programmstart,
// Ausgabe des Identifizierungsstrings per USART
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

int main(void)
{ //
// Pins/Ports als Ein- (0) oder Ausgänge (1) konfigurieren, Pull Ups (1) aktivieren
// A = Ausgang, E = Eingang ohne , EU = Eingang MIT PullUp
DDRB = 0b00011111; // siehe aktuell oben oder Fortschritt/R2D2
PORTB = 0b00100000; // und Port/Pull Ups (1) aktivieren
DDRC = 0b01110000; // PC3 ist ADC3, PC0 .. 6 , kein PC7-Pin bei m168
PORTC = 0b00000111; // Beachte für ADC: PC3 ist ADC-Eingang ##>> OHNE Pullup !!
DDRD = 0b11110000; // -> siehe unter DDRB, sowie PD2,3 extInt
PORTD = 0b00001111; // Pull Ups aktivieren
// Encoder_1 = ExtINT0 = PortD2, Encoder_2 = PortD3
// Dadurch Initialisierung der Anschlüsse für miniD0 auf mega328: - - - - - - - -
// /RESET,PC6 1 A A 28 PC5,(SCL), gLED
// RxD,PD0 2 EU A 27 PC4,(SDA), rLED
// TxD,PD1___3 EU E 26___PC3, ADC0=GP2D120
// SigMot1/ExtINT0,PD2 4 EU EU 25 PC2, SFH 5110, IN irDME 4 Rechts
// SigMot2/ExtINT1,PD3 5 EU EU 24 PC1, SFH 5110, IN irDME 3 Links
// _|-- 3,4 Guz, PD4___6 A EU 23___PC0, SFH 5110, IN irDME 1-2 Mitte
// - - - - - - Belegung Pinne - - - - - - - - -
// XTAL1 PB6___9 EU 20___VCC
// XTAL2 PB7 10 EU EU 19 PB5, SCK, Taster2
// PWM 1,2 uz+Guz,PD5 11 A A 18 PB4, MISO, _|-- 3,4 uz, (Taster1)
// PWM 3,4 uz+Guz,PD6__12 A A 17___PB3, MOSI, Reserve 2
// _|-- 1,2 uz,PD7 13 A A 16 PB2, Servo
// _|-- 1,2 Guz,PB0 14 A A 15 PB1, OC1A = SFH 415, OUT (irDME)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
for(i=0; i<10; i++) // LED/PC5 blinkt i-mal ##>> bevor Interrupts erlaubt sind
// um ungewollte Resets u.ä. erkennen zu können
{
SetBit(PORTC, 5); // LED auf PC5 schalten EIN, HELL
waitms(3); // ... damit man kurze resets besser erkennt
ClrBit(PORTC, 5); // LED auf PC5 schalten AUS, Dunkel
waitms(97); //
} // Ende von for(i=0; i<10; i++)
// ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Es folgen Initialisierungsroutinen, z.B.:
init_USART0(MYUBRR); //USART0 initialisieren mit wählbarer Baudrate (s.o.)
XTI_0_1_init(); //Initialisiere den externen Interrupt 0 und 1
//
sei(); //Globalen Interrupt freigeben
//
// .....

BMS
19.01.2012, 13:17
Hallo,
ich würde darauf tippen, dass die Versorgungsspannung aufgrund der Einschaltströme der Motoren einbricht.
Auf den Foto mit dem 7805 erkenne ich nur Keramikkondensatoren, da würde ich auf der 12V-Seite noch eine Diode + einen Elko (>100µF) einbauen, damit die Versorgung des Controllers eine gewisse Zeit unterbrechungsfrei ist.
Grüße,
Bernhard

edit: Das hat 021aet04 schon geschrieben :)

striker1985
19.01.2012, 22:19
Vielen dank für eure Antworten.
Ich fange mal von vorne an zu antworten.

Ohne RS232 Kabel passiert genau das selbe.

Hannes,
ich bin Elektrotechnisch nicht vom Fach habe mir das alles durch viel lesen und nachfragen angeeignet.
Ich habe noch keinen Kondensator in der Reset Leitung. Muss mal schauen ob ich einen Kerko mit dieser Kapazität habe, Folienkondensatoren habe ich auf jeden Fall wären diese auch ok?
Was meinst du genau mit dem trennen der Motoren und dem MC durch eine Diode? Wie soll sie genau verbaut werden?
Welche Diode würdest du dazu empfehlen? Ich habe 1N4001, 1N4936 und Z Dioede 5,1V 3,1W da alles andere müsste ich bestellen.

BMS,
an dich die selbe Frage bezüglich der Diode, ist eine von den obigen geeignet wenn nicht welche wäre es und wie soll sie genau sperren?
Ich habe Elkos in > 100µF
470µF und 1000µF gillt da das Motto viel hilft viel oder lieber eine andere Größe?

oberallgeier,
ich habe eine ähnliche Blink LED wie in deinem Vorschlag sie blinkt vor dem eintreten in die Endlosschleife 5x mit 5Hz und während dem normalen Betrieb im 1Hz Takt. Daran habe ich auch den "Neustart" erkannt.

Ich habe auch ein Oszi zur Verfügung bin aber mit dem Umgang noch nicht so sicher also wenn sich damit etwas besser Analysieren lässt bin ich für anregungen offen.

Mit freundlichen Grüßen
Striker1985

021aet04
19.01.2012, 23:04
Das du nicht vom Fach bist macht nichts. Wichtig ist nur das Interesse.

Bei der Diode kannst du jede beliebige Diode nehmen mit Ausnahme von Z-, Zener- oder Spannungsreferenzdioden. Du kannst also eine normale Gleichrichterdiode (z.B. 1N400x Serie wie deine 1N4001) oder eine Schottky Diode (ist aber nicht nötig). Die Diode dient hier nur dazu das sich der Kondensator nicht entlädt.

Du musst die Motoren direkt vom Akku versorgen. Den µC musst du vom Aku über eine Diode versorgen. Anschließend musst die Versorgung des µC puffern. Das sieht so aus: Batterie => Diode => Kondensator und µC

Welche Kapazität der Kondensator hat ist nicht so genau. Du kannst für den Versuch den 470µF und/oder 1000µF nehmen.

Mit dem Oszi kannst du das am Besten im Single Shot Modus anschauen. Ich würde Single Shot Modus mit falling Edge (fallender Flanke) einstellen. Die Spannung würde ich etwas unter die Versorgungsspannung stellen. Sollte die Spannung einbrechen wird automatisch der Single Shot ausgelöst. Du kannst dann schauen ob und wie weit die Spannung einbricht. Bei der Zeit musst du dich herantasten.


MfG Hannes

striker1985
20.01.2012, 21:51
Hallo Hannes,

dank deiner Super Anleitung habe ich mich nun endlich mit dem Oszi anfreunden können :).
Das ist leider die einzigste gute Nachricht. Im Anhang mal ein bild direkt nach dem L7805 und eins an der Anschlussklemme der MC Platine.

Habe den aufbau des L7805 folgendermaßen geändert:

1N4001 Diode --> 1000µF Elko parallel 470 µF Elko --> L7805 --> 100nF Kerko --> MC und Foxboard.

Habe den Kondensator vor dem L7805 geändert da ich ausversehen einen 500pF Kerko davorgeschaltet habe anstatt einem 330nF.

Leider noch genau das selbe Verhalten. Wie auch vorher geht mit Led's als Verbraucher alles super und es sind auch keine Spannungsänderungen zu erkennen. Das Oszi fängt dann erst an wenn ich den Trigger auf ca. 495mV stelle. (Ich nutze einen 1:10 Tastkopf)

Mit freundlichen Grüßen
Striker1985

021aet04
20.01.2012, 21:59
Hast du im AC oder DC Modus gemessen? Du solltest DC wählen und so einstellen das 0V so weit als möglich am unteren Bildrand und 5V am oberen Bildrand ist. Somit hast du eine sehr gute Auflösung.
Wenn du den 7805 verwendest würde ich einen Elko vor (am Besten 1000µF) und einen nach dem Spannungsregler (470µF) einbauen. Vielleicht hilft das etwas.

MfG Hannes

striker1985
20.01.2012, 23:18
Hallo Hannes,

danke für die schnelle Antwort. Werde es direkt morgen früh umbauen und testen.

Da ich gerade noch sehe das man die Namen der Bilder nicht sieht. Das mit dem großen Ausschlag ist an der Klemme des MC, das andere am L7805 Ausgang.
Zu deiner Frage:
Ich habe im DC Modus gemessen und das Oszi so eingestellt wie du es eben gerade beschrieben hast, habe den Bereich nur etwas nach unten geschoben damit man das volle ausmaß auf den Bildern erkennt.
Da ich morgen eh noch teile bestellen muss irgendwelche weiteren vorschläge wie man das Problem beseitigen kann? Andere Bauteile oder ähnliches?

Mit freundlichen Grüßen
Striker1985

BMS
21.01.2012, 11:59
Hallo,
es kann natürlich auch an nicht-sternförmiger Masseführung liegen, d.h. dass Motorstrom über die Masseleitung der Ansteuerung (Atmega8 usw) fließt. Damit können die Potentiale ziemlich verschoben werden.
Kannst du dafür einmal die Masseverbindung über das Flachbandkabel unterbrechen? (Also z.B. an der Unterseite des Wannensteckers auf der Atmega8-Platine einfach die Masseverbindung ablöten).
Grüße,
Bernhard

striker1985
21.01.2012, 13:52
Hallo BMS,

werde ich später gleich mal testen. Nur damit ich dich richtig verstehe.
Die Masse am MC ablöten ist kein Problem werde sie ja dann aber wohl oder übel von der Massezuleitung der Motoren nehmen müssen richtig?

Mit freundlichen Grüßen
Striker1985

BMS
21.01.2012, 21:03
Der Mikrocontroller soll seine Spannung (5V und Masse) vom Regler bekommen. Es soll nur keine direkte Masseverbindung z.B. über das Flachbandkabel vom Mikrocontroller zum Motortreiber geben; die Masse vom Motortreiber soll möglichst direkt zum Akku gehen.
Ggf. kannst du auch einen etwas höheren Kabelquerschnitt verwenden. Wie viel Strom ziehen denn die Motoren ungefähr?

Thegon
21.01.2012, 21:06
Ich habe genau das gleiche Problem bei meinem Roboter gehabt, bei zu schneller Stromänderung Reset der AVR´s.
Habe dann folgendes eingebaut:
100n Kerko direkt über die Vcc Pins der AVR´s (waren noch nicht überall vorhanden)
10n kerko auf die Reset Leitung gegen masse
Entkoppelung der Versorgung für den 7805 über einfache SI - Diode und zwei 1000µ Elkos paralell

Dann hat´s bei mir geklappt.
Eventuell noch eigene dicke Kabel (für Masse) vom Akku direkt zu den Motortreibern oder wo der Motorstrom drüberfließt, Wegen Spannungsabfall an (dünnen) kabeln.
Wünsche dir viel Erfolg und AVR´s, die sich nicht resetten ;-)

Edit: Wenn ich gerade den Beitrag von BMS lese, sehe ich, dass ich nichts neues sage ;-)
Mfg Thegon

striker1985
22.01.2012, 20:39
Hallo zusammen,

also ein erster Fortschritt ist zu Verzeichnen. Nach dem Einbau von zusätzlichen 100nF Kondensatoren an der Reset Leitung und an AVCC und dem trennen der Masseverbindung über das Flachbandkabel startet der MC nicht mehr neu. Warum gibt es denn diese Masseverbindung auf dem RNVN2 überhaupt wenn man sie nicht nutzen soll?

Leider hängt sich jetzt der I²C Bus nach ein paar erfolgreichen Motoransteuerungen auf. Muss morgen mal genauer schauen auf welcher seite das Problem liegt. Im Moment geht nichts weder ein Neustart des Foxboards noch ein reset und neu Flashen des MC half was.
Was ist die beste Oszi Einstellung um mal das Signal des I²C Busses nachzumessen? Ich habe nämlich immer nur 2-3 Bits mitbekommen. Das wäre sehr Hilfreich bei der Fehlersuche um die Seite mit dem Fehler zu identifizieren.

Vielen Dank noch mal für eure Hilfe bis zu diesem Punkt.
Mit freundlichen Grüßen
Striker1985

striker1985
23.01.2012, 21:16
Hallo zusammen,

I²C Problem hat sich erledigt war wahrscheinlich ein wackler den ich durch das einlöten der Vielen Kondensatoren gekommen ist.

Jetzt habe ich aber folgendes komisches Verhalten. Das RNVN2 stellt ja 3 Analoge Spannungssignale zur Verfügung für den Strom der Motoren und die Platinentemperatur. Beim Ansteuern der Motoren mit mit weniger als 100% PWM Signal sind die Spannungen alle 3 ca.2V obwohl die Motoren nur je ca. 1A im Leerlauf ziehen und die Temperatur ca. 20°C beträgt. Habe auch schon mit dem Multimeter gemessen liegt also nicht am A/D Wandler des MC. Die Chiptemperatur des RN2V2 habe ich auch gemessen diese erhöht sich nicht über 22°C. Liegt das etwa an der fehlenden Masseverbindung zwischen dem MC und dem RNVN2?

Mit freundlichen Grüßen
Striker1985

BMS
23.01.2012, 21:33
Jetzt habe ich aber folgendes komisches Verhalten. Das RN2V2 stellt ja 3 Analoge Spannungssignale zur Verfügung für den Strom der Motoren und die Platinentemperatur. Beim Ansteuern der Motoren mit mit weniger als 100% PWM Signal sind die Spannungen alle 3 ca.2V obwohl die Motoren nur je ca. 1A im Leerlauf ziehen und die Temperatur ca. 20°C beträgt. Habe auch schon mit dem Multimeter gemessen liegt also nicht am A/D Wandler des MC. Die Chiptemperatur des RN2V2 habe ich auch gemessen diese erhöht sich nicht über 22°C. Liegt das etwa an der fehlenden Masseverbindung zwischen dem MC und dem RN2V2?
Diese Offsets sind meiner Meinung nach alle auf die Masseführung zurückzuführen.
Ich glaube, man sollte sich da erst noch ein richtiges Massekonzept überlegen.
Ggf kann man den Sternpunkt der Masse an den GND-Anschluss des Mikrocontrollers legen, wegen der Offsets.
Zudem plädire ich für größere Kabelquerschnitte für die Masse.
Um die Offsets sicher weg zu bekommen, helfen OpAmps, geschaltet als Differenzverstärker (Subtrahierer) http://www.elektronik-kompendium.de/sites/slt/schalt/02101531.gif
Das fordert aber alles zusätzlichen Aufwand.
Grüße,
Bernhard

striker1985
23.01.2012, 21:42
Hallo BMS,

also meine momentanen Masseleitungen haben einen Querschnitt vin 1mm² zu den einzelnen Platinen.
Der jetzige Sternpunkt der Masse liegt direkt an der Batterie, wenn man nur den 5V Teil betrachtet dann ist es hinter dem L7805.
Auf den Platinen habe ich 0,25mm Lackdraht meinst du diesen Querschnitt?

Mit freundlichen Grüßen
Striker1985