Hallo iedereen,
Ik gebruik de PCPWM (Power Control PWM) peripheral van de PIC18F4431 om twee motoren aan te sturen met PWM (C taal).

Mijn doel is om twee motoren te hebben, waarvan ik, wanneer ik wil, de duty cycle kan van aanpassen.
De frequentie mag van beiden dezelfde zijn en moet niet aangepast worden.

Ik heb de datasheet al meerdere keren gelezen, en gezocht naar tutorials, voorbeeldcode etc. Maar ik krijg deze peripheral maar niet werkende...

Nu heb ik dit al:


...
//PWM config
	PTCON0 = 0x28;					//0010 1000   1:4postscale 1:16prescale free running
	PTCON1 = 0x80;					//10 000000
	PWMCON0 = 0x5F;					//0101 1111   All PWMpins enabled en independant
	PWMCON1 = 

Ik weet niet wat ik in PWMCON1 moet schrijven, wat betekenen deze bits?

Kan iemand mij een opsomming geven, van welke registers ik (eventueel in welke volgorde ) moet initialiseren?
Waar stel ik de periode in? de duty cycle?
Voorbeeldcode waarin dit duidelijk staat, in C of ASM, is ook goed.

En nog een vraag, word er elke periode geïnterrupt? of loopt deze peripheral zonder mij lastig te vallen, na initialisatie natuurlijk?

Alvast bedankt.

[Bericht gewijzigd door Fredjelektr op (16%)]

Kan iemand mij een opsomming geven, van welke registers ik (eventueel in welke volgorde ) moet initialiseren?
Waar stel ik de periode in? de duty cycle?
dit staat in de datasheet als het goed is

En nog een vraag, word er elke periode geïnterrupt? of loopt deze peripheral zonder mij lastig te vallen, na initialisatie natuurlijk?
das onafhankelijk van uwe programma dus je krijgt geen interupt in je programma

Ik weet niet wat ik in PWMCON1 moet schrijven, wat betekenen deze bits?
ook dat staat als het goed is in de datasheet onder PCPWM hoofdstuk

Ik begrijp niet wat het vershil is tussen free running mode, single shot en continuous up/down counting van de time base.

De uitleg van de datasheet is maar zeer beknopt :/

Ik wil kleine DC motortjes aansturen, welke moet ik kiezen?

Bij free running mode blijft hij iedere keer dezelfde blokgolf genereren, bij single shot doet hij het maar 1 keer (daar heb je dus niets aan) en bij continuous up/down telt hij eerst naar boven en dan terug naar onder.

Voor DC motoren wordt meestal de laatste aangeraden, alhoewel de eerste ook werk.

Gewoon aanzetten, en indien nodig het trigger register aanpassen en de counter resetten. Dat bepaalt de aan/uit verhouding en is gewoon een kleiner getal dan de initiele counter waarde.

Op 23 juni 2008 00:26:15 schreef SymbolicFrank:
Bij free running mode blijft hij iedere keer dezelfde blokgolf genereren, bij single shot doet hij het maar 1 keer (daar heb je dus niets aan) en bij continuous up/down telt hij eerst naar boven en dan terug naar onder.

Voor DC motoren wordt meestal de laatste aangeraden, alhoewel de eerste ook werk.

Waarom is up/down beter dan free running?

Op 23 juni 2008 00:26:15 schreef SymbolicFrank:
Gewoon aanzetten, en indien nodig het trigger register aanpassen en de counter resetten. Dat bepaalt de aan/uit verhouding en is gewoon een kleiner getal dan de initiele counter waarde.

Sorry, maar op welke vraag antwoord je hier? kun je wat verduidelijken?

Up/down is beter omdat je minder gekke pulsjes krijgt, maar dat is voor een motortje niet zo spannend. Freerunning werkt ook.

Wat ik bedoel is, dat je hem gewoon aan moet zetten en dan kijken wat er gebeurt. Je kunt niets kapot maken met een motortje.

PTCON0 is het controleregister, je moet bits 0 en 1 op 1 zetten. De rest maakt niet zoveel uit, dat bepaalt de frequentie. Daar kun je mee experimenteren.

Van PTCON1 moet je bit 7 aanzetten om de counters te laten tellen.

PWMCON0 bepaalt welke pennen er gebruikt worden en of deze automatisch werken. Als je de bits 4, 5 en 6 op 1, 0 en 1 zet, dan zet je alle PWM poorten en pinnen aan. Bits 0 tot 3 zetten ieder twee (bit 0 op 1 zetten voor kanaal 0 en 1, etc) van de PWM kanalen op automatisch.

PTPER (PTPERL en PTPERH) bepaalt de duty cycle. Dit is een getal tussen 0 en 4096.

Als het hiermee niet werkt, dan moet je kijken of er iemand langskomt die zo'n PIC heeft, want ik haal dit ook maar gewoon uit de datasheet.

Dit is de init van de PCPWM voor een PIC18F4431.
Het zit in een 3fase frequentieregelaar, dus je zult toch het nodige moeten wijzigen voor jouw toepassing, maar misschien heb je er houvast aan:


	
;***********************************************************
;Initialize PCPWM
;	NOTES:
; 	1)	PTPER has 12-bit resolution, 4 LSBs of PTPERH and 8 bits of PTPERL
; 	2)	In edge aligned mode, PTMR reset to zero on match with PTPER
;	3)	PDC has 14-bit resolution, 6 LSBs of PDCxH and 8 bits of PDCxL
;	4)	Lower 2 bits of PDC compared to Q clocks
;
;	5)	Resolution(of duty cycle)= log((Fosc/4)/Fpwm)/log(2) = log(5Mhz/20kHz)/log(2) = 8 bits
;		so 6 LSBs of PDCxH and 2 MSBs of PDCxL will be used.
;	   (for 16kHz, resolution = log(5Mhz/16kHz)/log(2) = 8 bits, also.)
;
;*******************************************************************************
INIT_PCPWM

	movlw	b'00000000'			; PTCON0 is configured such that:
	movwf	PTCON0		    	; a) Postscale value is 1:1
								; b) PWM time base input is Fosc/4
								; c) PWM time base mode is free-running for edge-aligned operation
	
;	movlw	0xF9				; PTPERL and PTPERH are set up for a 20KHz PWM frequency.		
;	movwf	PTPERL			    ; 	PTPERH:PTPERL = ((Fosc/4)/(PWMfreq x PTMRps))-1
;	movlw	0x00				; 	PTPERH:PTPERL = ((20MHz/4)/(20KHz x 1))-1 = 249d = F9h
;	movwf	PTPERH			

	movlw	0x37				; PTPERL and PTPERH are set up for a 16KHz PWM frequency.		
	movwf	PTPERL			    ; 	PTPERH:PTPERL = ((Fosc/4)/(PWMfreq x PTMRps))-1
    movlw	0x01				; 	PTPERH:PTPERL = ((20MHz/4)/(16KHz x 1))-1 = 311d = 137h
	movwf	PTPERH	
	
;	movlw	0xF9				; PTPERL and PTPERH are set up for a 3 kHz PWM frequency.		
;	movwf	PTPERL		    	; PTPERH:PTPERL = ((Fosc/4)/(PWMfreq x PTMRps))-1
;	movlw	0x06				; PTPERH:PTPERL = ((20MHz/4)/(20KHz x 1))-1 = 249d = F9h
;	movwf	PTPERH	
	
	movlw	b'01000000'			; PWMCON0 is configured such that:
	movwf	PWMCON0			; a) PWM0, PWM1, PWM2, PWM3, PWM4, and PWM5 are enabled for output.
								; b) All PWM I/O pairs are set to complimentary mode
										
	movlw	b'00000001'			;PWMCON1 is configured such that:
	movwf	PWMCON1				; a) Special event trigger post-scaler is set to 1:1
								; b) Special event trigger occurs when time-base is counting upwards
								; c) Updates from duty cycle and period buffer registers are enabled.
								; d) Output overrides via OVDCON are synchronous to the PWM timebase.			


;	movlw	b'00001010'			;1us deadtime instead of 2us		
;	movlw	b'00010100'			;DTCON is configured such that:
	movlw	b'00011100'          ; 3.2 us
	movwf	DTCON				; a) Clock source for dead-time is Fosc/2.
								; b) Dead time = Dead time value / (Fosc/2) = 2uS.							
;	clrf	DTCON				;DTCON for zero dead-time (relying on IRAMS cross-conduction prevention logic)							

;	movlw	b'00000000'
	movlw	b'11111111'			;OVDCOND is configured such that there is no output override.
	movwf	OVDCOND
	
	movlw	b'00000000'			;OVDCONS is configured such that all PWM outputs are 0 upon power-up.
;	movlw	b'11111111'			;OVDCONS is configured such that all PWM outputs are 1 (inactive) upon power-up.
	movwf	OVDCONS
	
	
	;FLTA is overcurrent fault, muxed via configuration bit to RC1
	;FLTB is overvoltage fault on RC2
;	bsf		TRISC, 1			;Ensure that RC1 is an input
;	bsf		TRISC, 2			;Ensure that RC2 is an input
;	movlw	b'10000000'			;Fault A and FaultB are disabled.
;	movlw	b'10000011'			;Fault B is disabled
;	movlw	b'10010001'			;Fault A and FaultB are enabled in catastrophic mode.
;	movlw	b'10110011'			;FLTCONFIG is configured such that: 
	movlw	b'00000000'			;Fault disabled.
	movwf	FLTCONFIG			; a) Enable fault condition on break-point for use with ICD2
								; b) Enable FaultA in cycle-by-cycle mode
								; c) Enable FaultB in cycle-by-cycle mode
								; d) Fault A and Fault B disable PWM channels 0 to 5
	
	movlw	0x00				;SEVTCMPL and SEVTCMPH are clear.
	movwf	SEVTCMPL
	movlw	0x00
	movwf	SEVTCMPH

	clrf	PDC0L				;PDC0L, PDC1L, PDC2L, PDC3L, PDC0H, PDC1H, PDC2H, PDC3H 
	clrf	PDC1L				; 	are clear so that duty cycles are initially 0.
	clrf	PDC2L	
	clrf	PDC3L	
	clrf	PDC0H	
	clrf	PDC1H	
	clrf	PDC2H	
	clrf	PDC3H	

	bsf		PTCON1, PTEN		;PTEN bit in the PTCON1 is set to enable the PWM time base.
	
	return

Alvast bedankt voor jullie replies.

[Bericht gewijzigd door Fredjelektr op (69%)]