PDA

View Full Version : 50Khz PWM



jmgelba
- 7th June 2012, 07:07
18F2550
48MHz

I have set up CCP1 to provide a 50KHz PWM using the code below. However I need to use a 10bit number for the duty cycle. How do I implement that? Do I change
high_duty=(PWM_SIGNAL>>2) to
high_duty=(PWM_SIGNAL) and also
low_duty=(PWM_SIGNAL<<6) to
low_duty=(PWM_SIGNAL<<8)?


PWM_SIGNAL = 255CCP1CON = 111100
PR2 = 239
high_duty=(PWM_SIGNAL>>2) 'high 6 bits in CCPR1L
low_duty=(PWM_SIGNAL<<6) 'low two bits for CCP1CON
low_duty=(low_duty>>2) 'shift back to CCP1CON<5:4>
low_duty.3=1 'PWM configuration bit
low_duty.2=1 'PWM configuration bit
CCPR1L=high_duty
CCP1CON = $0C
T2CON = 4

Thanks.

HenrikOlsson
- 7th June 2012, 07:59
Hi,
You won't get a full 10bit resolution at that frequency but it'll be pretty close. But you do

Duty VAR WORD
Duty = 500 'Or whatever

CCP1CON.4 = Duty.0
CCP1CON.5 = Duty.1
CCPR1L = (Duty >> 2)

/Henrik.

jmgelba
- 8th June 2012, 05:42
Thanks Henrik. I implemented your changes as shown below but this seems to stop the duty cycle at 25% or 256. It then rolls over to 0.


CCP1CON = %00111100
PR2 = 239
high_duty=(PWM_SIGNAL>>2) 'high 6 bits in CCPR1L
low_duty=(PWM_SIGNAL<<6) 'low two bits for CCP1CON
low_duty=(low_duty>>2) 'shift back to CCP1CON<5:4>
low_duty.4=0 'PWM configuration bit
low_duty.5=1 'PWM configuration bit
CCPR1L=high_duty
CCP1CON = $0C
T2CON = 4

jmgelba
- 8th June 2012, 06:05
I had PWM_SIGNAL defined as a BYTE not WORD.

Solved.