100KHz AND 200KHz SQUARE WAVE USING DSPIC
PROGRAM
program BLINK
dim current_duty, current_duty1, pwm_period1 , pwm_period2 as word
main:
PORTD = 0 ‘ set PORTD to 0
TRISD = 0 ‘ designate PORTD pins as output
current_duty = 20 ‘ initial value for current_duty
current_duty1 = 10 ‘ initial value for current_duty1
pwm_period1 = PWM_Init(100000 , 1, 1, 2) ‘frequency ,channel no.,timer prescale value(1, 8, 64, and 256 ) ,timer no (2 or 3)
pwm_period2 = PWM_Init(200000, 2, 1, 3) ‘frequency ,channel no.,timer prescale value(1, 8, 64, and 256 ) ,timer no (2 or 3)
PWM_Start(1)
PWM_Start(2)
PWM_Set_Duty(current_duty, 1) ‘ Set current duty for PWM1
PWM_Set_Duty(current_duty1, 2) ‘ Set current duty for PWM2 ‘OC2RS=50—duty cycle actuall writes to this register
while (TRUE) ‘ endless loop
wend
end.
HOW TO CALCULATE PWM DUTY CYCLE
- PWM duty ratio depend on output frequency
- 16MHz crystal as clock source
- PRESCALE VALUE ARE 1, 8, 64, and 256
Maximum duty ratio = FOSC /(FOUTPUT * 4 * PRESCALE VALUE) -1
FOR 100KHz
Maximum duty ratio = 16MHz / (100KHz *4 *1) – 1=39
FOR 200KHz
Maximum duty ratio = 16MHz / (200KHz *4 *1) – 1=19
I HAVE USED 50% DUTY RATIO FOR BOTH
800KHz SQUARE WAVE USING DSPIC
program BLINK
dim current_duty, current_duty1, pwm_period1 , pwm_period2 as word
main:
PORTD = 0 ‘ set PORTD to 0
TRISD = 0 ‘ designate PORTD pins as output
current_duty = 20 ‘ initial value for current_duty
current_duty1 = 2 ‘ initial value for current_duty1
pwm_period1 = PWM_Init(100000 , 1, 1, 2) ‘frequency ,channel no.,timer prescale value(1, 8, 64, and 256 ) ,timer no (2 or 3)
pwm_period2 = PWM_Init(800000, 2, 1, 3) ‘frequency ,channel no.,timer prescale value(1, 8, 64, and 256 ) ,timer no (2 or 3)
PWM_Start(1)
PWM_Start(2)
PWM_Set_Duty(current_duty, 1) ‘ Set current duty for PWM1
PWM_Set_Duty(current_duty1, 2) ‘ Set current duty for PWM2 ‘OC2RS=50—duty cycle actuall writes to this register
while (TRUE) ‘ endless loop
wend
end.