Ich hatte es bislang immer ao verstanden, das der Atmega 32 ein 16Bit
PWM hat.
Ich nutze die fertige LIB von Mikroe und kann nur Werte von 0-1023
nutzen, darüber hinaus startet er wieder bei 0.
Sollte der Wert nicht bis 655xx gehen?
ODer bedeutet es nur das ein16Bit TIMER verwendet wird, aber dennoch nur
Werte um 10 Bit genutzt werden?
Oder mache ich was falsch?
Jep, zur Auswahl gibt es
Initializes the PWM module. Parameter wave_mode is a desired PWM-16bit
mode.
There are several modes included :
PWM, Phase Correct, 8-bit
PWM, Phase Correct, 9-bit
PWM, Phase Correct, 10-bit
Fast PWM, 8-bit
Fast PWM, 9-bit
Fast PWM, 10-bit
Parameter prescaler chooses prescale value N = 1,8,64,256 or 1024 (some
modules support 32 and 128, but for this you will need to check the
datasheet for the desired MCU). Paremeter inverted is for choosing
between inverted and non inverted PWM signal. Parameter duty sets duty
ratio from 0 to TOP value (this value varies on the PWM wave mode
selected). PWM signal graphs and formulas are shown below.
Description Sets PWM duty ratio. Parameter duty takes values shown on the table below. Where 0 is 0%, and TOP value is 100% duty ratio. Other specific values for duty ratio can be calculated as (Percent*TOP)/100.
7
8
Timer/Counter Mode of Operation : TOP : Update of OCRnX at : TOVn Flag Set on :
KArl Fred M. schrieb:> Oder mache ich was falsch?
Sieh dir doch einfach die Funktion an, die da aufgerufen wird und schau
nach, welche Register wie beschrieben werden. Sieh dann im Datenblatt
nach, was diese Register bewirken und welche Werte sie annehmen können.
Dieser Weg startet hier:
http://download.mikroe.com/documents/compilers/mikroc/avr/help/pwm16bit_library.htm
Und dann gibt es noch den anderen Weg, der beim Datenblatt und den dort
dokumentierten Fähigkeiten der Timer beginnt. Und dort steht dann "The
Timer/Counter (TCNT1), Output Compare Registers (OCR1A/B), and Input
Capture Register (ICR1) are all 16-bit registers"
KArl Fred M. schrieb:> ODer bedeutet es nur das ein16Bit TIMER verwendet wird, aber dennoch nur> Werte um 10 Bit genutzt werden?
Fazit hier: die Hardware kann mehr als in der Software definiert wurde.
BTW: dir ist schon bewusst, dass eine 16-Bit-PWM dann mit 244Hz bei
16MHz Takt ziemlich niederfrequent ist?
Dir ist sicher aufgefallen das ich davon keine Ahnung habe;-)
In welchem Zusammenhang stehen 16Bit 16MHz und 244Hz?
Ich dachte da sind nur die Abstufungen feiner.
Ich wusste nicht, das es da einen Zusammenhang mit dem Takt gibt.
Aber 244Hz wären mehr als ok, denke ich für meine Anwendung
"BTW: dir ist schon bewusst, dass eine 16-Bit-PWM dann mit 244Hz bei
16MHz Takt ziemlich niederfrequent ist?"
KArl Fred M. schrieb:> Ich wusste nicht, das es da einen Zusammenhang mit dem Takt gibt.
Irgendwo muss ja logischerweise ein Takt herkommen. Oder wie soll der
Counter sonst zählen?
Genau deshalb habe ich das Bild aus dem Datenblatt gezeigt. Dort ist zu
sehen, dass der Takt für den TCNT1 Zähler von einem der beiden Prescaler
kommt. Und zu diesen Prescalern gibt es natürlich auch eine Übersicht
und eine Beschreibung.
Sieh dir die Bilder genau an, denn das ist die Timerstruktur, ein
Überblick der Komponenten, die dir für deine Aufgabe zur Verfügung
stehen. Wie sie zu benutzen sind, steht in den paar Seiten, die danach
im Datenblatt folgen.
Und letztlich ist es dann so: wenn deine Aufgabe mit diesen im µC
eingebauten Komponenten erledigt werden kann, dann kannst du den µC
verwenden. Wenn nicht, dann musst du tricksen oder einen anderen suchen.
Dass dir dabei irgendwelche eingeschränkten Softwarelibraries zusätzlich
Steine denWeg legen, macht die Sache dann eigentlich spannnend. Denn
letztlich ist das die Chance, die paar Register mal selber anzupacken
und ans Laufen zu bekommen.
Stefan ⛄ F. schrieb:> Es gibt auch 16 Bit Modi.> http://download.mikroe.com/documents/compilers/mikroc/avr/help/pwm16bit_library.htm
Sackgasse. Das ist zwar der 16-Bit-Tiner, aber es werden nur maximal 10
Bit davon unterstützt. Das #define _PWM16_PRESCALER_16bit_65536 ist
nicht vorhanden...
KArl Fred M. schrieb:> ahhh, dann hab ich das nur übersehen:-)> Danke, bei den Temperaturen gestern und immer mit dem Testaufbau rein> raus, da war ich dann wohl durch:-)
Siehe LED-Fading. Man kann den Timer auch direkt konfigurieren, die
"Lib" macht da nicht wirklich viel, außer Zusatzaufwand zu erzeugen.
nein doch nicht..
procedure PWM16bit_Init(wave_mode : byte; prescaler : byte; inverted :
byte; duty : word; timer : byte);
Der Parameter ist für etwas anderes. Es bleiben maximal 10bit
KArl Fred M. schrieb:> Ich hatte es bislang immer ao verstanden, das der Atmega 32 ein 16Bit> PWM hat.
Er hat zwei 16-Bit-PWM-Kanäle über Timer1. Sprich: gleiche PWM-Frequenz,
aber getrennte Dutys für die Kanäle.
> Ich nutze die fertige LIB von Mikroe
Scheiß' auf "fertige LIBs". Lerne, wie man es selber richtig macht.
Alternativ: Lerne, die LIB richtig zu benutzen. Ich kenne die konkrete
LIB nicht und kann deshalb nicht einschätzen, ob das hier helfen
würde...
Lothar M. schrieb:> Das #define _PWM16_PRESCALER_16bit_65536 ist nicht vorhanden...
Um einen Timer mit 16 Bit nutzen zu können brauche ich doch keinen
Prescaler 65536. Der kann gut und gerne auch auf 1 stehen.
Aber ich habe gerade einen anderen Fehler in meiner Argumentation
entdeckt. Die _PWM16_PRESCALER_xxxxx Konstanten stellen nur den
Prescaler ein, nicht den Mode. Als Mode werden tatsächlich nur 8, 9 und
10 Bit angeboten. Wie enttäuschend!
Stefan ⛄ F. schrieb:> Lothar M. schrieb:>> Das #define _PWM16_PRESCALER_16bit_65536 ist nicht vorhanden...> Um einen Timer mit 16 Bit nutzen zu können brauche ich doch keinen> Prescaler 65536.
Stimmt auch wieder. Allerdings hat der verwirrend benamte Prescaler auch
keine 16 Bit, sondern nur 10... ;-)
Stefan ⛄ F. schrieb:> Als Mode werden tatsächlich nur 8, 9 und> 10 Bit angeboten. Wie enttäuschend!
Ich muss da noch mal nach haken. Was ist mit:
_PWM16_INVERTED Selects the inverted PWM-16bit mode.
_PWM16__NON_INVERTED Selects the normal (non inverted) PWM-16bit mode.
Das sind doch (laut Beschreibungstext) Modes des Timers, oder nicht? Die
Doku ist echt verwirrend. Bei Open-Source könnte man wenigstens in den
Quelltext schauen.
Stefan ⛄ F. schrieb:> _PWM16_INVERTED Selects the inverted PWM-16bit mode.> _PWM16__NON_INVERTED Selects the normal (non inverted) PWM-16bit mode.>> Das sind doch (laut Beschreibungstext) Modes des Timers, oder nicht?
Wohl doch nicht. Das ist ja wiederum ein eigener Parameter (inverted) im
Funktionsaufruf.
KArl Fred M. schrieb:> jep :-(
Mein Gott, lies' halt einfach den Code der LIB, um rauszufinden, was die
genau tut. Oder Scheiß' auf die LIB und mach' es selber.
Ich würde natürlich immer letzteres empfehlen.
"Mein Gott, lies' halt einfach den Code der LIB"
na, wenn das so einfach möglich wäre, müsste ich hier nicht als Anfänger
so verzweifelt fragen.
Die Lib ist nicht zugänglich
Klar, kann man 16-Bit-PWM machen, wenn man weiß, wie man so einen µC zur
Not in asm, oder C ansprechen kann. Dafür gibt es auch Einsatzbereiche:
Stimme mal einen 10 MHz-Generator mit einem GPS-PPM über eine VariCap
auf 0,1 Hz stabil ab... (0,01 ppm) Mit 13-Bit-PWM (Tiny24) klappt das
sehr gut.
Allerdings bin ich mir nicht sicher, ob das ohne den sauberen Überblick
bei asm-Programmierung (vielleicht auch noch in C) klappen könnte.
Bei (für den Nutzer) einfacherer Hochsprache muss ein Prozessor jede
suboptimal übersetzte Programmier-Strategie einfach durch den
Geschwindigkeitsvorteil ausgleichen. Dafür muss er halt 10...100 mal so
flott sein.
Für meine 10 MHz wären das schon 100...1000 MHz.
Also Pentium & Co, nix µC.
- Denkste! DIL14 ist kleiner, als Pentium!
Kurt schrieb:> Klar, kann man 16-Bit-PWM machen, wenn man weiß, wie man so einen> µC zur Not in asm, oder C ansprechen kann. Dafür gibt es auch> Einsatzbereiche: Stimme mal einen 10 MHz-Generator mit einem GPS-PPM> über eine VariCap auf 0,1 Hz stabil ab... (0,01 ppm) Mit 13-Bit-PWM> (Tiny24) klappt das sehr gut.> Allerdings bin ich mir nicht sicher, ob das ohne den sauberen Überblick> bei asm-Programmierung (vielleicht auch noch in C) klappen könnte.> Bei (für den Nutzer) einfacherer Hochsprache muss ein Prozessor jede> suboptimal übersetzte Programmier-Strategie einfach durch den> Geschwindigkeitsvorteil ausgleichen. Dafür muss er halt 10...100 mal so> flott sein.> Für meine 10 MHz wären das schon 100...1000 MHz.> Also Pentium & Co, nix µC.>> Denkste! DIL14 ist kleiner, als Pentium!
Ich sehe jetzt wirklich keine Notwendigkeit Assembler zu benutzen, nur
weil man ein paar Register eines Timers beschreiben muss. Die
Signalerzeugung läuft doch komplett in HW und der Prozessor muss
höchstens mal ein neues Tadtverhältnis vorgeben. Wo da dein Faktor 10
bis 100 herkommen soll ist mir schleierhaft.
At32 schrieb:> Ich sehe jetzt wirklich keine Notwendigkeit Assembler zu benutzen, nur> weil man ein paar Register eines Timers beschreiben muss. Die> Signalerzeugung läuft doch komplett in HW und der Prozessor muss> höchstens mal ein neues Tadtverhältnis vorgeben. Wo da dein Faktor 10> bis 100 herkommen soll ist mir schleierhaft.
Reines Gelaber!
At32 schrieb:> Wo da dein Faktor 10> bis 100 herkommen soll ist mir schleierhaft.
Das sind so Leute, die vor 35 Jahren mal Assembler mit Basic verglichen
haben und glauben, dass sich daran bis heute nichts geändert habe.