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 | }
|