HPWM is for control of CCP PWM. Not Power Control PWM. To use PCPWM you'll need to do
things manually.
The example below is for the 18F2431. It's all in PBP.
The .gif attached shows all 6 PWM channels captured with a logic analyzer. PWM0 to PWM3Code:DEFINE LOADER_USED 1 DEFINE OSC 20 ' At 20MHz, to figure a PWM frequency of 19.455kHz ' ' TPWM = time period of PWM frequency ' PTPER = 12-bit period register PTPERL and PTPERH ' PTMRPS = PWM time base prescaler ' ' (PTPER+1)*PTMRPS 257 ' TPWM = ---------------- = ------------ = 0.0000514 ' Fosc/4 5000000 ' ' Frequency = 1/TPWM = 1/0.0000514 = 19.455kHz ' ' PWM resolution (bits resolution for duty cycle) ' ' log(20MHz/19.455kHz) 3.01 ' Resolution = ------------------ = ----------- = 10 bits ' .301 .301 ' so we'll need a word sized var for Duty Duty Var Word PORTB = 0 ' clear port latch TRISB = %11000000 ' PWM0,1,2,3,4,5 outputs TRISC = 2 ' RC1 = FLTA input (ground RC1 to halt PWM) ' RC1 should be pulled high for normal PWM operation ' when fault A is enabled. ' PCPWM init DTCON = %00000101 ' ~500nS dead-time (for complementary outputs only) PTCON0 = %00000000 ' 1:1 postscale, Fosc/4 1:1 prescale, free running mode ' PTCON0 = %00000100 would give 19.45kHz/4 PTPERL = 0 ' PTPERH = 1 ' PTPER = $0100 or 256d for ~19.45kHz ' PWM4,5 independent, PWM0,1,2,3 complementary PWMCON0 = %01010100 ' PWM[5:0] outputs enabled PWMCON1 = 1 ' updates enabled, overrides sync w/timebase PTCON1 = %10000000 ' PWM time base is ON, counts up FLTCONFIG = %00000011 ' enable fault A, cycle-by-cycle mode Duty = 800 ' ~50% PDC2L = Duty.LowByte ' maintain a fixed 50% duty cycle on PWM4,5 PDC2H = Duty.HighByte ' independent PWM outputs. Main: ' ramps up & down duty-cycle on complementary PWM0,1,2,3 outputs For Duty = 800 To 200 STEP-1 ' ~20% to 80% PDC0L = Duty.LowByte PDC0H = Duty.HighByte PDC1L = Duty.LowByte PDC1H = Duty.HighByte Pause 5 Next Duty Pause 500 ' 1/2 second delay between ramp up/down For Duty = 200 To 800 ' ~80% to 20% PDC0L = Duty.LowByte PDC0H = Duty.HighByte PDC1L = Duty.LowByte PDC1H = Duty.HighByte Pause 5 Next Duty Pause 500 ' 1/2 second delay between ramp up/down GoTo Main End
operate in complementary mode. PWM4 and PWM5 operate in independent mode.
PCPWM is a tad more complex than CCP PWM, but with a little time spent experimenting and
going over the data sheet, it's fairly easy to figure out.




Bookmarks