Встречался с такой задачей. Алгоритм примерно такой:
ISR(INT1_vect) // Прерывания с датчика оборотов
{
y++;
}
ISR(TIMER1_OVF_vect) //Прерывания по переполнению таймера 1, при Fтакт=16МГц, 20000 прерыв=1сек
{
i++;
if (i == 5000)
{
i = 0;
tv = y*8; // (tv=(y*60сек)/(30отв*0.25с))скорость в [об/мин] учитывая что в диске 30 отверстий,
y = 0;
//работа_________________________________________
if (i3‹3) i3++; else i3=0;
if (i3 == 3)
{
if (tv ›= (v+24))
{
counter--;
if (counter‹=0) counter = 0;
OCR1AH = ((char)(counter››
);
OCR1AL = ((char)(counter));
}
if (tv ‹= (v-24))
{
counter++;
if (counter › 799) counter = 799;
OCR1AH = ((char)(counter››
);
OCR1AL = ((char)(counter));
}
}
}
}
здесь:
v - устанавливаемая скорость
tv-текущая скорость