www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Anfänger / PWM beim Attiny25


Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag,

ich mache gerade meine ersten Versuche mit den Atmel Mikrocontrollern 
und arbeite mit dem STK500 und dem AVR Studio. Zu Beginn habe ich erst 
mal ein paar LED's eingeschaltet, dann ein Blinklicht erzeugt und fange 
nun an mich mit den Timern zu beschäftigen.

Mit dem Timer1 habe ich schon geschafft ein CTC-Interrupt zu erzeugen. 
Nun möchte ich ein PWM Signal an PORTB PIN1 zu erzeugen. Leider komm ich 
da seit Gestern nicht weiter und hoffe das mit jemand helfen kann.


Laut Datenblatt des Attiny 25 habe ich die Möglichkeit mit dem Timer 1 
am PinB1 und am PinB4 ein PWM signal zu erzeugen.

"Auszug Datenblatt Seite 90"
>When the PWM mode is selected, Timer/Counter1 and the Output Compare >Register C 
-OCR1C form a dual 8-bit, free-running and glitch-free PWM >generator with outputs 
on thePB1(OC1A) and PB4(OC1B) pins and inverted >outputs on pins PB0(OC1A) and 
PB3(OC1B).


Nun habe ich die Register folgendermaßen gesetzt, um ein PWM am PinB1 
mit 500kHz zu erzeugen.

DDRB |= (1 << PB1);
TCCR1 |= ((1 << PWM1A) | (1 << CS10) | (1 << COM1A1) > (1 << COM1A0));
OCR1C = 127;

Leider tut sich am PinB1 gar nichts. Kann mir jemand erklären was ich 
falsch mache? Vielen Dank!

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> TCCR1 |= ((1 << PWM1A) | (1 << CS10) | (1 << COM1A1) > (1 << COM1A0));
Na, da stimmt hinten aber was nicht... Ist das wirklich genau Dein 
Original-Code?

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, so hat ich es auch im Original Code stehen.

Hab es jetzt in

TCCR1 |= ((1 << PWM1A) | (1 << CS10) | (1 << COM1A1) | (1 << COM1A0));

geändert. Läuft aber auch so noch nicht.

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DDRB = (1<<PB1); //OCOB als Ausgang

//Timer/Counter Control Register A
//Fast PWM, Clear OC0B on Compare Match, set OC0B at BOTTOM
TCCR0A = (1<<COM0B1) | (1<<WGM01) | (1<<WGM00);

//Timer/Counter Control Register B
TCCR0B = (1<<CS01); //8er Prescaler

//Output Compare Register B (Weil PB1, OC0B benutzt wird)
OCR0B = 0x7F;


Edit: Hoppala, es ging dir ja um 16Bit PWM...

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein initialer Code ist so schlecht nicht, aber du musst OCR1A noch
einen Wert zwischen 1 und 127 zuweisen.  Fang erstmal mit 63 an, das
liegt in der Mitte, sodass das Tastverhältnis 1:1 sein sollte.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tim T. wrote:
> Edit: Hoppala, es ging dir ja um 16Bit PWM...
Kannst ja mal versuchen, mit nem Tiny25 ne 16-Bit-Hardware-PWM 
hinzukriegen... Wird schwierig!

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hilfe.

Es lag am OCR1A Register, das war 0 und daher kein PWM zu sehen.


Nun hab ich noch ne Frage. Wenn ich nen Motor über PWM in der 
Geschwindigkeit regeln will(natürlich über nen Treiber), woher was ich 
welche PWM Frequenz dafür geeignet ist. Hab noch nen Motor rumfliegen 
aber kein Datenblat dazu.

Werd einfach mal ein wenig damit rumprobieren, aber vielleicht hab ihr 
da ein paar Richtwerte für mich.

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:
> Tim T. wrote:
>> Edit: Hoppala, es ging dir ja um 16Bit PWM...
> Kannst ja mal versuchen, mit nem Tiny25 ne 16-Bit-Hardware-PWM
> hinzukriegen... Wird schwierig!

Oops, stimmt ja auch, der hat ja nur 2 8er.
Hatte TCCR1 jetzt mit 16Bit gleichgesetzt...

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieh einfach zu das du über dem hörbaren Bereich (bei mir etwa 12 kHz) 
bist.
Im phase correct PWM mode bei 8 MHz intern OC ohne Prescaler liegst du 
bei etwa 15,7 kHz PWM Frequenz.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tim T. wrote:

> Im phase correct PWM mode bei 8 MHz intern OC ohne Prescaler liegst du
> bei etwa 15,7 kHz PWM Frequenz.

Guck dir doch bitte wenigstens den Controller erstmal an, bevor du
dich zu solchen Aussagen hinreißen lässt.  Erstens hat der ATtiny25
gar kein phasenrichtiges PWM, und zweitens kann man bei ihm den Timer
aus einem via PLL gesteuertem Taktvervielfacher treiben, sodass sich
viel größere PWM-Frequenzen ermöglichen lassen.

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch wrote:
> Tim T. wrote:
>
>> Im phase correct PWM mode bei 8 MHz intern OC ohne Prescaler liegst du
>> bei etwa 15,7 kHz PWM Frequenz.
>
> Guck dir doch bitte wenigstens den Controller erstmal an, bevor du
> dich zu solchen Aussagen hinreißen lässt.  Erstens hat der ATtiny25
> gar kein phasenrichtiges PWM, und zweitens kann man bei ihm den Timer
> aus einem via PLL gesteuertem Taktvervielfacher treiben, sodass sich
> viel größere PWM-Frequenzen ermöglichen lassen.

Datenblatt unter 
http://www.atmel.com/dyn/resources/prod_documents/...
Seite 77 bzw. 82.

PS: Es geht freundlicher...

PPS: Es liegt ein solcher hinten links auf meinem Schreibtisch, 
allerdings noch verfused.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tim T. wrote:

> Datenblatt unter
> http://www.atmel.com/dyn/resources/prod_documents/...
> Seite 77 bzw. 82.

OK, ich hatte mir nur den Timer 1 angeguckt, von dem hier ja die
Rede war.

> PS: Es geht freundlicher...

Kritik angenommen.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche PWM-Frequenz sinnvoll und machbar ist, hängt vom Motor und auch 
vom Treiber ab. Generell kann man sagen: Je höher die Schaltfrequenz, 
desto geringer die Stromwelligkeit und damit auch die 
Drehmomentwelligkeit und die Geräuschentwicklung. Allerdings gehen bei 
höheren Schaltfrequenzen auch die Schaltverluste rapide nach oben, 
weshalb bei höheren Betriebsströmen eher kleinere Schaltfrequenzen 
gewählt werden sollten, um den Motortreiber nicht abrauchen zu lassen. 
Man muss einen Kompromiss machen. Bei kleinen Modellbaumotörchen mit 
Betriebsströmen im Bereich weniger 100 mA kannste aber i.d.R. mit der 
Schaltfrequenz durchaus in den Bereich jenseits von 20 kHz, wenn der 
Treiber das mitmacht.

@Tim:
> PS: Es geht freundlicher...
Ich finde Jörgs Antwort in Anbetracht der Tatsache, dass Du schon 
zweimal nen ziemlichen Bock geschossen hast, weil Du Dir den µC bzw. 
das dazugehörige Datenblatt offensichtlich tatsächlich nicht richtig 
angesehen hast, überhaupt nicht sonderlich unfreundlich...

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch wrote:

> OK, ich hatte mir nur den Timer 1 angeguckt, von dem hier ja die
> Rede war.
Ok, ich hatte in meinem ersten Post alles beschrieben wie man den Timer0 
nutzen kann, allerdings im Beispiel dort noch mit Fast PWM und nem 8er 
Prescaler.

Finde deine Rückmeldung aber sehr positiv. Ich kenn das ja selber wenn 
man jemandem was um die Ohren haut das dann doch nicht so ganz stimmt^^

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:
> @Tim:
>> PS: Es geht freundlicher...
> Ich finde Jörgs Antwort in Anbetracht der Tatsache, dass Du schon
> zweimal nen ziemlichen Bock geschossen hast, weil Du Dir den µC bzw.
> das dazugehörige Datenblatt offensichtlich tatsächlich nicht richtig
> angesehen hast, überhaupt nicht sonderlich unfreundlich...

Ok, zu meinem ersten Bock muss ich wirklich zugeben das ich da nicht für 
ins Datenblatt geschaut habe, ist irgendwie so drin TCCR1 ist 16 Bit und 
da ich TCCR0A/B grade erst für ne 8 Bit PWM benutzt hab, war ich noch 
davon überzeugt.

Der 2. sollte sich aufgeklärt haben. In Anbetracht das der OP wohl grade 
erst mit Controllern anfängt und eh rumbastelt, wollte ich ihm einfach 
etwas an die Hand geben was bei meinen ersten Gehversuchen mit PWM und 
Motoren aus der Grabbelkiste funktioniert hat.
Was ist dem OP wohl lieber, eine Antwort ala ohne DB des Motors wirst Du 
keine Antwort dazu bekommen oder eine Aussage zu einem Wert der gehen 
sollte?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tim T. wrote:
> Ok, zu meinem ersten Bock muss ich wirklich zugeben das ich da nicht für
> ins Datenblatt geschaut habe, ist irgendwie so drin TCCR1 ist 16 Bit und
> da ich TCCR0A/B grade erst für ne 8 Bit PWM benutzt hab, war ich noch
> davon überzeugt.
Ist ja auch bei den meisten AVRs so, dass Timer 1 ein 16-Bit-Timer ist. 
In dem Zusammenhang vielleicht auch noch entschuldbar...

Bei zweiten Klops meinte ich eher die Sache mit der Frequenz. Aber ist 
ja auch wurscht...

Fest steht (um zum eigentlichen Thema zurückzukommen): Um genauere 
Aussagen zur Frage des OP zu machen, müsste man schon etwas mehr über 
den Motor und evtl. auch den Treiber wissen. "Hab noch nen Motor 
rumfliegen" ist in dem Zusammenhang etwas zu schwammig.

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.