Sudeci po Microchip-ovoj dokumentaciji (mada moram priznati da nisam bas siguran da li sam dobro razumeo), nakon setup-a ECCP-a u half-bridge rezimu, dovoljno je samo podesiti ECCP1DEL da bi se aktivirao dead-time (dead-band po njihovoj literaturi).
Ako sam dobro razumeo ECCP1DEL treba da sadrzi 7-bitni broj koji definise broj ciklusa koje treba preskociti u toku dead-time-a i auto-restart fleg.
Kod je relativno prost, sa izuzetkom nedostatka komentara i poneke nepodesno nazvane varijable, pa bi mi znacilo ako biste mogli baciti pogled i mozda ugledati bag koji prouzrokuje jedan od dva slucaja:
- dead-time jedva da moze da se primeti (isuvise mali ECCP1DEL)
- duty-cycle komplementarnog PWM-a pravi overflow (preveliki/osrednji ECCP1DEL)
PWM.h:
#include <18f4550.h>
#fuses HSPLL, PLL4, CPUDIV1, NOWDT, NOPROTECT, NOLVP
#use delay(clock=32000000)
#use timer(TIMER=0,TICK=1ms,BITS=16,NOISR)
PWM.c:
#include <PWM.h>
int16 pwm_resolution;
int amount = 0;
int left = 1;
int pwm_offset = 0;
void PWM_Run();
void PWM_SetMove(int16 param_amount, int16 time, int direction);
#byte ECCP1DEL = 0xFB7
void main(void)
{
setup_ccp1(CCP_PWM_HALF_BRIDGE | CCP_PWM_H_H);
ECCP1DEL = 68;
setup_timer_2(T2_DIV_BY_4, 99, 1);
set_pwm1_duty(50);
set_tris_b(0x00);
set_tris_d(0x00);
set_ticks(0);
pwm_resolution = 1;
PWM_SetMove(40, 5000, 1);
while(1)
{
PWM_Run();
}
}
void PWM_Run()
{
if(pwm_offset < amount)
{
if(get_ticks() > pwm_resolution)
{
set_ticks(0);
if(left)
{
set_pwm1_duty(50+pwm_offset);
}
else
{
set_pwm1_duty(50-pwm_offset);
}
pwm_offset++;
}
}
}
void PWM_SetMove(int16 param_amount, int16 time, int direction)
{
pwm_resolution = time / param_amount;
left = direction;
output_b(pwm_resolution);
pwm_offset = 0;
amount = param_amount;
}
Hvala unapred!
Pozdrav,
Nikola