Forum: Mikrocontroller und Digitale Elektronik Microchip C18 PWM (PIC18F4550)


von Lukas B. (lukas-1992) Benutzerseite


Lesenswert?

Hallo,
ich hätte eine Frage: Wie mach ich in MPLab und Microchip C18 einen Port 
zu einem PWM-Ausgang. Es gibt ja eine Include Datei namens pwm.h.
Leider weis ich nicht wie ich den Port "übergebe".
Steh voll auf dme Schlauch, und Ja ich habe Google und die 
Forum-Suchfunktion benutzt bin aber leider nicht fündig geworden.

Hab mir dieses File angesehen: 
http://w3.id.tue.nl/fileadmin/id/objects/E-Atelier/doc/Tutorials/PWM_FUNCTIONS_18F4550.pdf
leider finde ich keine Lösung für mein Problem.

Ich möchte Am Port B 0 eine PWM mit 1kHz und einem (vorerst) fixem Duty 
von 50% ausgeben. ICh verwende einen PIC 18F4550 und einen 20MHz Quartz.

Grüße Lukas

von holger (Gast)


Lesenswert?

>Ich möchte Am Port B 0 eine PWM

PortB0 ist kein PWM Ausgang.

von Lukas B. (lukas-1992) Benutzerseite


Lesenswert?

>>Ich möchte Am Port B 0 eine PWM
>
> PortB0 ist kein PWM Ausgang.

Ja stimmt hab mich im Datasheet nicht genau gelesen, aber der Port RB3 
müsste PWM-Fähig sein oder?  Datenblatt Seite 16

von Lukas B. (lukas-1992) Benutzerseite


Lesenswert?

pS: Hab noch nie etwas mit PWM gemacht, ich meine mit dem PIC, also 
bitte nicht übel nehmen wenn ich es net gleich schnall.

Grüße Lukas

von holger (Gast)


Lesenswert?

>Ja stimmt hab mich im Datasheet nicht genau gelesen, aber der Port RB3
>müsste PWM-Fähig sein oder?

Ist er. Aber siehe auch das hier:

assignment for CCP2 when CCP2MX Configuration bit is cleared.

von Lukas B. (lukas-1992) Benutzerseite


Lesenswert?

Ok.
Hab jetzt noch einiges nachgelesen und habe auch noch was im inet 
gefunden:
http://www.micro-examples.com/public/microex-navig/doc/097-pwm-calculator

denn Quellcode Habe ich großteils verstanden, aber mir ist nicht klar 
wie genau/ was genau das macht:
1
        PR2 = 0b01111100 ; // PWM-Frequenz einstellen ,berechnung??
2
        T2CON = 0b00000101 ; // Was macht das? Warum gibt es kein T1CON?
3
        CCP1CON = 0b00001100 ; // Habs im Datasheet gefunden mir ist allerdings nicht ganz klar was das ding macht
4
        CCP2CON = 0b00111100 ; // Habs im Datasheet gefunden mir ist allerdings nicht ganz klar was das ding macht, Die LEDs die Ich angeschlossen habe leuchten nicht in "Phase", warum auch immer...

Vielleicht kann mir jemand helfen und mir die Fragen beantworten.
Grüße Lukas

von Lukas B. (lukas-1992) Benutzerseite


Lesenswert?

so hab jetzt die Lösung:
1
   /** I N C L U D E S **********************************************************/
2
#include <p18cxxx.h>
3
#include <pwm.h>
4
#include <timers.h>
5
#include <delays.h>                        // für die Warteschleife
6
 
7
8
/** Configuration ********************************************************/
9
#pragma config FOSC = HS   //CPU=20 MHz
10
#pragma config PWRT = ON
11
#pragma config BOR = OFF
12
#pragma config WDT = OFF  //Watchdog Timer
13
#pragma config LVP = OFF  //Low Voltage ICSP
14
 
15
16
/** D E C L A R A T I O N S **************************************************/
17
#pragma code
18
19
20
void main()
21
        {
22
23
        unsigned char   dc ;
24
25
        TRISC = 0 ;                     // setzt den P
26
        PORTC = 0 ;                     // clear PORT
27
/**
28
PWM_Periode = Tocs x 4 x TM2PS x (PR2+1) TOCS...SchwingPERIODE des Quarzes
29
//                                         TM2PS... Vorteiler
30
//PR2 = [ PWM_Periode / (4 x Tocs x TM2PS) ] -1
31
32
//Berechnung PR2 für 20MHz Quartz und PWM 1,5kHz und Teiler 1:16
33
//PR2 = (1 / 5k/(16* 1/ 20E6*4))-1 = 62
34
35
36
37
**/
38
39
        PR2 = 62 ;    // 62 aus berechnung
40
        T2CON =   0b00000110 ; /// Vorteiler 1:16 
41
        CCP1CON = 0b00001100 ; // Schaltet PWM ein bit 3 & 4
42
        CCP2CON = 0b00111100 ; // Schaltet PWM ein bit 3 & 4
43
44
        while(1==1)  //Endlosschleife                     
45
        {
46
47
                for(dc = 0 ; dc < PR2 ; dc++)
48
                        {
49
                        CCPR1L = dc ;
50
                        CCPR2L = dc ;
51
                        Delay10KTCYx(10);
52
                        }
53
                for(dc = PR2 ; dc > 0 ; dc--)
54
                        {
55
                        CCPR1L = dc ;
56
                        CCPR2L = dc ;
57
                        Delay10KTCYx(10);
58
                        }
59
         }
60
61
        }

Grüße Lukas

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.