У ATMega8 1-ый и 2-ой таймеры - реверсивны, просто мы не можем програмно указать направление счета, если таймер работает в режиме "Phase correct PWM" - то счетчик увеличивается до значения TOP, потом уменьшается до значения BOTTOM (0), после опять увеличивается до значения TOP и т.д.
Мне на ум приходит единственное решение моей проблемы - в момент реверса (двигателя -> энкодера) - сделать что-то на подобие:
In Tmp,TCNT1A
Inc Tmp
Out OCR1A,Tmp
А в обработчике OC1A
In Tmp,TCNT1A
Dec Tmp
Out TCNT1A
В первом случае добавляем чтобы точно не пропустить момент "Compare Match" (т.е. одинаковые значения TCNT1A и OCR1A), а в обработчике - чтобы исключить погрешность.
Саму тему я создал для того чтобы узнать ваще видене решения проблемы (при такой частоте импульсов).
Реализация нужна програмная, просто мне сказали что мол есть такие контроллеры в которых есть так называемый квадратурный счетчик, на что я ответил что и AVR`ка тоже будет считать просто надо добавить небольшую аппаратную часть, но не сам счетчик!!!
Принцип работы D-тригера такова: по фронту (спаду) одного из сигналов устанавливаем значение второго, т.е. если двигатель вращается в одну сторону - первый сигнал опережает второй и к переднему фронту первого - на втором будет "0", а при вращении в другую - "1".
Прикрепил модель в Proteus`е.
Сообщение отредактировал Erv&Sed - Dec 10 2007, 21:27