I wish I could help but I am using the 18F4431 in a completely
different manner.
Richard
I wish I could help but I am using the 18F4431 in a completely
different manner.
Richard
I don't have the 18F4431 or Microchip motor control board, but this works
on the 18F2431. It outputs PWM on RB0,RB1,RB2,RB3,RB4 and RB5 with a
varying duty cycle. Ramps up, then down.
It should be at least enough to get you started.
This is just a slight modification to what you posted before. To work with theCode:DEFINE OSC 20 Duty VAR WORD PORTB = $FF TRISB = 0 PTCON0=$00 'page 8,step 1 PTPERL=$A0 ' $01A0 = 12kHz PTPERH=$01 PWMCON0=%01011110 'would be %01011111 for the 18F4431 PWMCON1=%00000001 'step 4 DTCON=$00 ;OVDCOND=$00 'step 6 ; May want to un-comment these based on your PIC & board. ;OVDCONS=$00 ;FLTCONFIG=%10110011 ;POVD=00000000 ;SEVTCMP=$0000 ;step 8 SEVTCMPL=$00 SEVTCMPH=$00 PDC0L=$00 PDC0H=$00 PDC1L=$00 PDC1H=$00 PDC2L=$00 PDC2H=$00 ;PDC3L=$FF ; un-comment for 18F4431 ;PDC3H=$00 PTCON1=%10000000 Main: FOR Duty = 50 TO $500 STEP 4 ASM bsf PWMCON1,UDIS ;Disable the PWM buffer update MOVFF _Duty,PDC0L MOVFF _Duty+1,PDC0H MOVFF _Duty,PDC1L MOVFF _Duty+1,PDC1H MOVFF _Duty,PDC2L MOVFF _Duty+1,PDC2H ;MOVFF _Duty,PDC3L ;un-comment for 18F4431 ;MOVFF _Duty+1,PDC3H bcf PWMCON1,UDIS ;Enable the PWM buffer update ENDASM PAUSE 50 NEXT Duty FOR Duty = $500 TO 50 STEP-4 ASM bsf PWMCON1,UDIS ;Disable the PWM buffer update MOVFF _Duty,PDC0L MOVFF _Duty+1,PDC0H MOVFF _Duty,PDC1L MOVFF _Duty+1,PDC1H MOVFF _Duty,PDC2L MOVFF _Duty+1,PDC2H ;MOVFF _Duty,PDC3L ;un-comment for 18F4431 ;MOVFF _Duty+1,PDC3H bcf PWMCON1,UDIS ;Enable the PWM buffer update ENDASM PAUSE 50 NEXT Duty GOTO Main END
18F2431. I haven't done much beyond this with the PCPWM module. Not yet
at least..;o}
HTH
I'm using the 18F2431 too.
And I begun with the PICDEm MC LV board...
It's a great uC ! (UART, I2C, fast AD, 3-times PWM...)
I use it as a PI(D)-Controller for a BLDC-Motor.
And I use it for his fast AD-Converters in a CR-Tuning-Box.
The Quadrature-Encoder isn't very strange ... the whole business with this chip is to use the right timers for the right tasks and use the right prescalers !!
;-)
PBP 2.50C, MCS+ 3.0.0.5, MPLAB 8, MPASM 5.14, ASIX Presto, PoScope, mE mikroBasic V7.2, PICKIT2
Yeah this one is a nifty series PIC for sure. Sampling 4 x A/D inputs at once is
a very handy feature.
See this post http://www.picbasic.co.uk/forum/showthread.php?t=6768
I just received a few samples of the new USB 18F2553. 12-bit A/D on this
one is nice, but the 18F2431 is still my favorite. Now, if I can just find more
time to play with it..;o}
Thanks a lot Bruce.
I just want to get started with PPWM and then build my own code for brushless DC motor control.
Thanks for your code although its in assembly.i will figure it out.
Here's the BASIC equivalent commands to the right of the assembly version.
bsf PWMCON1,UDIS just sets bit 1 in PWMCON1. bcf PWMCON1,UDIS thenCode:FOR Duty = 50 TO $500 STEP 4 ASM bsf PWMCON1,UDIS ; PWMCON1.1 = 1 MOVFF _Duty,PDC0L ; PDCOL = Duty.LowByte MOVFF _Duty+1,PDC0H ; PDC0H = Duty.HighByte MOVFF _Duty,PDC1L ; PDC1L = Duty.LowByte MOVFF _Duty+1,PDC1H ; PDC1H = Duty.HighByte MOVFF _Duty,PDC2L ; PDC2L = Duty.LowByte MOVFF _Duty+1,PDC2H ; PDC2H = Duty.HighByte ;MOVFF _Duty,PDC3L ; PDC3L = Duty.LowByte ;MOVFF _Duty+1,PDC3H ; PDC3H = Duty.HighByte bcf PWMCON1,UDIS ; PWMCON1.1 = 0 ENDASM PAUSE 50 NEXT Duty
clears the UDIS bit.
MOVFF is move file to file.
MOVFF _Duty,PDC0L moves the low byte of Duty into file register PDC0L.
MOVFF _Duty+1, PDC0H moves the high byte of Duty into file register PDC0H.
Placing the underscore before the _Duty variable allows you to access the
variable declared in BASIC with assembler.
So the BASIC version would look like this;
Code:FOR Duty = 50 TO $500 STEP 4 PWMCON1.1 = 1 PDC0L = Duty.LowByte PDC0H = Duty.HighByte PDC1L = Duty.LowByte PDC1H = Duty.HighByte PDC2L = Duty.LowByte PDC2L = Duty.HighByte PDC3L = Duty.LowByte PDC3H = Duty.HighByte PWMCON1.1 = 0 PAUSE 50 NEXT Duty FOR Duty = $500 TO 50 STEP-4 PWMCON1.1 = 1 PDC0L = Duty.LowByte PDC0H = Duty.HighByte PDC1L = Duty.LowByte PDC1H = Duty.HighByte PDC2L = Duty.LowByte PDC2L = Duty.HighByte PDC3L = Duty.LowByte PDC3H = Duty.HighByte PWMCON1.1 = 0 PAUSE 50 NEXT Duty
Bruce,
That's a super start to a beginner like me.
But,i gotta some problem with the PWM Period value.I mean how to find the values for .. say...a PIC18F4431 running at OSC 20 , wish to set base period 19.5KHZ.How to find this using equation 17-1 ( i use this equ since it's free running mode here).Apart from that , how to calculate the min & max value of dutycycle?.Dohh...it's really bothering me no matter how many times i try it.
Could you guide me how to do this.I am a bit confused.The rest seems yeeha as it's taught in "863 MTR" from Microchip.
Regards.
Bookmarks