Forum: Mikrocontroller und Digitale Elektronik Atmega32 16Bit PWM oder 10 Bit?


von KArl Fred M. (Gast)


Lesenswert?

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?
1
unsigned txt;
2
3
void main(){
4
5
  DDRA = 0x00;
6
  DDRB = 0xFF;
7
  DDRC = 0xFF;
8
  DDRD = 0xFF;
9
10
  ADC_Init();
11
  Lcd_Init();
12
  //PWM1_Init(_PWM1_FAST_MODE, _PWM1_PRESCALER_1, _PWM1_NON_INVERTED, 255);
13
  PWM16bit_Init(_PWM16_FAST_MODE_10BIT, _PWM16_PRESCALER_16bit_1, _PWM16_non_INVERTED, 1023, 1);
14
15
  do {
16
  PWM16bit_Start(_TIMER1 );
17
      PWM16bit_Change_Duty(ADC_Read(0), _TIMER1_CH_A);           // Set incremented duty
18
     // PWM1_Set_Duty(255);
19
20
     // PWM1_Set_Duty(ADC_Read(0));
21
     IntToStr(ADC_Read(0), txt);  // txt is " -4220" (one blank here)
22
     Lcd_Cmd(_LCD_CLEAR);
23
     Lcd_Out(1, 3, txt);
24
    //  PortD = ~PortD;
25
      delay_ms(50);
26
27
  } while(1);                       // Endless loop
28
29
  }

von Stefan F. (Gast)


Lesenswert?

Schau dir mal die Parameter an, mit denen du die Funktion 
PWM16bit_Init() aufgerufen hast.

> _PWM16_FAST_MODE_10BIT
> 1023

von KArl Fred M. (Gast)


Lesenswert?

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.

von KArl Fred M. (Gast)


Lesenswert?

1
PWM16bit_Set_Duty
2
Prototype procedure PWM16bit_Set_Duty(duty : word; channel : byte);
3
 
4
Returns Nothing.
5
 
6
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 : 
9
PWM, Phase Correct, 8 bit 0x00FF TOP BOTTOM 
10
PWM, Phase Correct, 9 bit 0x01FF TOP BOTTOM 
11
PWM, Phase Correct, 10 bit 0x03FF TOP BOTTOM 
12
Fast PWM, 8 bit 0x00FF TOP TOP 
13
Fast PWM, 9 bit 0x01FF TOP TOP 
14
Fast PWM, 10 bit 0x03FF TOP TOP

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

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?

: Bearbeitet durch Moderator
von KArl Fred M. (Gast)


Lesenswert?

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?"

von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?


von KArl Fred M. (Gast)


Lesenswert?

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:-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

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

: Bearbeitet durch Moderator
von Falk B. (falk)


Lesenswert?

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.

von KArl Fred M. (Gast)


Lesenswert?

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

von KArl Fred M. (Gast)


Lesenswert?

ich werde mir das mi dem direkten Zugriff mal ansehen, wenn alles 
drumherum erstmal läuft.
Dann lebe ich erstmal mit den 10 Bit

von c-hater (Gast)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

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!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

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.

Beitrag #7134659 wurde von einem Moderator gelöscht.
Beitrag #7134669 wurde von einem Moderator gelöscht.
von Stefan F. (Gast)


Lesenswert?

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.

von KArl Fred M. (Gast)


Lesenswert?

jep :-(

von c-hater (Gast)


Lesenswert?

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.

: Wiederhergestellt durch Moderator
von KArl Fred M. (Gast)


Lesenswert?

"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

von Stefan F. (Gast)


Lesenswert?

c-hater schrieb:
> Mein Gott, lies' halt einfach den Code der LIB

Wie denn?

Auf die Idee kamen vor dir sicher mindestens schon 5 andere Leute.

Beitrag #7134700 wurde von einem Moderator gelöscht.
Beitrag #7134714 wurde von einem Moderator gelöscht.
Beitrag #7134731 wurde von einem Moderator gelöscht.
Beitrag #7134734 wurde von einem Moderator gelöscht.
Beitrag #7134740 wurde von einem Moderator gelöscht.
von Kurt (Gast)


Lesenswert?

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!

von At32 (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

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!

von Stefan F. (Gast)


Lesenswert?

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.

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.