4 PWM
Kebiasaannya ramai yang tahu 1 pic akan menghasilkan 2 pwm sahaja..dan ramai yang tidak tahu bahawa pic juga bleh menghasilkan lebih dari 2 pwm..untuk menghasilkan pwm kita bleh mengunakan interrupt ataupon bleh juga mengunakan pic18f4331..
Untuk pic 18f4331 configure pwm nye pelik skit…bila declare pwm
genap(0,2,4,6,8) die menghasilkan PWM ganjil(1,3,5,7).. so guna jelakan..nanti korang kaji la sendiri
ye..pastu gtaw kami..hehe
-max untuk nilai PWM adalah 16000,so pandai la bagi2 nilai pwm/duty
cycle yang korang nk..
contoh coding tuk 4PWM:- try pakai litar proteus kt atas tu..
#include
<18F4331.h>
#fuses HS,NOWDT,NOLVP,NOPROTECT
#use delay (clock=10M)
#define SW1 PIN_E0 // SW 1
#define SW2 PIN_E1 // SW 2
#define SW3 PIN_E2 // SW 3
void main()
{
set_tris_e(0xFF);
output_e(0xFF);
setup_power_pwm_pins(PWM_ODD_ON,PWM_ODD_ON,PWM_ODD_ON,PWM_ODD_O);
setup_power_pwm(PWM_FREE_RUN, 1, 0, 4000, 0,
1,0);
while(TRUE)
{
if(!input(SW1)) // WHEN PRESS SW1
{
set_power_pwm0_duty(4000); // ~25% DUTY CYCLE
set_power_pwm2_duty(8000); // ~50% DUTY CYCLE
set_power_pwm4_duty(12000); // ~75% DUTY CYCLE
set_power_pwm6_duty(16000); // ~100% DUTY CYCLE
}
else if(!input(SW2)) // WHEN PRESS SW2
{
set_power_pwm0_duty(2000); // ~12.5% DUTY
CYCLE
set_power_pwm2_duty(4000); // ~25% DUTY CYCLE
set_power_pwm4_duty(6000); // ~37.5% DUTY
CYCLE
set_power_pwm6_duty(8000); // ~50% DUTY
CYCLE
}
else if(!input(SW3)) //WHEN PRESS SW3
{
set_power_pwm0_duty(16000); // ~100% DUTY
CYCLE
set_power_pwm2_duty(12000); // ~75% DUTY CYCLE
set_power_pwm4_duty(8000); // ~50% DUTY CYCLE
set_power_pwm6_duty(4000); // ~25% DUTY
CYCLE
}
else
//WHEN ALL SWITCH DIDN'T PRESS
{
set_power_pwm0_duty(0); // ~O% DUTY CYCLE
set_power_pwm2_duty(0); // ~O% DUTY CYCLE
set_power_pwm4_duty(0); // ~O% DUTY CYCLE
set_power_pwm6_duty(0); // ~O% DUTY CYCLE
}
}
}