2 PWMs AVR Atmega16 (OCR1A,OCR1B)

OP #2604397
Lesenswert?
• ▲
▼
Hallo,

Ich habe ein Problem. Ich brauche 2 PWMs um ein Magnetventil 
anzusteuern. So sieht meine Inizialisierung aus:

DDRD=1<<PD4|1<<PD5;  // PWM Pins auf Ausgang

TIMSK=1<<OCIE1A|1<<OCIE1B;

TCCR1A=1<<WGM11|1<<WGM10|1<<COM1A1|1<<COM1B1;
TCCR1B=1<<WGM13|1<<WGM12|1<<CS10;

// Pins: OC1A 0 wenn TCNT1 = OCR1A, OC1B 0 wenn TCNT1 = OCR1B, Fast PWM, 
Clock kein Vorteiler

volatile unsigned char pwmA=75;
volatile unsigned char pwmB=75;

main{
      while(1)
      {
          XXX

          OCR1A=pwmA;
    OCR1B=pwmB;
      }
    }

xxx steht für den restlichen Code der für das Problem aber nicht so 
wichtig ist, da dort nur die Werte von pwmA und B verändert werden.

Ich habe es schon 10 mal überprüft und finde den Fehler nicht, hier im 
Forum konnte ich auch nichts konkretes finden. Der µC den ich verwende 
ist der Atmega16. Ich hoffe Ihr könnt mir helfen. (:
Gast #2604505
Lesenswert?
• ▲
▼
Hi

>Wie meinst du als TOP benutzt?

Du hast PWM-Mode 15 eingestellt. Damit läuft der Timer bis er OCR1A 
(Top) erreicht und fängt bei Null wieder an. OC1A ist damit nicht für 
PWM nutzbar. Entweder du nimmst einen PWM-Mode mit festem Top oder Mode 
14 mit ICR1 als Top. Das Register muss natürlich initialisiert werden.

MfG Spess
OP #2604531
Lesenswert?
• ▲
▼
habe den fehler gefunden, hier nun der fertige programmcode als lösung:

#include <avr/io.h>

#define XTAL    16000000L

int main(void)
{
    // OC1A (PD5) und OC1B (PD4) auf Ausgang setzen
    DDRD |= 1<<(PD5) | 1<<(PD4);
    // Clock kein Vorteiler, 8 bit fast pwm
    // Pins: OC1A/OC1B = 0 wenn TCNT1=OCR1A/B
    TCCR1A =  1<<(WGM10) | 1<<(COM1A1) | 1<<(COM1B1);
    TCCR1B = 1<<(CS10) | 1<<(WGM12);

  volatile unsigned int pwmA=75;
  volatile unsigned int pwmB=75;
  volatile unsigned int input=0;

    for (;;)
    {
  OCR1AL=pwmA;
  OCR1BL=pwmB;
    }
}
Gast #2604604
Lesenswert?
• ▲
▼
Hi

>habe den fehler gefunden, hier nun der fertige programmcode als lösung:

Nicht ganz.

>    for (;;)
>    {
>  OCR1AL=pwmA;
>  OCR1BL=pwmB;
>    }

Es ist nicht sinnvoll, die OC-Register ständig mit Werten zu 
bombardieren. Die weder eh beim Erreichen von Top aktualisiert.

MfG Spess
#2604613
Lesenswert?
• ▲
▼
Raphael Tschernitz schrieb:
> habe den fehler gefunden, hier nun der fertige programmcode als lösung:

Wenn du wüsstest, wie oft diese Fragestellung hier auftaucht.
Und dabei ist das so einfach, wenn man erst mal verstanden hat wie PWM 
funktioniert und wie das Zusammenspiel der einzelnen Timer-Register in 
den einzelnen Timer-Modi ist. Im Datenblatt hat Atmel bei der Auflistung 
der Timer-Modi sogar die wesentlichen Register dazugeschrieben und 
trotzdem taucht genau diese Frage in schöner Regelmässigkeit immer 
wieder auf.


PS:  1<<(CS10)
interessante kreative Klammernsetzung

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.