В Вашем варианте есть проблема, когда значения x1 и x2 слишком близки.
Как вариант, можно попрерыванию таймера сделать 3 канала сигма-дельта. Пример одного канала:
#pragma vector = TIMER2_OVF_vect
__interrupt void DS_Cycle(void)
{
//Delta-Sigma modulator:
static int Sigma = 0;
int Delta;
//quantization:
if(Sigma > PWM_MAX)
{
Delta = -PWM_MAX;
LED_R_ON;
}
else
{
Delta = 0;
LED_R_OFF;
}
//summing:
Sigma = Sigma + Pwm + Delta;
}