Я пытаюсь измерить скорость двигателя постоянного тока с помощью ИК-датчика. К моему двигателю был прикреплен диск, и только 1/4 часть его отражала. Я хотел включить прерывание как по заднему, так и по переднему фронту, чтобы процедура прерывания вызывалась дважды в той 1/4-й отражающей области, расстояние до которой я уже знаю.
Мой ISR включит таймер в первый раз и отключит его при следующем вызове прерывания. Проблема (которую я обнаружил, изучая поведение переменной) заключается в том, что когда я заставляю датчик реагировать быстро, мое прерывание генерируется только один раз, а не тогда, когда отражающая поверхность исчезает. Но когда я медленно перемещаю что-то перед ним, то и то, и другое происходит идеально.
Итак, я пришел к выводу, что мое прерывание реагирует недостаточно быстро. Как вы думаете, в чем проблема?
Мой ISR включит таймер в первый раз и отключит его при следующем вызове прерывания.
Это неправильный метод для измерения сигналов с быстрым временем. В микроконтроллере есть таймеры, и эти таймеры имеют режим захвата.
В режиме захвата нарастающий/спадающий фронт входного сигнала приводит к тому, что фактическое значение таймера сохраняется в регистре захвата. У вас будет время до следующего ребра, чтобы прочитать временную метку ребра.
Когда у вас есть две метки времени, вы можете рассчитать время между ними.
Таким образом, вы не зависите от задержки прерывания и джиттера.
Проблема (которую я обнаружил, изучая поведение переменной) заключается в том, что когда я заставляю датчик реагировать быстро, мое прерывание генерируется только один раз, а не при исчезновении отражающей поверхности.
Здесь у вас могут быть проблемы с электрикой. Проверьте правильность краев и отсутствие подпрыгивания.
Вы можете устранить некоторые электрические проблемы с помощью базовых цифровых входных фильтров в таймерах ST. Но лучше иметь фильтр в первую очередь.
Але..ченски