- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 15

Thema: AtMega32 PWM 1x 16Bit

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo Dominik,
    schau dir mal die Tabelle der Modi von Timer1 im Datenblatt des M32 auf S. 109 an. Die Modi 1-3 kannst du in Bascom direkt über den Config Timer1 Befehl erzeugen. Um 16-bit Auflösung zu bekommen, musst du die anderen PWM Modi verwenden.
    Dazu setzt du die Bits WGM13..0 in den Registern TCCR1A und B entsprechend der Werte in der Tabelle.
    Wenn ICR1 als Top Wert in der Tabelle steht, kannst du über ihn den Max Wert setzen und über Compare1A (OCR1A) und Compare1B (OCR1B) die Duty Cycle.
    Wenn OCR1A als Top Wert angegeben ist, setzt du ihn auf den max-Wert und OCR1B auf den Umschaltpunkt.
    Also z.B. Mode 8:
    TCCR1B.WGM13=1
    TCCR1B.WGM12=0
    TCCR1A.WGM11=0
    TCCR1A.WGM10=0
    ICR1=65535
    OCR1A = 6553
    16 bit Auflösung, 10 DC.
    Frequenz ergibt sich dann aus _XTAL/Prescale/65536

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.12.2008
    Ort
    Köln
    Beiträge
    460
    Vielen dank für die Hilfe, das Forum hier ist wirklich Super!

    Also den kann ich's.b. Modus 8 oder Modus 10 benutzen.
    stelle ich den mit dem letzen Code hier von for_ro nur Timer 1 ein oder auch andere?

    Das ich mit wgm10-13 den timermodus einstellen kann hab ich jetzt verstanden. Das mit icr1 hab ich auch verstanden, nur das mit ocr1a hab ich nicht verstanden. Bei Modus 8 und 10 brauche ich den doch garnicht, oder?
    Und was genau ist Duty Cycle?

    Viele Grüße und nochmal vielen dank für eure mühe
    Dominik

  3. #3
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    35
    Beiträge
    3.501
    Blog-Einträge
    9
    Der Code ist nur für Timer1. Für andere Timer hast du andere Registeradressen.
    Der Duty Cycle ist das Puls-Pausen Verhältnis der PWM:

    http://de.wikipedia.org/wiki/Tastgrad

    Der Timer1 hat 2 PWM Kanäle bzw. Ausgänge, Pin 18 D4 -> OC1B und Pin 19 D5 -> OC1A.
    Mit den Registern ocr1a und ocr1b stellst du die PWM der beiden Pins ein.
    Du hast als einen Timer mit zwei (!) unabhängigen PWM Modulen.
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.12.2008
    Ort
    Köln
    Beiträge
    460
    Also ist Duty Cycle eigentlich der PWM wert den ich dann einstelle?

    Es funktioniert leider nicht so toll. Ich möchte Timer 1 auf Modus 10 Schalten (der ist ja gleich zum normalen Modus von Timer 1 bei PWM).

    Daher hab ich folgendes eingestellt:

    Code:
    $regfile = "m32def.dat"  $framesize = 32  $swstack = 32  $hwstack = 32  $crystal = 16000000                            $baud = 9600 
    Config Pind.4 = Output 
    Config Pind.5 = Output
    
    Config Timer1 = Pwm
    TCCR1B.WGM13=1
    TCCR1B.WGM12=0
    TCCR1A.WGM11=1
    TCCR1A.WGM10=0
    ICR1H= 65535
    ICR1L = 65535
    OCR1A = 10000
    
    Do
    
    Pwm1a = 10000 
    wait 1
    Pwm1a = 20000 
    wait 1
    Pwm1a = 30000
    wait 1
    Pwm1a = 40000 
    wait 1
    Pwm1a = 50000 
    wait 1
    Pwm1a = 60000 
    wait 1
    
    loop
    
    End 
    Es funktioniert nicht und ich bekomme in der Zeile " TCCR1B.WGM13=1 " immer 2 Fehler. Wenn ich Sie lösche sind die selben fehlermeldungen in der nächsten Zeile.

    Ich hoffe ihr könnt mir helfen, ich bin nämlich langsam am verzeweifeln.

    Gruß Dominik

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Leider wieder so eine kleine Gemeinheit der Bascom Entwickler. Die Bits heißen beim M32 im Dat-File anders:
    ;TCCR1A
    COM1A1 =7
    COM1A0 =6
    COM1B1 =5
    COM1B0 =4
    FOC1A =3
    FOC1B =2
    PWM11 =1 '=WGM11
    PWM10 =0 '=WGM10

    ;TCCR1B
    ICNC1 =7
    ICES1 =6
    CTC11 =4 '=WGM13
    CTC10 =3 '=WGM12
    CTC1 =3 ; Obsolete - Included for backward compatibility
    CS12 =2
    CS11 =1
    CS10 =0

    Oder du definierst die dir selber:
    Const WGM13 = 4 '4 ist hier wieder die Bitnummer im Register TCCR1B
    Const WGM12 = 3
    Const WGM11 = 1
    Const WGM10 = 0

    Du kannst auch direkt ICR1 setzen:
    ICR1=65535

    ICR1H und L sind Byte Werte, denen kannst du auch nur bis 255 zuweisen.
    PWM1A ist dasselbe wie OCR1A

  6. #6
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    35
    Beiträge
    3.501
    Blog-Einträge
    9
    Zitat Zitat von Dominik009 Beitrag anzeigen
    Also ist Duty Cycle eigentlich der PWM wert den ich dann einstelle?
    Genau.
    Bei einer PULSWEITENmodulation änderst du (wie der Name es schon sagt ) die Pulsweite, sprich das Puls-Pausen Verhältnis.
    Dadurch ergeben sich unterschiedliche Effektivwerte der Spannung.
    Und wie for_ro es schon gesagt hat, der Mega32 ist ein 8-Bit Mikrocontroller, d.h. alle Register sind in der Regel 8-Bit groß.
    Bei manchen Funktionen werden bestimmte Register zu einem "Paket" zusammen gefasst (wie es bei ICR1 der Fall ist, oder beim Timer1 Zählregister). Beschrieben werden die Register dann trotzdem in zwei Schritten, von daher macht es kaum einen Unterschied ob du nun den 16-Bit Wert in das Paket schreibst oder beide Register einzeln (klar könnte man sagen, dass du nur das Low Register ändern musst wenn du den Wert änderst und nicht das komplette Register....aber das sollte für dich erst mal egal sein).
    Einen Integerwert kannst du dann so aufteilen (Bascom Hilfe....Funktionen High() und Low()):

    Code:
    Dim I As Integer , Z As Byte
    I = &H1001
    Z = High(i)                                                 ' is 10 hex or 16 decEnd
    Geändert von Kampi (19.08.2013 um 06:28 Uhr)
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.12.2008
    Ort
    Köln
    Beiträge
    460
    Danke für eure Hilfe, leider funktioniert es immer noch nicht.
    Könnt ihr mir vieleicht sagen was ich falsch mache, oder den code korrigieren? Ein Fehler wird bei "ICR1=65535
    " angezeigt. Wenn ich es in ICR1H und ICR1L aufteile hab ich den fehler nicht, aber ich hab keine Ahnung wie ich die einzeln Zuweise. Ich kan so ja max. 255 zuweisen, da es 2 8-Bit Werte sind, aber ich brauch ja 65535.

    Ich glaube generell das der Code eh ziemlich falsch ist, vieleicht könntet ihr ja mal drüberschauen. Ich verzweifel nämlich langsam!


    Code:
    $regfile = "m32def.dat" 
    $framesize = 32 
    $swstack = 32 
    $hwstack = 32 
    $crystal = 16000000                           
    $baud = 9600 
    Const WGM13 = 4                  '4 ist hier wieder die Bitnummer im Register TCCR1B
    Const WGM12 = 3
    Const WGM11 = 1
    Const WGM10 = 0
    Config Pind.4 = Output
    Config Pind.5 = Output
    Config Timer1 = Pwm
    TCCR1B.WGM13=1
    TCCR1B.WGM12=0
    TCCR1A.WGM11=1
    TCCR1A.WGM10=0 
    ICR1= 65535 
    
    Do
    Pwm1a = 10000 
    wait 1
    Pwm1a = 20000 
    wait 1
    Pwm1a = 30000
    wait 1
    Pwm1a = 40000 
    wait 1
    Pwm1a = 50000 
    wait 1
    Pwm1a = 60000
    wait 1
    
    loop
    
    End
    Ich hoffe ihr könnt mir weiterhelfen

    Viele Grüße
    Dominik

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo Dominik,
    das Setzen von ICR 1 sollte eigentlich funktionieren, evtl. steht die Adresse des Registers nicht im Dat-File des M32.
    Wenn du es mit separaten H und L machst und auf 65535 kommen willst, dann so wie Sauerbruch es oben geschrieben hat.

    Dein Timer läuft noch nicht, weil du keinen Prescale angegeben hast.
    Wenn du Ausgänge schalten willst, musst du dies auch konfigurieren, etwa so:
    Config Timer1 = PWM, Prescale = 1, Compare_A_PWM = Clear_Up

Ähnliche Themen

  1. 16Bit Software PWM XMEGA
    Von Thalhammer im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 07.02.2013, 22:17
  2. AVR mit 4 16Bit-Pwm
    Von Che Guevara im Forum AVR Hardwarethemen
    Antworten: 5
    Letzter Beitrag: 15.07.2011, 14:51
  3. 2x 16bit PWM ATMega32 @16MHz
    Von deko im Forum C - Programmierung (GCC u.a.)
    Antworten: 10
    Letzter Beitrag: 24.05.2011, 19:11
  4. ATMEGA64 PWM Mode 16bit
    Von Franz_vm im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 16.05.2007, 13:26
  5. ATmega 16Bit PWM?
    Von cshansolo im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 13.09.2005, 13:11

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen