Frage zur PWM mit OCR1A als TOP-Wert

OP #3068857
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?
Gast #3068871
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
OP #3068972
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
}
Gast #3068985
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                                                        ^^^^^^
Gast #3068989
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
OP #3068995
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren