Forum: Mikrocontroller und Digitale Elektronik 18F45K22: EPWM1 konfigurieren


von Markus B. (pspracers)


Lesenswert?

Hallo,

Ich versuche das EPWM1 Modul eines PIC18F45K22 zu initialisieren.
Ich verwende dazu den XC8 Compiler.
Ich benötige ein Rechtecksignal dessen Frequenz ich zur Laufzeit 
verändern möchte.
Folgende Probleme habe ich dabei:
PWM period:
Ich weiß leider nicht wie ich die PWM Periode berechnen soll, laut 
Datenblatt sollte man sie so berechnen:

PWMPeriod = ((PRx+1)*4)*TOSC * (TMRx Prescale Value)

Als Startfrequenz möchte ich 77kHz einstellen. Mit dieser Formel bekomme 
ich allerdings nur Wert ich µ-Bereich für die PWM Periode(sollte ein 
char-Wert sein)(PRx = 207)

-----------
PWM_MODE_1
PWM_MODE_2
...

Diese Parameter brauche ich bei der Ausgabeinitialisierung, allerdings 
habe ich dazu keine Informationen gefunden. Was beschreiben diese 
verschiedenen Modi genau?

Hier der Code für meine Problemstellungen:
1
#pragma config FOSC = INTIO67
2
#pragma config PLLCFG = ON
3
#pragma config WDTEN = OFF
4
#pragma config LVP = OFF
5
6
#define DUTY_CYCLE  511
7
8
9
void main(void)
10
{
11
    
12
13
}
14
15
void Init()
16
{   
17
    TRISCbits.RC3 = 0;
18
    
19
    //Init Timer0: Interrupt off, 8 bit, internal source, Prescaler 1:1
20
    OpenTimer0(TIMER_INT_OFF &  T0_8BIT & T0_SOURCE_INT & T0_PS_1_1); 
21
    
22
    
23
    SetOutputEPWM1(SINGLE_OUT,PWM_MODE_1);
24
    //Init EPWM1 Module: period = 1/77kHz?!, Select timer 1
25
    OpenEPWM1(period?!,ECCP_1_SEL_TMR12);
26
    //Set EPWM1 ratio to 1:1
27
    SetDCEPWM1(DUTY_CYCLE); 
28
29
}

Vielen Dank!
LG Markus

von Max H. (hartl192)


Lesenswert?

Markus B. schrieb:
> Ich weiß leider nicht wie ich die PWM Periode berechnen soll, laut
> Datenblatt sollte man sie so berechnen:
>
> PWMPeriod = ((PRx+1)*4)*TOSC * (TMRx Prescale Value)
und diesen Wert dann in die Formel einsetzen und nach PRx auflösen.

> PWM_MODE_1
> PWM_MODE_2
> ...
>
> Diese Parameter brauche ich bei der Ausgabeinitialisierung, allerdings
> habe ich dazu keine Informationen gefunden. Was beschreiben diese
> verschiedenen Modi genau?
PWM_MODE_x beinhalten die Werte für die untersten 2 bits des CCPxCON 
Registers und sind so definiert:
1
#define PWM_MODE_1     0b11111100 /* PxA,PxC active high, PxB,PxD active high */
2
#define PWM_MODE_2     0b11111101 /* PxA,PxC active high, PxB,PxD active low */
3
#define PWM_MODE_3     0b11111110 /* PxA,PxC active low, PxB,PxD active high */
4
#define PWM_MODE_4     0b11111111 /* PxA,PxC active low, PxB,PxD active low */

BTW:
>> Forum: Projekte & Code
>> Hier könnt ihr eure Projekte, Schaltungen oder Codeschnipsel vorstellen
>> und diskutieren. Bitte hier keine Fragen posten!

von Markus B. (pspracers)


Lesenswert?

Hallo Max,

Danke für die Hilfe!

Die Formel ist mir schon klar, wenn ich so nach PRx löse kommt auch ~207 
heraus, was sich mit einem 8 Bit Timer auch noch gut ausgeht, allerdings 
interessiert mich der Wert für "period" bei 
OpenEPWM1(period,ECCP_1_SEL_TMR12);
PRx ist ja das Vergleichsregister des Timers und ich schätze ich muss 
hier nicht die 207 einsetzten^^ 12,98µs kann ich hier auch nicht 
einsetzen ;D

Max H. schrieb:
> PWM_MODE_x beinhalten die Werte für die untersten 2 bits des CCPxCON
> Registers und sind so definiert:#define PWM_MODE_1     0b11111100 /*
> PxA,PxC active high, PxB,PxD active high */
> #define PWM_MODE_2     0b11111101 /* PxA,PxC active high, PxB,PxD active
> low */
> #define PWM_MODE_3     0b11111110 /* PxA,PxC active low, PxB,PxD active
> high */
> #define PWM_MODE_4     0b11111111 /* PxA,PxC active low, PxB,PxD active
> low */

Danke! :)

Sry fürs posten im falschen Forum, ich werds nächstes mal beachten! :)

von Max H. (hartl192)


Lesenswert?

Ich habe mir die OpenEPWM1 angesehen: Der Übergabewert Period wird ins 
PRx Register geschrieben.

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.