Forum: Mikrocontroller und Digitale Elektronik Microchip dspic33ep PWM


von Swampy (Gast)


Lesenswert?

Hey Leute!

Ich nutze folgenden microchip: dsPIC33EP64GS504.

Habe heute mein Board vom Fertiger bekommen und wollte mal locker 
loslegen mit einem einfachen PWM output (PWM1H habe ich auch an einen 
Pin geroutet sodass ich ihn einfach überprüfen kann).

Ich habe mir schon gefühlte 10 Beispiele und 500 Datenblattseiten 
durchgelesen und bekomme einfach partout keinen PWM aufs Oszi... (GPIO 
geht aber!).

Ohnehin scheint der dsPIC33EP recht neu und es gibt wenige 
Tutorials/Examples...

Frage: Sind das High-Speed PWm Modul mit den dedizierten PWM1H/PWM1L, 
PWM2H/L etc und die output compare unit grundsätzlich equivalent oder 
das selbe oder wie ist das zu verstehen?

Außerdem: Muss ich wirklich jedes Register aus dem PWM Datenblatt 
deklarieren oder kann man sich da auch gut mal auf defaultwerte 
verlassen?

Das einzige was ich will ist ein PWM auf PWM1H mit 50% DC und 10 kHz... 
Kann doch nicht so schwer sein, oder?!

Ich bin sehr dankbar für jede Hilfe!
PS: Hab das erste mal mit nem PIC zu tun...

von PICjaner (Gast)


Lesenswert?

Hier findest du genaueres zum High-Speed PWM Module inkl. Beispiele:
http://ww1.microchip.com/downloads/en/DeviceDoc/70323C.pdf

Swampy schrieb:
> Außerdem: Muss ich wirklich jedes Register aus dem PWM Datenblatt
> deklarieren oder kann man sich da auch gut mal auf defaultwerte
> verlassen?
Die default werte sind im Datenbaltt angegeben, wenn du mit ihnen 
zufreiden bist, musst du die nicht noch mal zuweisen.

von Andreas H. (ahz)


Lesenswert?

Swampy schrieb:
> Außerdem: Muss ich wirklich jedes Register aus dem PWM Datenblatt
> deklarieren oder kann man sich da auch gut mal auf defaultwerte
> verlassen?
>
Ich kenne das nur von anderen PICs. Da stimmt es eigerntlich. Ich 
initialisiere sie aber trotzdem immer. Sicxher ist sicher ;-)

> Das einzige was ich will ist ein PWM auf PWM1H mit 50% DC und 10 kHz...
> Kann doch nicht so schwer sein, oder?!
>
> Ich bin sehr dankbar für jede Hilfe!
Die Locks für die Register hast Du disabled? (Die sind lt. DS per 
Default aktiv  (DS70005127B, Ch. 15.2.1).

> PS: Hab das erste mal mit nem PIC zu tun...
Aber nicht mit uP's allgemein, oder ?

Grüße
Andreas

von Swampy (Gast)


Lesenswert?

Danke für eure Antworten.

Naja nicht ganz das erste mal mit uC. Aber so gut wie. Hab davor nur 
Arduino und vor allem viel FPGA gemacht.

Okay ich werde mir mal das PDF anschauen. Danke!

von Swampy (Gast)


Lesenswert?

PICjaner schrieb:
> Hier findest du genaueres zum High-Speed PWM Module inkl.
> Beispiele:
> http://ww1.microchip.com/downloads/en/DeviceDoc/70323C.pdf
>
> Swampy schrieb:
>> Außerdem: Muss ich wirklich jedes Register aus dem PWM Datenblatt
>> deklarieren oder kann man sich da auch gut mal auf defaultwerte
>> verlassen?
> Die default werte sind im Datenbaltt angegeben, wenn du mit ihnen
> zufreiden bist, musst du die nicht noch mal zuweisen.

So PICjaner ich hab nun das Dokument (welches ich in leicht anderer 
Version schon kannte) komplett durch und hab mir jedes Example angeguckt 
und alles brav schritt für schritt durchgemacht. Hier mein code:
1
int main(int argc, char** argv) {
2
    
3
    
4
/* Configure Oscillator to operate the device at 40Mhz
5
     Fosc= Fin*M/(N1*N2), Fcy=Fosc/2
6
      Fosc= 7.37*(43)/(2*2)=80Mhz for Fosc, Fcy = 40Mhz */
7
8
  /* Configure PLL prescaler, PLL postscaler, PLL divisor */
9
  PLLFBD=41;         /* M = PLLFBD + 2 */
10
  CLKDIVbits.PLLPOST=0;   /* N1 = 2 */
11
  CLKDIVbits.PLLPRE=0;    /* N2 = 2 */
12
13
    __builtin_write_OSCCONH(0x01);      /* New Oscillator FRC w/ PLL */
14
    __builtin_write_OSCCONL(0x01);      /* Enable Switch */
15
      
16
  while(OSCCONbits.COSC != 0b001);    /* Wait for new Oscillator to become FRC w/ PLL */  
17
    while(OSCCONbits.LOCK != 1);      /* Wait for Pll to Lock */
18
19
  /* Now setup the ADC and PWM clock for 120MHz
20
     ((FRC * 16) / APSTSCLR ) = (7.37 * 16) / 1 = ~ 120MHz*/
21
22
  ACLKCONbits.FRCSEL = 1;          /* FRC provides input for Auxiliary PLL (x16) */
23
  ACLKCONbits.SELACLK = 1;        /* Auxiliary Oscillator provides clock source for PWM & ADC */
24
  ACLKCONbits.APSTSCLR = 7;        /* Divide Auxiliary clock by 1 */
25
  ACLKCONbits.ENAPLL = 1;          /* Enable Auxiliary PLL */
26
  
27
  while(ACLKCONbits.APLLCK != 1);      /* Wait for Auxiliary PLL to Lock */
28
    
29
    
30
  PWMCON1bits.CAM = 0;
31
    PWMCON1bits.ITB = 0; 
32
    PTPER = 1204;
33
    PWMCON1bits.MDCS = 0;
34
    PDC1 = 800;
35
    PWMCON1bits.DTC = 0;
36
    DTR1 = 50;
37
    PHASE1= 0;
38
    IOCON1bits.PMOD = 3; 
39
    
40
    IOCON1bits.PENH = 1;
41
    IOCON1bits.PENL = 1;
42
    IOCON1bits.POLH = 0;
43
    IOCON1bits.POLL = 0;
44
    
45
    TRISA=0;
46
    LATA =0;
47
    PTCONbits.EIPU = 1;
48
    PTCONbits.PTEN = 1;
49
50
return(0);
51
}

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.