2 PWM-Grundsignale (Ausgänge) mit ATmega32 (C)

Gast #3276949
Morgen zusammen,

ich möchte mit dem Atmel ATmega32 zwei PWM-Grundsignale mit einer 
Frequenz von 25Hz an den Pins PD4 & PD5 (OC1A & OC1B) ausgeben. Hierzu 
möchte ich den internen Timer/Counter1 verwenden, indem ich ICR1 als 
TOP-Wert festlege. Als Vergleichswert stehen die Register OCR1A & OCR1B 
zur Verfügung. Das TCNT1 Register wird meines Erachtens nach nicht für 
die Initialisierung benötigt.

Das Programm funktioniert halbwegs, da mir das PWM-Grundsignal von 25Hz 
nur an einem Ausgang (OC1A / PD5) vorliegt. Meine Wenigkeit hat schon 
alles Mögliche versucht, um diesen Fehler zu beheben, z.B. die 
PWM-Betriebsart geändert, jedoch blieb der Erfolg bislang aus.

Damit ihr mein Problem nachvollziehen könnt, folgt hier jetzt der 
komplette Programmtext:
1
#include  <avr/io.h>
2
#define    F_CPU 16000000UL
3

4
/*  Initialisierung des 16-Bit Timer1
5
  - 9-Bit PWM-Mode
6
  - Fast-PWM
7
  - Vorteiler von 1024 --> 15,625 kHz
8
  - schreibe 625 ins Vergleichsregister --> 25 Hz
9
  - Zählwerte für OCR1A & OCR1B festlegen
10
  - PWM-Art bestimmen
11
  - OC1A & OC1B sind Ausgänge
12
*/
13
  void timer_init (){
14

15
    TCCR1A |= (1<<WGM11)| (0<<WGM10);      // 9-Bit PWM-Betriebsart
16
    TCCR1B |= (1<<WGM13) | (1<<WGM12);      // Fast-PWM    
17
    TCCR1B |= (1<<CS10) | (1<<CS12);      // Vorteiler von 1024 --> 15,625kHz
18
    ICR1 |= 625;                // zähle bis 625 --> 25Hz
19
    OCR1A |= 312;                // PWM an OC1A mit 50% Duty-Cycle
20
    OCR1B |= 156;                // PWM an OC1B mit 25% Duty-Cycle
21
    TCCR1A |= (1<<COM1A1) | (1<<COM1A0);    // Zählbeginn & invertierende PWM
22
    DDRD = (1<<PD5) | (1<<PD4);          // OC1A & OC1B als Ausgänge definieren
23
   }
24

25
  int main (void) {
26
    timer_init ();                // Initialisierung des Timers
27
    while (1);                  // Schleife
28
  }

Könnt ihr vielleicht einen Fehler ausmachen?

Falls es Probleme mit dem Verständnis meines Problems gibt, fragt mich 
einfach.

Ich bin euch für jede Hilfe sehr dankbar.

Gruß
C_Anfänger
Gast
>> TCCR1B |= (1<<CS10) | (1<<CS12);      // Vorteiler von 1024 -->
>> 15,625kHz
> Das würde ich übrigens ans Ende setzen, weil damit der Zähler losläuft.

Ist das so?
Ich habe von einem Freund, der C-Erfahrung hat, gehört, dass der Zähler 
mit dem beschreiben des Registers TCCR1A losläuft.

Die COM1Bx Bits habe ich mit hinzugefügt & den ATmega32 programmiert. 
Ich erhalte jetzt an beiden Ausgängen die gewünschten PWM-Signale.

Vielen Dank dafür
C_Anfänger
Gast
C_Anfänger schrieb:
> Ist das so?

Der Zähler fängt mit dem Setzen seines Taktes an zu zählen.
Mit dem COM-Bits schaltest Du nur die Pins dazu.

Die 1. Periode passt dann einfach nicht.
Ein Fehler den man sicher vernachlässigen kann, aber immer noch ein 
Fehler der auftritt.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.