mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Noch ein Problem: PWM-Werte ändern


Autor: Luca Bertoncello (lucabert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, Leute!

Erstmal besten Dank für allen, die mir eine Hilfe mit meiner 
mathematischen Probleme gegeben haben.

Jetzt habe ich noch ein komisches Problem (diesmal hat es mit Mathe 
nichts zu tun), und zwar: wenn ich die PWM-Werte für die Geschwindigkeit 
der Motoren ändern (und die Motoren laufen gerade), ab und zu, total 
Random (oder mindestens, ich konnte keine echte Ursache finden), der µC 
macht ein Reset...

Hier wie ich die PWM für die Motoren definiere:
#define MOTORDIR_DDR            DDRD
#define MOTORDIR_PORT           PORTD
#define MOTORDIR_PIN            PIND
#define MOTORDIRL1_PIN          4  // PIND4
#define MOTORDIRL2_PIN          5  // PIND5
#define MOTORDIRR1_PIN          6  // PIND6
#define MOTORDIRR2_PIN          7  // PIND7
#define MOTOREN_DDR             DDRB
#define MOTOREN_PORT            PORTB
#define MOTOREN_PIN             PINB
#define MOTORENL_PIN            1  // PINB1
#define MOTORENR_PIN            2  // PINB2

void initMotors()
{
  MOTORDIR_DDR |= (1<<MOTORDIRL1_PIN) | (1<<MOTORDIRL2_PIN) | (1<<MOTORDIRR1_PIN) | (1<<MOTORDIRR2_PIN);

  TCCR1A |= _BV(COM1A1) | _BV(COM1B1) | _BV(WGM11);
  ICR1 = 0xEFFF;
}

Nun setze ich die Geschwindikeit mit:
  pwmL = pwmR = (uint8_t) (((float)speed * (float)CONSTPWM)); \
  OCR1A = OCR1B = (pwmL<<8) | 0xFF; \

(die zwei PWM-Werte sind weil ich später die einzelne Geschwindikeit 
anpassen soll, je nachdem, was ich für Rückmeldungen vom Encoder 
bekomme).

Ich starte dann die Motoren:
  TCCR1B = _BV(WGM12) | _BV(WGM13) | _BV(CS10); \
  TCCR1A |= _BV(COM1A1) | _BV(COM1B1) | _BV(WGM11); \
  ICR1 = 0xEFFF; \
  OCR1A = OCR1B = (pwmL<<8) | 0xFF; \

Und dann habe ich eine Funktion, die in der Hauptschleife aufgerufen 
wird, und die die Korrekturen macht (hier nur für ein Rad, aber für den 
anderen ist gleich):
    nSpeed = ((uint16_t)1000 / (uint16_t)intervalR);
    if(nSpeed != (uint16_t)getSpeed() && nSpeed != 0)
    {
      pwm = (uint8_t) (((uint16_t)pwmR * (uint16_t)getSpeed()) / nSpeed);
      if(pwm < MINPWM)
        setRightPWM(MINPWM);
      if((pwm > MINPWM) && (pwm < MAXPWM))
        setRightPWM(pwm);
      if(pwm > MAXPWM)
        setRightPWM(MAXPWM);
      turnOnLED(LED3);
    }
    else
      turnOffLED(LED3);

setRightPWM wird so definiert:
#define setRightPWM(__pwm) \
{ \
  pwmR = __pwm; \
  OCR1B = (pwmR<<8) | 0xFF; \
}

Nun, wie gesagt, das Programm läuft 'ne Weile (einige Sekunden, manchmal 
sogar eine Minute, manchmal sogar keine Sekunde), dann wird ein Reset 
durchgeführt.

Und ich verstehe absolut nicht warum...

Kann jemand mir ein Tipp geben?

Besten Dank!
Luca Bertoncello

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sieht die Schaltung und Board aus, es könnte ein Reset durch 
Motorstörungen sein.
Hänge anstelle der Motoren eine Led mit Vorwiderstand an.

Autor: Luca Bertoncello (lucabert)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hubert G. schrieb:
> Wie sieht die Schaltung und Board aus, es könnte ein Reset durch
> Motorstörungen sein.
> Hänge anstelle der Motoren eine Led mit Vorwiderstand an.

Die Schaltung sieht so aus.
Bestimmt ist es ein Problem bei dem Setzten der Geschwindigkeit, denn 
jetzt laufen die Motoren seit gute 10 Minuten (aber ohne Korrekturen!!) 
und das Programm hängt nicht...

Meinst du, es konnte ein Problem der Schaltung sein? Wie kann ich es 
korrigieren?

Danke
Luca Bertoncello

Autor: Luca Bertoncello (lucabert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luca Bertoncello schrieb:
> Hubert G. schrieb:
>> Wie sieht die Schaltung und Board aus, es könnte ein Reset durch
>> Motorstörungen sein.
>> Hänge anstelle der Motoren eine Led mit Vorwiderstand an.
>
> Die Schaltung sieht so aus.
> Bestimmt ist es ein Problem bei dem Setzten der Geschwindigkeit, denn
> jetzt laufen die Motoren seit gute 10 Minuten (aber ohne Korrekturen!!)
> und das Programm hängt nicht...
>
> Meinst du, es konnte ein Problem der Schaltung sein? Wie kann ich es
> korrigieren?

Noch was: wenn ich die Motoren laufen lasse, und die Geschwindigkeit auf 
12 Schritte/Sekunde (wenig mehr als das Minumum) reduzieren geht, wenn 
ich aber dann die Geschwindigkeit auf 80 setze (Maximum), dann hängt.
Setze ich die Geschwindigkeit auf 76 ist kein Problem, aber sobald mehr 
als 76 ist, dann hängt...

Also, ich denke, daß das Problem das sein kann, denn das Programm wird 
bestimmt ab und zu auch solche Geschwindigkeiten setzen. Die Frage ist, 
warum solche Geschwindigkeiten machen Probleme...

Danke
Luca Bertoncello

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luca Bertoncello schrieb:

> Also, ich denke, daß das Problem das sein kann, denn das Programm wird
> bestimmt ab und zu auch solche Geschwindigkeiten setzen. Die Frage ist,
> warum solche Geschwindigkeiten machen Probleme...

Wenn ich mir deine Schaltung ansehe, wundert mich das nicht wirklich.
Keinerlei Abblockkondensatoren, keine Absicherung von Reset, 
wahrscheinlich hast du die Brownout-Fuse nicht gesetzt, etc ...


Wenn deine Motoren plötzlich Vollgas bekommen, dann ziehen die Strom! 
Die veranstalten höchst wahrscheinlich ein Feuerwerk an Störungen auf 
der Versorgungsspannung. Und du ... du hast keinerlei Vorkerhrungen 
getroffen, dass diese Störungen deinen µC nicht ausser Tritt bringen.

Mach wenigstens fürs erste ein paar Blockkondensatoren rein. 100nF an 
Vcc-GND, AVcc-GND. Jeweils möglichst dicht ans µC Gehäuse!

Autor: Luca Bertoncello (lucabert)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:

> Wenn ich mir deine Schaltung ansehe, wundert mich das nicht wirklich.
> Keinerlei Abblockkondensatoren, keine Absicherung von Reset,
> wahrscheinlich hast du die Brownout-Fuse nicht gesetzt, etc ...

Also, Brownout-Fuse ist definitiv nicht gesetzt (Fuses: EE-C9), kannte 
ich es aber auch nicht.
Warum sollte mir es helfen? Wenn ich die Dokumentation lesen (und 
richtig verstehe), sollte das Bit ein Reset machen, wenn unter eine 
bestimmte Spannung geht. Also, noch ein Reset hinzufügen...

> Wenn deine Motoren plötzlich Vollgas bekommen, dann ziehen die Strom!
> Die veranstalten höchst wahrscheinlich ein Feuerwerk an Störungen auf
> der Versorgungsspannung. Und du ... du hast keinerlei Vorkerhrungen
> getroffen, dass diese Störungen deinen µC nicht ausser Tritt bringen.
>
> Mach wenigstens fürs erste ein paar Blockkondensatoren rein. 100nF an
> Vcc-GND, AVcc-GND. Jeweils möglichst dicht ans µC Gehäuse!

1) Die Motoren bekommen ihrer Strom über andere Wege als der µC
2) MIST! Wieder eine alte Version der Schaltung online gesetzt! Als 
Anhang, die letzte. Dort GIBT es ein Kondensator (C5), ziemlich dicht an 
µC, genau 100nF zwischen Vcc+ARef+AVcc und GND.

Andere Ideen?

Danke
Luca Bertoncello

Autor: Spezi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Wo kommt überhaupt die Versorgungsspannung des Controllers her? 
Vermutlich von Extern über Anschluss JP2 ...
(Dann sollte man dort wie bei VCC mehrere Pins als Masse-Anschlüsse 
vorsehen. Und ein Elko zwischen VCC und GND von z.B. 10uF wäre da auch 
sinnvoll als VCC-Puffer.)
Wie hoch ist die "Batteriespannung" am Anschluss JP3? Wie hoch ist der 
max. Motorstrom?

> Die Motoren bekommen ihrer Strom über andere Wege als der µC

Wo ist der GND-Anschluss der Batterie im Layout angeschlossen? Er sollte 
direkt an die Sense-Pins des L298 gehen. Dort wird dann der GND vom L298 
(Pin 8) angeschlossen, und dann gehts weiter zum GND des Controllers.
Wird dies nicht beachtet, fliessen die Motorströme über den GND des 
Controllers, und das mag der überhaupt nicht ...

BTW: C4 mit 100nF als Pufferkondensator für die Motorversorgungsspannung 
ist ja wohl ein Witz. Hier ist ein zusätzlicher grösserer Elko 
erforderlich (Grösse ist abhängig vom Motorstrom; geschätzt: 
1000-4700uF).

Die angesprochenen Abblock-Kondensatoren sind ja offensichtlich 
vorhanden ...

Autor: Luca Bertoncello (lucabert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, Leute!

Ich habe das Problem gefunden.

Ich habe also den Wert von ICR1 von 0xEFFF auf 0xFFFF erhöht.
Jetzt laufen die Motoren seit 5 Minuten problemlos mit den Korrekturen 
(die allerdings noch nicht richtig funktionieren, das ist aber ein 
anderes Problem). Kein Reset mehr.

Ich denke, das Problem ist einfach, daß ich mal versucht habe OCR1A und 
OCR1B auf 0xF0FF zu setzen, was größer als 0xEFFF ist.

Kann es sein, daß das das Problem ist?

Danke
Luca Bertoncello

Autor: Spezi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Kann es sein, daß das das Problem ist?

Es wird sicherlich EIN Problem sein, aber wohl nicht das einzige. Die 
Hardware sollte auch noch überarbeitet werden ...

Denn einen Reset des Controllers im Betrieb bewirkt dein beschriebener 
Fehler nicht; eher schon das kurzzeitige Ab- bzw. Anschalten des Motors 
durch zu grossen PWM-Wert.
Sporadische Resets sind bei Vorhandensein von PWM-Motorsteuerungen meist 
auf Störungen durch die Schaltimpulse zurückzuführen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.