Forum: Mikrocontroller und Digitale Elektronik Frage zur PWM mit OCR1A als TOP-Wert


von M. G. (ixil96)


Lesenswert?

Hallo,

ich möchte eine PWM mit einer Frequenz von 1kHz und einem Duty Cycle von 
30% programmieren. Ich verwende einen AT90PWM316 mit 8MHz.

Als TOP-Value möchte ich OCR1A (Mode 15) verwenden.
Bei einem Prescaler von 8 brauche ich den Wert 999 für OCR1A als 
TOP-Value um eine PWM-Frequenz von 1kHz zu generieren.

Wie kann ich aber nun den compare match setzen, wenn ich OCR1A bereits 
als TOP-Value verwendet habe?

von Spess53 (Gast)


Lesenswert?

Hi

>Wie kann ich aber nun den compare match setzen, wenn ich OCR1A bereits
>als TOP-Value verwendet habe?

Mit OCR1B. Oder du nimmst Mode14. Dann ist ICR1 der Tp-Wert und OCR1A 
der Compare-Wert.

MfG spess

von M. G. (ixil96)


Lesenswert?

Danke!

Werde ich gleich probieren!

von M. G. (ixil96)


Lesenswert?

Hallo,

ich hab das jetzt versucht, erhalte aber am OC1B eine PWM mit 8Hz ?
Eigentlich sollten es 1kHz sein.

Hier der Code:
1
#include <avr/io.h>
2
3
int main(void)
4
{
5
  //DDRD  |= (1<<PD2);    // OC1A = output
6
  DDRC  |= (1<<PC1);    // OC1B = output
7
  
8
  OCR1A  = 1000;    // Top Value = 1000
9
  OCR1B  = 300;    // Compare Match bei 300
10
  TCCR1A  = (1 << COM1B1) + (1 << WGM11) +(1 << WGM10);                  // Clear OC1B on Compare Match
11
  TCCR1B  = (1 << WGM13) + (1 << WGM12) + (1 << WGM11) + (1 << WGM10) + (1 << CS11);    // Mode 15, Fast PWM, OCR1A = TOP, Prescaler = 8
12
  
13
  while(1)
14
  {
15
    asm ("NOP");  // Nichts tun
16
  }
17
}

von Spess53 (Gast)


Lesenswert?

Hi

Zumindest ein Fehler ist da drin:

>TCCR1A  = (1 << COM1B1) + (1 << WGM11) +(1 << WGM10)
                                               ^^^^^^
>TCCR1B  = (1 << WGM13) + (1 << WGM12) + (1 << WGM11) + (1 << WGM10) + (1 << 
CS11);

MfG Spess                                                        ^^^^^^

von Spess53 (Gast)


Lesenswert?

Hi

Noch mal richtig:

Zumindest ein Fehler ist da drin:

>TCCR1A  = (1 << COM1B1) + (1 << WGM11) +(1 << WGM10)
                                               ^^^^^^
>TCCR1B  = (1 << WGM13) + (1 << WGM12) + (1 << WGM11) + (1 << WGM10) + (1 << 
CS11);                                                        ^^^^^^

MfG Spess

von M. G. (ixil96)


Lesenswert?

Oh ja!

So, jetzt geht´s!
1
#include <avr/io.h>
2
3
int main(void)
4
{
5
  DDRC  |= (1<<PC1);    // OC1B = output
6
  
7
  OCR1A  = 1000;        // Top Value = 1000
8
  OCR1B  = 300;        // Compare Match bei 300
9
  TCCR1A  = (1 << COM1B1) + (1 << WGM11) +(1 << WGM10);    // Clear OC1B on Compare Match
10
  TCCR1B  = (1 << WGM13) + (1 << WGM12) + (1 << CS11);    // Mode 15, Fast PWM, OCR1A = TOP, Prescaler = 8
11
  
12
  while(1)
13
  {
14
    asm ("NOP");  // Nichts tun
15
  }
16
}

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.