mikrocontroller.net

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


Autor: Lukas B. (lukas-1992) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...
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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich möchte Am Port B 0 eine PWM

PortB0 ist kein PWM Ausgang.

Autor: Lukas B. (lukas-1992) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lukas B. (lukas-1992) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lukas B. (lukas-1992) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok.
Hab jetzt noch einiges nachgelesen und habe auch noch was im inet 
gefunden:
http://www.micro-examples.com/public/microex-navig...

denn Quellcode Habe ich großteils verstanden, aber mir ist nicht klar 
wie genau/ was genau das macht:
        PR2 = 0b01111100 ; // PWM-Frequenz einstellen ,berechnung??
        T2CON = 0b00000101 ; // Was macht das? Warum gibt es kein T1CON?
        CCP1CON = 0b00001100 ; // Habs im Datasheet gefunden mir ist allerdings nicht ganz klar was das ding macht
        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

Autor: Lukas B. (lukas-1992) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so hab jetzt die Lösung:
   /** I N C L U D E S **********************************************************/
#include <p18cxxx.h>
#include <pwm.h>
#include <timers.h>
#include <delays.h>                        // für die Warteschleife
 

/** Configuration ********************************************************/
#pragma config FOSC = HS   //CPU=20 MHz
#pragma config PWRT = ON
#pragma config BOR = OFF
#pragma config WDT = OFF  //Watchdog Timer
#pragma config LVP = OFF  //Low Voltage ICSP
 

/** D E C L A R A T I O N S **************************************************/
#pragma code


void main()
        {

        unsigned char   dc ;

        TRISC = 0 ;                     // setzt den P
        PORTC = 0 ;                     // clear PORT
/**
PWM_Periode = Tocs x 4 x TM2PS x (PR2+1) TOCS...SchwingPERIODE des Quarzes
//                                         TM2PS... Vorteiler
//PR2 = [ PWM_Periode / (4 x Tocs x TM2PS) ] -1

//Berechnung PR2 für 20MHz Quartz und PWM 1,5kHz und Teiler 1:16
//PR2 = (1 / 5k/(16* 1/ 20E6*4))-1 = 62



**/

        PR2 = 62 ;    // 62 aus berechnung
        T2CON =   0b00000110 ; /// Vorteiler 1:16 
        CCP1CON = 0b00001100 ; // Schaltet PWM ein bit 3 & 4
        CCP2CON = 0b00111100 ; // Schaltet PWM ein bit 3 & 4

        while(1==1)  //Endlosschleife                     
        {

                for(dc = 0 ; dc < PR2 ; dc++)
                        {
                        CCPR1L = dc ;
                        CCPR2L = dc ;
                        Delay10KTCYx(10);
                        }
                for(dc = PR2 ; dc > 0 ; dc--)
                        {
                        CCPR1L = dc ;
                        CCPR2L = dc ;
                        Delay10KTCYx(10);
                        }
         }

        }

Grüße Lukas

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.