Forum: Mikrocontroller und Digitale Elektronik PWM-Frequenzwert vom PIC18 berechnen lassen


von Markus B. (pspracers)


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
}

von Mike (Gast)


Lesenswert?

Markus B. schrieb:
> unsigned char GetPRxValue(int frequency)
> ...
> (1/frequency)

Was erwartest du, wenn du die Integerzahl 1 mit einer Integeroperation 
durch die Integerzahl frequency teilst, als Ergebnis?

Das muss doch wohl schief gehen.

von Markus B. (pspracers)


Lesenswert?

Danke! Hat sich somit geklärt ;)

return (unsigned char)((1.0/frequency)/((1.0/FOSC)*prescaler*4))-1;

von Max H. (hartl192)


Lesenswert?

Ich würde das aber nicht von einer Funktion sondern vom Präprozessor 
berechnen lassen, spart Zeit und vllt. auch die Float Funktionen.
Oder wenn es mehr als nur ein Wert, aber nicht allzu viele, könnte man 
eine Look Up Table anlegen.

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.