PWM-Frequenzwert vom PIC18 berechnen lassen

#3826658
Lesenswert?

Hallo,

Ich habe folgendes Problem:
Laut dem Datenblatt des PIC18F4520 lässt sich die PWM Periode so 
berechnen:
PWMPeriod = [(PR2)+1]•4•TOSC• (TMR2 Prescale Value)

Ich habe dann die Formel auf PRx= umgeformt, jedoch bekomme ich nun bei 
egal welchem Wert ich dieser Funktion übergebe immer eine PWM Frequenz 
von 490Hz.
Wenn ich den Wert allerdings selbst errechne und fix der Funktion 
OpenPWM1(); übergebe, bekomme ich das gewünschte Signal.
Meine Vermutung ist, dass die Rechnung aufgrund der Wertebereiche der 
verschiedenen Variablentypen nicht richtig funktioniert. Kann mir jemand 
diese Vermutung bestätigen und mir eine Lösung dazu vorschlagen? Danke!

Hier der Code:
1
#include <pic18f4520.h>
2
#include <plib.h>
3
#include <xc.h>
4
#include <pwm.h>
5

6
#pragma config OSC = INTIO67
7
#pragma config WDT = OFF
8
#pragma config LVP = OFF
9

10
#define DUTY_CYCLE  127
11
#define FOSC        8000000
12

13
unsigned char GetPRxValue(int frequency);
14
void Init();
15

16

17
void main(void)
18
{
19

20
    Init();
21

22
    while(1)
23
    {
24
        
25
    }
26
}
27

28
void Init()
29
{
30
    OSCCON=0x70;
31
    ADCON1=0x0F;
32

33
    TRISCbits.RC2 = 0;
34

35
    OpenTimer2(T0_PS_1_16);
36
    
37
    SetDCPWM1(DUTY_CYCLE);
38
    OpenPWM1(GetPRxValue(500));
39
}
40

41
unsigned char GetPRxValue(int frequency)
42
{
43
    unsigned char prescaler = 16;
44

45
    return (unsigned char)((1/frequency)/((1/FOSC)*prescaler*4))-1;
46
}

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