Насколько понимаю кристалл у нас mega128, что не может не радовать

Тогда, раз такой вариант устраивает, делаем следущее:
Берем Timer 1 в режиме CTC (ограничение максимума по OCR1A)
где число в OCR1A - период выдаваемого меандра.
для CK/64 и 8 MHz это как раз 2 кГц и OCR1A=$FFFF
Генерацию выходного меандра делаем по OCR1B так:
изначально
Код
OCR1B=0;
настраиваем его выход на переключение по сравнению, а в самом обработчике
прерывания по сравнению делаем такую штуку
Код
OCR1B += (OCR1A/2)+1; //+1 нужен для коррекции, чтобы (OCR1A/2)+(OCR1A/2) было = OCR1A+1
if (OCR1B > OCR1A) OCR1B=0;
Настраиваем обработчик прерывания по захвату данных Timer 1 в регистр ICR1
Собственно на вход ICR и будет поступать сигнал от катушки.
Когда прерывание сработает в ICR уже будет лежать значение фазового сдвига.
НО, мы на этом не останавливаемся, хотя мне до сих пор не ясно почему ...
Для формирования сигнала сдвинутого по фазе от входного будем использовать OCR1С.
изначально
Код
OCR1С=alpha; // фаза на которую сдвигаем входной сигнал
настраиваем его выход на переключение по сравнению, а в самом обработчике
прерывания по сравнению делаем так:
Код
long Comp = (long)OCR1С + (long)(OCR1A/2)+1L;
while (Comp > (long)OCR1A) Comp -= (long)OCR1A;
OCR1С = (int)Comp;
а обработчик прерывания по захвату (ICR) делаем так:
Код
long Comp = (long)alpha + (long)TCNT1;
while (Comp > (long)OCR1A) Comp -= (long)OCR1A;
OCR1С = (int)Comp;
В последних обработчиках необходима промежуточная переменная Comp для того чтобы не потерять результат при переполнении. В принципе работа аналогично тому, что я приводил ранее с timer 2, только в этом случае мы отталкиваемся не от нуля, а от значения в TCNT1.
PS: Ухожу из обсуждения в отпуск, Удачи.