-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: PWM --> Pic

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.01.2008
    Beiträge
    155

    PWM --> Pic

    Anzeige

    hey leute,

    habe ien frage und zwar kann mir jemand eine url posten. Wo erklärt bekommt wie die Pwm bei Pics programmeiren kann.
    Habe es bei spurt nicht so ganz kapiert,
    oder wenn jemand von euch eine fertigen Programme code hat und mir den posten kann, wäre es auch nciht shclecht. Müsste nur wissen was ich dann da ändenr müsste

  2. #2
    c oder Assembler

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.01.2008
    Beiträge
    155
    in assembler bitte

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065
    Ok, Prinzipell läufts immer gleich ab:
    Erst initialisieren, dann nutzen.

    Das PWM-Modul hat einige SpecialFunctionRegisters, mit denen es benutzt wird. Ich zeig das mal am PIC16F876a.

    Da wäre einmal der Timer2, er stellt den Takt für die PWM-Erzeugung bereit.

    CCP1CON ist das Controll Register. Es besteht aus den Wahlschaltern für die Modulfunktion (kann ja auch zb Pulse vermessen), und den zwei kleinsten Bit, da wir hier ein 10Bit PWM haben.
    Am besten schreibst du für PWM 0x0F in CCP1CON, also die untersten 4 Bit =1. Du müsstest nur Bit 2 und 3 auf 1 setzen, da Bit 0 und 1 ja X, also unwichtig sind, um PWM zu erreichen.

    Ausserdem schreibst du in das PR2 Register. Hier wird die Periodendauer des Signals angegeben, dh, wieviel Zeit vergeht, bis das PWM-Signal wieder von neuem beginnt. Im Datenblatt steht dazu eine Formel.
    Die Periodendauer hängt ab von: Dem Wert in PR2, dem Prescaler (Vorteiler) von Timer2 und dem Oszillatortakt an Timer2, meist die Frequenz des externen Quarz.
    Ich benutze immer eine kleine Excel Datei um alle Werte einzutragen. Dann kann man solange probieren, bis man genau hat, was man will. Natürlich kannst du auch zu Fuß rechnen.

    Danach kommt das Einschaltverhältnis, oder Duty-Cycle dran. Im Register CCPR1L kannst du einen Wert von 0-255 reinschreiben. Damit hast du 256 Stufen, du kannst noch die Bits 4 und 5 von CPP1CON nutzen, um auf 1024 Stufen Auflösung zu kommen. Meist habe ich es nicht gebraucht.
    Noch was zur Auflösung: Die ändert sich mit dem Prescaler von Timer2, du kannst also nicht unbedingt alle 10bit nutzen. Ich verweise nur auf die Formel im Datenblatt.

    Wichtig: Der CCP1 oder CCP2 Pin, ist nur mit dem Modul verbunden, wenn er über das TRIS Register auf Ausgang geschaltet ist, sonst bekommst du kein PWM Signal, sondern nur High oder Low Pegel, je nach Beschaltung.

    Ok, der Ablauf ist folgendermaßen:
    Zuerst PR2 wie gewollt einstellen,
    Dann das Einschaltverhältnis in CCPR1L schreiben,
    Den CCP Pin mit TRIS auf Ausgang stellen,
    Den Timer2 Vorteiler einstellen und Timer2 anschalten,
    Zum Schluss den 0x0F in das CCP1CON Register schreiben.

    Hier ein Beispielcode von mir, er soll ein Signal mit 38kHz liefern, das ungefähr 25% Einschaltdauer hat und am Pin wahlweise ausgegeben wird.


    Code:
    ;PWM INIT
    	BANKSEL PR2		;PWM auf 38kHz, DutyCycle 0,25
    	MOVLW 	D'78'
    	MOVWF 	PR2
    	BANKSEL CCPR1L
    	MOVLW 	D'20'	
    	MOVWF 	CCPR1L
    	BANKSEL T2CON
    	MOVLW	 D'4'
    	MOVWF 	T2CON
    	BANKSEL TMR2
    	CLRF 	TMR2
    	BANKSEL CCP1CON 
    	MOVLW 	0x0F
    	MOVWF 	CCP1CON
    
    ;In der Anwendung Signal einschalten: 
    	BANKSEL TRISC
    	BCF 	TRISC,2
    ;Ausschalten
            BANKSEL TRISC
    	BSF 	TRISC,2

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.01.2008
    Beiträge
    155
    ja wollte das mit dem pic 16f877a machen

    aber danke =) werde es morgen mal direkt ausprobieren=) danke sehr

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065
    Der Pic 16F877A ist genau der gleiche, wie der 876A, hat nur einen Port mehr. Dh du musst nur schauen, ob der CCP1 Pin anders liegt. Was der Banksel Befehl bzw das Macro macht, weißt du?

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.01.2008
    Beiträge
    155
    also habe dies jetzt mal für 9.5 kz gemacht


    ;PWM INIT
    BANKSEL PR2 ;PWM auf 9.5 kHz, DutyCycle 0,25
    MOVLW D'20'
    MOVWF PR2
    BANKSEL CCPR1L
    MOVLW D'5'
    MOVWF CCPR1L
    BANKSEL T2CON
    MOVLW D'1'
    MOVWF T2CON
    BANKSEL TMR2
    CLRF TMR2
    BANKSEL CCP1CON
    MOVLW 0x0F
    MOVWF CCP1CON

    ;In der Anwendung Signal einschalten:
    BANKSEL TRISC
    BCF TRISB,1 ; Pin auswahl für die PWm
    ;Ausschalten
    BANKSEL TRISC
    BSF TRISB,1


    müsste doch so stimmen oder?
    ccp1 i ist auf bank 1
    siehe --> http://ww1.microchip.com/downloads/e...Doc/39582b.pdf

    und im initialisierungsbereich einfach ccp1con, CCPR1L etc. löschen!
    Danach direkt dem pwm code drunter schreiben?
    Anosnten habe ich es echt gut verstanden, mit der PWM. War echt super beschrieben danke schon einmal.

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065
    Nein, wenn du das mit dem PIC16F877A machen willst, ist CCP! der Pin RC2, also muss es BSF TRISC,2 heißen!

    Mit welchem Takt betreibst du den PIC?
    Bei 4Mhz wär deine Einstellung eine Frequenz von ca. 12kHz, bei 2Mhz ca. 6kHz.

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.01.2008
    Beiträge
    155
    ja stimmt
    habe ich nach dem posten auch schon bemerkt=)

    aber danke

    Bräuchte aber 2 mal eine PWM, hat der PIC16f877 nur einen Pin, wo die PWM erzeugt werden kann.??
    die Taktfrequenz ist 4 Mhz sprich dann 12 khZ
    habe das programm nun noch einmal umgeschrieben





    Code:
    	LIST      p=16F877	; list directive to define processor
    	#include <p16F877.inc>; processor specific variable defs
    	__CONFIG H'3F39' ; _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC
    	ERRORLEVEL -302 ; unterdrücke Warnungen zur Bank-Auswahl
    	ERRORLEVEL -203
    
    
    
    
    Main:
    	Initialisierung
    
    		bsf		STATUS,RP0
    		clrf	TRISD
    	
    		bcf		STATUS,RP0
    		clrf	PORTD
    		clrf	CCPR1L
    		clrf	T2CON
    		clrf	TMR2
    		clrf	CCP1CON
    		clrf	TMR2		; TMr muss nicht vor definiertwerden
    	
    
    
    Ausgabe:
    	
    	
    ;PWM INIT
       BANKSEL PR2      ;PWM auf 12 MHz, DutyCycle 0,25
       movlw    D'20'
       movwf    PR2
       
    	BANKSEL CCPR1L
       MOVLW    D'5'   
       MOVWF    CCPR1L
       BANKSEL T2CON
       MOVLW    D'1'
       MOVWF    T2CON
       BANKSEL TMR2
       CLRF    TMR2
       BANKSEL CCP1CON
       MOVLW    0x0F
       MOVWF    CCP1CON
    
    ;In der Anwendung Signal einschalten:
       BANKSEL TRISC
       BCF    TRISC,2
    ;Ausschalten
            BANKSEL TRISC
       BSF    TRISC,2 
    		
    
    	
    goto	Ausgabe 
    	
    
    end

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065
    nein, der PIC16F877A hat zwei, CCP1 und CCP2, die liegen beide auf PORTC und du kannst den zweiten separat mit den Registern CCP2CON usw ansteuern, aber sie müssen wohl mit gleicher Frequenz laufen

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •