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


von Luca B. (lucabert)


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:
1
#define MOTORDIR_DDR            DDRD
2
#define MOTORDIR_PORT           PORTD
3
#define MOTORDIR_PIN            PIND
4
#define MOTORDIRL1_PIN          4  // PIND4
5
#define MOTORDIRL2_PIN          5  // PIND5
6
#define MOTORDIRR1_PIN          6  // PIND6
7
#define MOTORDIRR2_PIN          7  // PIND7
8
#define MOTOREN_DDR             DDRB
9
#define MOTOREN_PORT            PORTB
10
#define MOTOREN_PIN             PINB
11
#define MOTORENL_PIN            1  // PINB1
12
#define MOTORENR_PIN            2  // PINB2
13
14
void initMotors()
15
{
16
  MOTORDIR_DDR |= (1<<MOTORDIRL1_PIN) | (1<<MOTORDIRL2_PIN) | (1<<MOTORDIRR1_PIN) | (1<<MOTORDIRR2_PIN);
17
18
  TCCR1A |= _BV(COM1A1) | _BV(COM1B1) | _BV(WGM11);
19
  ICR1 = 0xEFFF;
20
}

Nun setze ich die Geschwindikeit mit:
1
  pwmL = pwmR = (uint8_t) (((float)speed * (float)CONSTPWM)); \
2
  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:
1
  TCCR1B = _BV(WGM12) | _BV(WGM13) | _BV(CS10); \
2
  TCCR1A |= _BV(COM1A1) | _BV(COM1B1) | _BV(WGM11); \
3
  ICR1 = 0xEFFF; \
4
  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):
1
    nSpeed = ((uint16_t)1000 / (uint16_t)intervalR);
2
    if(nSpeed != (uint16_t)getSpeed() && nSpeed != 0)
3
    {
4
      pwm = (uint8_t) (((uint16_t)pwmR * (uint16_t)getSpeed()) / nSpeed);
5
      if(pwm < MINPWM)
6
        setRightPWM(MINPWM);
7
      if((pwm > MINPWM) && (pwm < MAXPWM))
8
        setRightPWM(pwm);
9
      if(pwm > MAXPWM)
10
        setRightPWM(MAXPWM);
11
      turnOnLED(LED3);
12
    }
13
    else
14
      turnOffLED(LED3);

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

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

von Hubert G. (hubertg)


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.

von Luca B. (lucabert)


Angehängte Dateien:

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

von Luca B. (lucabert)


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

von Karl H. (kbuchegg)


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!

von Luca B. (lucabert)


Angehängte Dateien:

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

von Spezi (Gast)


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 ...

von Luca B. (lucabert)


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

von Spezi (Gast)


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.

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.