Forum: Mikrocontroller und Digitale Elektronik PWM Atmega8 auf dem 2. 8 Bit Timer/Counter


von Carsen (Gast)


Lesenswert?

Liebe Alle,

ich versuche mich an meinem ersten Projekt und scheitere gerade in 
vollem Umfang. Final ist angedacht, dass über einen der 8-Bit PWM-Port 
(PB3, Timer/Counter2) des Atmega8 ein BUZ21 einen kleinen Motor und 
dessen Umdrehungsgeschwindigkeit regelt.

Vorab versuche ich eine Testschaltung auf dem Steckbrett und folgenden 
Minicode:


/* Schnipp */
void main(void)
{
  DDRB=0xff;
  PORTB=0xff;

  TCCR2 = _BV(COM21) | _BV(WGM20);
  TCCR2 = _BV(CS20);

  while(1)
  {
    OCR2=200;
  }
  return 0;
}
/* Schnapp */

Die Lektüre des Datenblattes sagt mir, dass ich damit den gewünschten 
PWM Phase Correct Mode erziele und die Clock ohne Prescaler nutze.

Meinem Verständnis nach sollte nun eine unterschiedliche 
Motorgeschwindigkeit erzielt werden wenn ich OCR2 = 100; in der Schleife 
habe oder OCR2 = 200;

Leider erziele ich keinen Unterschied bei unterschiedlichen Werten des 
OCR2.

Da ich vermute, dass es es Softwareproblem ist stelle ich meinen 
Versuchsaufbau mal noch nicht dazu.

Wenn jemand einen Tipp hat wäre ich sehr dankbar.

Mit freundlichen Grüßen
Carsen

von spess53 (Gast)


Lesenswert?

Hi

>  TCCR2 = _BV(COM21) | _BV(WGM20);
>  TCCR2 = _BV(CS20);

Entscheide dich mal.

MfG Spess

von Hans B. (hans_b92)


Lesenswert?

Hallo,

Entschuldigung, leider kann ich mit diesem Hinweis nichts anfangen. Ich 
verstehe nicht was du meinst, meiner Auffassung nach setzen die 3 Bits 
die ich aktiviere jeweils unterschiedliche Themenbereiche (PWM, Setmode 
und Prescaler für die Uhr). Ist dem nicht so?

Viele Grüße
Carsen

von spess53 (Gast)


Lesenswert?

Hi

> meiner Auffassung nach setzen die 3 Bits
>die ich aktiviere jeweils unterschiedliche Themenbereiche (PWM, Setmode
>und Prescaler für die Uhr). Ist dem nicht so?

Nein. Mit der zweiten Zuweisung überschreibst du die erste.

MfG Spess

von Rene K. (draconix)


Lesenswert?

Um es mal zu verdeutlichen was Spess dir eigentlich zu vermitteln mag:

Falsch:
1
  TCCR2 = _BV(COM21) | _BV(WGM20);
2
  TCCR2 = _BV(CS20);

Richtig:
1
  TCCR2 = _BV(COM21) | _BV(WGM20) | _BV(CS20);

;)

von Hans B. (hans_b92)


Lesenswert?

Begriffen. Herzlichsten Dank!

von Hans B. (hans_b92)


Lesenswert?

Dass die zweimalige Setzung des Register die erste überschreibt ist mir 
nun klar und ist behoben.

Leider bringt mein Versuchsaufbau immernoch die gleichen 
(nicht)-Ergebnisse. Der Motor läuft nicht.

Versuchsaufbau ist identisch (Atmega8, PB3 speißt über Widerstand den 
Buz21, Widerstand + LED an anderem Ausgang), ich initialisiere jetzt 
mit:

TCCR2 = _BV(COM21) | _BV(WGM20) | _BV(CS20);

Ist die Anweisung prinzipiell richtig um ein PWM Signal zu erzeugen?

Bei dem Testaufbau beobachte ich ferner, dass die LED (obwohl auf 
gänzlich anderem Pin) plötzlich statt konstantem Leuchten nur noch 
schwach glimmt/flackert. Setze ich den OCR2 auf 0 habe ich wieder 
konstantes Leuchten - je höher der Wert desto niedriger die 
Leuchtleistung.

Liegt das an einem Störsignal auf dem Teststeckbrett oder an dem 
Timercode? Der Code hat sonst keinen Inhalt außer die Anweisung die LED 
Pin auf Ausgang und High zu setzen.

Für Tipps wie immer dankbar.

Beste Grüße

von Rene K. (draconix)


Lesenswert?

Hmm... scheint alles richtig zu sein...

Du bist aber schon an Port B Pin 3? also Pin 17 mit deinem 
Motorcontroller?!
Denn dein Verhalten deiner LED spricht ganz und gar dafür das dort ein 
PWM Signal anliegt.

EDIT: Ein Oszi zur Hand?! Oder wenigstens ein Multimeter mit 
Freqenzmesser?

von Hans B. (hans_b92)


Angehängte Dateien:

Lesenswert?

Hi nochmal,

ich habe noch kurz den Schaltplan angehängt.

Ich habe Port B3 (Pin17) mehrfach überprüft, ich hänge am richtigen Pin. 
Macht es etwas das auf gleichem Pin die Programmierschnittstelle liegt? 
Ich ziehe für meine Tests die ISP nach der Übertragung immer ab.

Viele Grüße und schon mal Danke für die bisherigen Antworten

von Karl H. (kbuchegg)


Lesenswert?

Wo kommt die Stromversorgung her?
Keine Entstörkondensatoren?
Keine Blockkondensatoren?

Da wundert es mich nicht, dass dein µC abstürzt, sobald der Motor 
anfängt Strom zu ziehen und die Versorgungsspannung versaut.

Ersetz doch mal den Motor durch eine LED+Vorwiderstand. Die ist etwas 
gnädiger was die Stromversogung angeht.

Und dann natürlich: Blockkondensatoren an den µC ran!

von Hans B. (Gast)


Lesenswert?

ich habe die Spannungsversorgung mit deem Spannungsregler aus dem Avr 
Tutorial davor, es kommen überall stabile 5 v an. Dachte das sei nicht 
erwähnenswert, da liegt auch nach meinen Messungen kein Fehler!

Grüße

von Karl H. (kbuchegg)


Lesenswert?

Hans B. schrieb:
> ich habe die Spannungsversorgung mit deem Spannungsregler aus dem Avr
> Tutorial davor, es kommen überall stabile 5 v an.

Das entbindet dich nicht davon, an jedes Vcc/GND Pärchen vom Mega einen 
100nF Kondensator zu hängen.

> Dachte das sei nicht
> erwähnenswert, da liegt auch nach meinen Messungen kein Fehler!

Womit misst du?
Mit einem Voltmeter wirst du die kleinen Einbrüche nicht sehen. Die sind 
im Bereich von µ-Sekunden!

Wie gesagt: Ersetz mal den Motor (was ist das überhaupt für einer? 
Wieviel Strom braucht der?) durch eine LED. Mittels OCR musst du die 
dann sauber dimmen können.

von Hans B. (Gast)


Angehängte Dateien:

Lesenswert?

Hi

wie gesagt ich habe den Schaltplan für die Spannungsversorgung gewählt 
aber wenn ich dich richtig verstehe muss zusätzlich noch an jedes 
Vcc/GND Pärchen einen Kondensator vorschalten.

Ich messe leider nur mit einem Voltmeter daher kann ich das 
wahrscheinlich wirklich nicht erkennen, aber der Atmega funktioniert bei 
den anderen Sachen wie LED schalten oder über einen Taster den Eingang 
schalten ohne Probleme.

Das mit der LED statt Motor werde ich morgen mal probieren und dann 
berichten.


Gruß
Carsen

von Rubelus (Gast)


Lesenswert?

BTW... der BUZ21 schaltet doch eh erst bei 10V voll durch, oder wie war 
das?!

von Rene K. (draconix)


Lesenswert?

Jep, kommt auch ein wenig darauf an welchen 7805 du verwendest. Wenn du 
einen "kleinen" hast - schaft der gerade mal 0,5A oder bei der 78L05 
sogar nur 100mA.

Wenn dein Motor nun die Einschaltspannung bekommt, wird er vermutlich 
weit darüber liegen, sodas dein gesamtes System kurzfristig lahmgelegt 
wird.

von Hans B. (hans_b92)


Angehängte Dateien:

Lesenswert?

Liebe Alle,

hab es jetzt mit einer LED probiert und diese lies sich dimmen. Insofern 
scheint mein Hardwareaufbau nicht korrekt zu sein. Mir ist z.B. nicht 
ganz klar wo ich die Kondensatoren vor die VCC/GNC Pärchen des Atmega 
hängen muss - bei meinen Testläufen habe ich nur mit der Kombination auf 
dem Schaltbild überhaupt eine lauffähige Konfiguration erreicht. Wenn 
ich die Kondensatoren wie im Schaltbild oben nun drin habe, komme ich 
jedoch leider zum gleichen Ergebnis - es besteht kein Unterschied zum 
vorherigen Verhalten.

Wenn ich die LED nun durch den Motor (den ich übrigens von einem Spiel 
meiner Kinder geklaut habe - leider keine weiteren Angaben verfügbar als 
das es ein sehr kleiner Motor ist) ersetze und ihn (wie im Schaltbild) 
auf 9 V gebe dreht er sich sehr unkontrolliert - mal schnell, mal 
langsam. Obwohl ich den OCR2-Wert nicht verändere. Ziehe ich ihn auf die 
5 V nach dem Spannungsregler dreht er sich gar nicht.

Der Spannungsregler ist übrigens ein LF 50 CV. Die Spannungsversorgung 
ist ein 9 V Trafo mit 500 mA.

Falls jemand einen Tipp für mich hat freu ich mich natürlich.

Viele Grüße
Carsen

von Karl H. (kbuchegg)


Lesenswert?

Hans B. schrieb:
> Liebe Alle,
>
> hab es jetzt mit einer LED probiert und diese lies sich dimmen.

Gut

> Insofern
> scheint mein Hardwareaufbau nicht korrekt zu sein. Mir ist z.B. nicht
> ganz klar wo ich die Kondensatoren vor die VCC/GNC Pärchen des Atmega
> hängen muss

So nahe wie möglich an die physikalischen Pins.
Da die klugerweise von Atmel direkt nebeneinander am Chip angeordnet 
wurden braucht man einfach nur einen 100nF neben den Chip auf Höhe der 
Vcc/GND Pins einsetzen und mit den Pins verdrahten.

> - bei meinen Testläufen habe ich nur mit der Kombination auf
> dem Schaltbild überhaupt eine lauffähige Konfiguration erreicht.

Solange keiner die Versorgungsspannung verschmutzt, braucht keiner diese 
Kondensatoren. Nur leider ist die reale Welt nicht so einfach. Jeder 
Schaltkreis verursacht kleine Störungen auf der Versorgungsspannung. Und 
diese Kondensatoren dienen dazu, sie wieder zu eliminimieren. Allerdings 
geht das nur in einem gewissen Umfang. Wenn es zu viele/zu große 
Störungen sind, dann helfen auch die Kondensatoren nichts mehr.

> Wenn
> ich die Kondensatoren wie im Schaltbild oben nun drin habe, komme ich
> jedoch leider zum gleichen Ergebnis - es besteht kein Unterschied zum
> vorherigen Verhalten.

Wieviel Strom will dein Motor?


Motoren sind
1) Dreckschleudern, indem sie dir die Versorgungsspannung versauen.
2) sie wollen Strom haben!
   Überhaupt im Moment des Einschaltens.
   Diesen Strom muss aber jemand liefern können!
   Dein 7805 kann nicht beliebig viel Strom liefern. Zieht der Motor
   zuviel Strom dann geht der 7805 in die Knie und die Spannung bricht
   ein. Spannungseinbruch ist aber schlecht, weil dann der µC resettet.


> Wenn ich die LED nun durch den Motor (den ich übrigens von einem Spiel
> meiner Kinder geklaut habe - leider keine weiteren Angaben verfügbar als
> das es ein sehr kleiner Motor ist)

Dann miss erst mal nach!
Häng den Motor über ein Amperemeter an die Versorgungsspannung und miss 
die Stromaufnahme.

> ersetze und ihn (wie im Schaltbild)
> auf 9 V gebe dreht er sich sehr unkontrolliert - mal schnell, mal
> langsam. Obwohl ich den OCR2-Wert nicht verändere.

Ein Indiz dafür, dass dir die Versorgungsspannung einbricht.

> Ziehe ich ihn auf die
> 5 V nach dem Spannungsregler dreht er sich gar nicht.

Dann wird der Motor wahrscheinlich bauartbedingt auch nicht mit 5V 
laufen.

> Der Spannungsregler ist übrigens ein LF 50 CV. Die Spannungsversorgung
> ist ein 9 V Trafo mit 500 mA.

500mA ist nicht viel. Miss mit dem Amperemeter nach, wieviel der Motor 
zieht. Und dabei Bedenken: im Einschaltmoment will der Motor ein 
Vielfaches vom Dauerstrom.

> Falls jemand einen Tipp für mich hat freu ich mich natürlich.

Miss deinen Motor aus und bau eine ordentliche Spannungsversogung die 
dem gewachsen ist. Du kannst noch so viel herumjammern. Ohen vernünftige 
Spannungsversorgung wird das nichts. Und nein: wie groß der Motor ist, 
spielt keine Rolle. Auch kleine Motoren können ordentlich Ströme ziehen.

von Hans B. (hans_b92)


Lesenswert?

Besten Dank vorab, mit dem Kondensator am Atmega bekomme ich jetzt das 
gewünschte Verhalten.

Ich werde trotzdem am Wochenende mal den Motor ausmessen und auch im 
Hinblick auf die anderen Bereiche überprüfen ob meine Stromversorgung 
ausreichend ist.

Vielen Dank für die Unterstützung.

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.