COMPLEMENTARY PWM

COMPLEMENTARY PWM  AT 5KHz




PROGRAM   (for C language)
//i have used crystal of 16 MHz  and no PLL 
//output at 5KHz
void main()
{
unsigned int pwm_period, current_duty ;
  current_duty=500  ;                   //duty ratio 31%
  pwm_period = PWM1_MC_Init(5000, 0, 0x11, 0);      //enable 1L AND 1H pwm pins
  PWM1_MC_Set_Duty(current_duty, 1) ;
  PWM1_MC_Start();
//DTCON1=0                     //DEAD TIME CONTROL
  while (1);
}

PROGRAM  (for pascal language)

'i have used crystal of 16 MHz and no PLL 
program BLINK
dim pwm_period, current_duty as word

main:
    current_duty=500  'duty cycle of 31%
  pwm_period = PWM1_MC_Init(5000, 0, 0x11, 0)   ' Pwm_Mc_Init returns calculated timer period.
  PWM1_MC_Set_Duty(current_duty, 1)
  PWM1_MC_Start()

  while (TRUE)
  wend
end.

COMPLEMENTARY PWM  AT 60KHz  


PROGRAM   (for C language)
//i have used crystal of 16 MHz
//output at 60KHz
void main()
{
unsigned int pwm_period, current_duty ;
  current_duty=100  ;                   //duty ratio 50%
  pwm_period = PWM1_MC_Init(60000, 0, 0x11, 0);      //enable 1L AND 1H pwm pins
  PWM1_MC_Set_Duty(current_duty, 1) ;
  PWM1_MC_Start();
//DTCON1=0                     //DEAD TIME CONTROL
  while (1);
}

PROGRAM  (for pascal language)
'i have used crystal of 16 MHz and no PLL
program BLINK
dim pwm_period, current_duty as word

main:
    current_duty=65                       'duty ratio 50%
  pwm_period = PWM1_MC_Init(60000, 0, 0x11, 0)   ' Pwm_Mc_Init returns calculated timer period.
  PWM1_MC_Set_Duty(current_duty, 1)
  PWM1_MC_Start()

  while (TRUE)
  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)*2

FOR 5KHz
Maximum duty ratio = (16MHz / (5KHz *4 *1)  - 1)*2=1598

FOR 60KHz ,Maximum duty ratio = (16MHz / (60KHz *4 *1)  - 1)*2 = 130

I HAVE USED 50% DUTY RATIO FOR BOTH


COMPLEMENTARY PWM  AT 240KHz







PROGRAM   (for C language)

//i have used crystal of 16 MHz
//output at 60KHz
void main()
{
unsigned int pwm_period, current_duty ;
  current_duty=100  ;                   //duty ratio 50%
  pwm_period = PWM1_MC_Init(60000, 0, 0x11, 0);      //enable 1L AND 1H pwm pins
  PWM1_MC_Set_Duty(current_duty, 1) ;
  PWM1_MC_Start();
//DTCON1=0                     //DEAD TIME CONTROL
  while (1);
}

PROGRAM  (for pascal language)


'i have used crystal of 16 MHz and PLL of 4

program BLINK
dim pwm_period, current_duty as word

main:
    current_duty=65                       'duty ratio 50%
  pwm_period = PWM1_MC_Init(60000, 0, 0x11, 0)   ' Pwm_Mc_Init returns calculated timer period.
  PWM1_MC_Set_Duty(current_duty, 1)
  PWM1_MC_Start()

  while (TRUE)
  wend
end.

COMPLEMENTARY PWM  AT 60KHz WITH DEAD TIME CONTROL





'i have used crystal of 16 MHz  and no PLL

program BLINK
dim pwm_period, current_duty as word

main:
    current_duty=65                       'duty ratio 50%
  pwm_period = PWM1_MC_Init(60000, 0, 0x11, 0)   ' Pwm_Mc_Init returns calculated timer period.
  PWM1_MC_Set_Duty(current_duty, 1)
  PWM1_MC_Start()
   DTCON1=15
  while (TRUE)
  wend
end.