Mình chưa có thời gian để xem thật kỹ chương trình của bạn, tuy nhiên mình đã xem file costdktocdodongco.c của bạn, mình nhận thấy bạn dùng PWM ở trạng thái chia 256 mức khác nhau (setup_timer_2(T2_DIV_BY_16,255,1)

, tuy nhiên khi bạn set PWM
i=read_adc();
set_pwm1_duty(51*i);
i phần lớn sẽ lớn hơn 5, và vì thế sẽ luôn làm tràn giá trị set của PWM và nhiều khả năng đầu ra sẽ luôn có độ đầy xung là 1.