Forum: Mikrocontroller und Digitale Elektronik Verständnisfrage PWM mit AVR


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Wolfgang (wollew)


Lesenswert?

Hallo,

ich benötige für eine Antriebssteuerung ein 6,5 kHz PWM Signal, welches 
ich mit einer Duty-Auflösung von 12 Bit erzeugen möchte.

Nun habe ich schon einiges gelesen, dass man das mit einem Timer machen 
könnte.
Allerdings komme ich mit diesem ganzen Kram um den "Prescaler" nicht 
klar.
Könnte mir das mal jemand erklären ?
Danke

Leider komme ich auch mit diesen ganzen englischen Anleitungen nicht 
klar.

Wolfgang

von Falk B. (falk)


Lesenswert?

Wolfgang schrieb:
> Hallo,
>
> ich benötige für eine Antriebssteuerung ein 6,5 kHz PWM Signal, welches
> ich mit einer Duty-Auflösung von 12 Bit erzeugen möchte.

Dafür braucht man 26MHz Takt. Das können nur die Xmega oder ggf. die 
noch neueren AVRs, welche bis zu 32 MHz schaffen.

> Nun habe ich schon einiges gelesen, dass man das mit einem Timer machen
> könnte.
> Allerdings komme ich mit diesem ganzen Kram um den "Prescaler" nicht
> klar.
> Könnte mir das mal jemand erklären ?

Was soll man da groß erklären? Stell den Timer korrekt ein und gut. 
Soviele Register gibt es da nicht.

> Leider komme ich auch mit diesen ganzen englischen Anleitungen nicht
> klar.

Dort liegt also das Problem. Naja, dann wird es schwierig. Welchen AVR 
willst du denn benutzen? Am Ende ist es einfacher, die drei 
Registereinstellungen dir zu geben als den Kram im Detail zu erklären.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Da kann man glücklicherweise gleich ein X dranmachen, mit einem 
Standard-AVR geht das nicht, Du brauchst einen, bei dem ein Zähler über 
eine PLL getaktet werden kann.

Für 12 Bit brauchst Du 4096*6500Hz=26,624MHz. Der Standard-AVR kann nur 
16Mhz, heißt bei 12 Bit wären nur 3,906kHz möglich, bei 11 Bit 
7,8125kHz.

Frag mich jetzt bitte nicht, welche AVRs eine PLL haben. Ich weiß, daß 
es welche gibt, die dann glaube ich 64Mhz schaffen - aber aus dem Kopf 
weiß ich nicht welche das sind.

Und dann lerne die Datenblätter zu lesen. Der Teil über die Zähler und 
ihre extrem vielseitigen Möglichkeiten ist lang, den wird Dir keiner 
erklären wollen. Da bin ich wahrscheinlich schneller, wenn ich Dir 
einfach selbst den Code dafür schreiben würde.

von Rainer W. (rawi)


Lesenswert?

Wolfgang schrieb:
> ich benötige für eine Antriebssteuerung ein 6,5 kHz PWM Signal, welches
> ich mit einer Duty-Auflösung von 12 Bit erzeugen möchte.

Mit einem AVR, der mit 20MHz läuft, könntest du maximal auf eine 
Auflösung von etwa 11.6 Bit kommen.

von Wolfgang (wollew)


Lesenswert?

Hallo,
Falk B. schrieb:
> Dafür braucht man 26MHz Takt. Das können nur die Xmega oder ggf. die
> noch neueren AVRs, welche bis zu 32 MHz schaffen.

Verstehe ich nicht ? Warum diese hohe Taktrate für 6,5 kHz ?

Falk B. schrieb:
> Dort liegt also das Problem. Naja, dann wird es schwierig. Welchen AVR
> willst du denn benutzen? Am Ende ist es einfacher, die drei
> Registereinstellungen dir zu geben als den Kram im Detail zu erklären.

eigentlich hatte ich mit einem kleinen ATTiny412 geliebäugelt. Mehr als 
3 Pins benötige ich nicht. Einen als Eingang, und zwei Ausgänge - einer 
davon das PWM Signal.

Wolfgang

von Georg M. (g_m)


Lesenswert?

> Antriebssteuerung

● 12-bit PWM Timer/Counter type D (TCD) optimized for power control
● Internal PLL up to 48 MHz for high-frequency operation of 
Timer/Counter type D (PLL)

https://ww1.microchip.com/downloads/aemDocuments/documents/MCU08/ProductDocuments/DataSheets/AVR64DD32-28-Complete-DataSheet-DS40002315.pdf

von Benjamin K. (bentschie)


Lesenswert?

Wolfgang schrieb:

> Verstehe ich nicht ? Warum diese hohe Taktrate für 6,5 kHz ?

Ganz Einfach:
Deine 6,5kHz sollen ja in eine 12Bit PWM aufgelöst werden. Also wird 
intern eine Frequenz benötigt die 4096x schneller als 6,5KHz ist, macht 
halt 26,6MHz

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Schau Dir den ATTiny85 an, der sollte eine PLL mit 32/64MHz für den 
Timer/Counter 1 haben.

von Georg M. (g_m)


Lesenswert?

Ben B. schrieb:
> Schau Dir den ATTiny85 an, der sollte eine PLL mit 32/64MHz für den
> Timer/Counter 1 haben.

Wie viel Bit?

von S. L. (sldt)


Lesenswert?

> eigentlich hatte ich mit einem kleinen ATTiny412 geliebäugelt

Ein AVR16EB14 sollte die Vorgaben erfüllen.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

> Wie viel Bit?
Hast Recht, bei dem hat der Timer/Counter 1 tatsächlich nur 8 Bit. Wie 
gesagt bei den AVRs mit PLL kenne ich mich nicht gut aus, die PLL habe 
ich noch nie gebraucht.

von Georg M. (g_m)


Lesenswert?

S. L. schrieb:
> Ein AVR16EB14 sollte die Vorgaben erfüllen.

Tatsächlich.

● 16-bit Timer/Counter type E (TCE) with four compare channels for PWM 
generation and Waveform Extension (WEX)
● Internal PLL up to 80 MHz for high-frequency operation of 
Timer/Counter type E/F

von Rolf (rolf22)


Lesenswert?

Wolfgang schrieb:

> Leider komme ich auch mit diesen ganzen englischen Anleitungen nicht
> klar.

Ohne Erfahrung im Englisch-Lesen ist das schwierig. Technisches Englisch 
ist einerseits zwar erheblich einfacher als z. B. Shakespeare- oder 
Sun-Englisch, aber andererseits oft nicht 100%ig sprachlich korrekt und 
didaktisch gut, sodass man es nur versteht, wenn man einen Teil davon 
bereits kennt.
Wenn man z. B. weiß, was manche Timer in manchen µPs grundsätzlich so 
alles können, ist es einfach – wenn man so was aus vielen Datenblättern 
erst lernen muss, ist es schwierig. Datenblätter sind halt keine 
Lehrbücher.

Je nachdem, wie alt du bist, kann es sich lohnen, dein Englisch zu 
verbessern.  Es geht IMHO nichts über Lese-Erfahrung. Irgendwann liest 
du es fast wie Deutsch, aber bis dahin dauert es eben.

von Gregor J. (Firma: Jasinski) (gregor_jasinski)


Lesenswert?

Es ist leider wieder einmal eine sinnlose Diskussion, die von vielen nur 
noch unnötig befeuert wird – denn sie ähnelt dem Versuch, jemandem, der 
nicht alphabetisiert ist und auch nicht gewillt ist, diesen Zustand bei 
sich zu ändern, zu erklären, was ein Sonett ist und wie man ein 
schreiben könnte.

: Bearbeitet durch User
von Mi N. (msx)


Lesenswert?

Wolfgang schrieb:
> Leider komme ich auch mit diesen ganzen englischen Anleitungen nicht
> klar.

Wenn Du von AVR abweichen kannst/willst, würde ich Dir ein RP2040 
Pico-Board zur Umsetzung empfehlen. Das ist günstig, hat die passende 
Hardware und es findet sich bestimmt eine deutsche Beschreibung der 
Arduino-IDE, mit der das einfach umzusetzen ist.
Ggf. ein Übersetzungsprogramm verwenden.

von Peter D. (peda)


Lesenswert?

Wolfgang schrieb:
> ich benötige für eine Antriebssteuerung ein 6,5 kHz PWM Signal, welches
> ich mit einer Duty-Auflösung von 12 Bit erzeugen möchte.

Woher kommen diese beiden Zahlen?
Schon bei 11 Bit dürfte keiner mehr 2 Schritte unterscheiden können.

Man kann außerdem eine PWM zyklisch umschalten, die Trägheit filtert das 
eh raus. Ich hab so mal noch 3 Bits hinzugefügt.

von Falk B. (falk)


Lesenswert?

Peter D. schrieb:
> Woher kommen diese beiden Zahlen?
> Schon bei 11 Bit dürfte keiner mehr 2 Schritte unterscheiden können.

???

> Man kann außerdem eine PWM zyklisch umschalten, die Trägheit filtert das
> eh raus. Ich hab so mal noch 3 Bits hinzugefügt.

Du kennst doch gar nicht die Trägheit des Antriebs. Kann gehen, muss 
nicht.

von Peter D. (peda)


Lesenswert?

Exakte 6,5kHz kann eh niemand erzeugen.
Z.B. bei PC-Lüftern ist ein Bereich von 21-28kHz zulässig.

Beitrag #7773016 wurde vom Autor gelöscht.
von Norbert (der_norbert)


Lesenswert?

Peter D. schrieb:
> Exakte 6,5kHz kann eh niemand erzeugen.
> Z.B. bei PC-Lüftern ist ein Bereich von 21-28kHz zulässig.

Das stimmt, selbst ein rp2040 liegt bei default CPU Freq. ca. 6mHz 
daneben.
(Milli-Hertz. Nur zur Sicherheit)

Allerdings kann man den auch auf 130MHz laufen lassen.
Dann ist der Fehler von einer Null kaum zu unterscheiden. ;-)

von Falk B. (falk)


Lesenswert?

Peter D. schrieb:
> Exakte 6,5kHz kann eh niemand erzeugen.

Was ist das denn wieder für eine unsinnige Aussage? Klar kann man 6,5kHz 
erzeugen, das ist sogar recht einfach. Und komm mir jetzt nicht mit ppm 
Abweichungen!

> Z.B. bei PC-Lüftern ist ein Bereich von 21-28kHz zulässig.

Davon war nie die Rede! Es geht nicht um PC Lüfter!

von Falk B. (falk)


Lesenswert?

Wolfgang schrieb:
> ich benötige für eine Antriebssteuerung ein 6,5 kHz PWM Signal, welches
> ich mit einer Duty-Auflösung von 12 Bit erzeugen möchte.

Man könnte den ATtiny24 nehmen, der geht offiziell bis 20MHz. Für ein 
Einzelmuster läuft der auch mit 26MHz, man kann ja VCC auf 5,5V stellen, 
so als Reserve. Er hat einen 16 Bit Timer, der die 12 Bit PWM erzeugen 
kann. Mit DIL14 Gehäuse auch relativ klein. Wenn Bedarf besteht, kann 
ich die Software beisteuern, ist ja praktisch nix. Dazu müßte ich aber 
wissen, das der Eingang und der 2. Ausgang machen sollen.

von Peter D. (peda)


Lesenswert?

Falk B. schrieb:
> Was ist das denn wieder für eine unsinnige Aussage?

Nö.
Damit ist gesagt, daß zu einer korrekten Spezifikation auch immer die 
Angabe der Toleranz gehört. Z.B. auf Netzteilen steht ja nicht aus 
Langeweile 47-63Hz drauf.
Daß diverse Edelbastler mit dem Begriff Toleranz nicht anzufangen 
wissen, war mir natürlich klar.

Falk B. schrieb:
> Davon war nie die Rede! Es geht nicht um PC Lüfter!

Ist es jetzt sogar schon verboten, Beispiele zu nennen?

von Veit D. (devil-elec)


Lesenswert?

Wolfgang schrieb:

> Allerdings komme ich mit diesem ganzen Kram um den "Prescaler" nicht
> klar.
> Könnte mir das mal jemand erklären ?
> Danke
>
> Leider komme ich auch mit diesen ganzen englischen Anleitungen nicht
> klar.
>
> Wolfgang

Hallo,

mit einem 20MHz getakteten ATmega/AVR mit 16 Bit Timer, kommt man für 
6,5kHz auf eine Auflösung von 1537 Abstufungen, also etwas mehr wie 
10Bit.

Wenn du auch mit 4883Hz leben kannst, sind 12Bit möglich.

Das Grundprinzip ist immer gleich.
https://forum.arduino.cc/t/arduin-timer0-timer1/498801/5

Alle Werte kannste vorwärts und rückwärts rechnen bis du deine 
Einstellung gefunden hast und den passenden Controller dazu.

Beitrag #7773071 wurde vom Autor gelöscht.
von Veit D. (devil-elec)


Lesenswert?

Hallo,

eine Anmerkung zu den besagten 26,6MHz MCU Takt die im Thread 
auftauchen. Damit sind die 6,5kHz mit 12Bit nur im Fast-PWM Mode 
möglich, wenn man sich auf ältere Controller Typen wie ATmega328P oder 
ATtiny24 o.ä. bezieht. Allerdings erzeugt der Fast-PWM Mode mit Compare 
Value 0 einen Nadelimpuls. Nimmt man einen anderen glitch free PWM Mode 
benötigt man die doppelte MCU Taktfrequenz für das gleiche Ziel. 
Praktisch nicht machbar.

Neuere AVRs mit ihren TCA, TCB u.ä. Timertypen schaffen mit 26,6MHz nur 
11Bit Auflösung. Wenn es wirklich unbedingt 12Bit sein müssen, benötigt 
es einen mit PLL für den Timer.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

> Allerdings erzeugt der Fast-PWM Mode mit Compare Value 0
> einen Nadelimpuls.
Man kann den PWM-Generator invertiert betreiben wenn ich mich recht 
erinnere. Dann verlagert sich der Nadelimpuls an das obere Ende, d.h. 
man erreicht kein Dauer-Ein wenn man den Ausgang dafür nicht umschaltet. 
Alternativ kann man auch bei Sollwert 0 einfach den Pin abschalten, dann 
ist der Nadelimpuls weg.

Kommt halt drauf an, welcher Regelbereich gefordert wird. Wenn man bei 
12 Bit z.B. 2048+-2000 möchte, interessiert dieser Nadelimpuls nicht 
weil die Regelung gar nicht bis auf auf Null herunterläuft.

von 900ss (900ss)


Lesenswert?

Wolfgang schrieb:
> Leider komme ich auch mit diesen ganzen englischen Anleitungen nicht
> klar.

Hier ist es in Deutsch erklärt. Recht umfangreich, aber wie gut weiß ich 
nicht. Bin nur gerade drüber gestolpert.  Das Thema PWM wird aber 
behandelt.

https://www.heise.de/blog/Timer-Counter-und-Interrupts-3273309.html

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.