Как можно увеличить скорость внешнего прерывания GPIO в stm32f4?

Я пытаюсь измерить скорость двигателя постоянного тока с помощью ИК-датчика. К моему двигателю был прикреплен диск, и только 1/4 часть его отражала. Я хотел включить прерывание как по заднему, так и по переднему фронту, чтобы процедура прерывания вызывалась дважды в той 1/4-й отражающей области, расстояние до которой я уже знаю.

Мой ISR включит таймер в первый раз и отключит его при следующем вызове прерывания. Проблема (которую я обнаружил, изучая поведение переменной) заключается в том, что когда я заставляю датчик реагировать быстро, мое прерывание генерируется только один раз, а не тогда, когда отражающая поверхность исчезает. Но когда я медленно перемещаю что-то перед ним, то и то, и другое происходит идеально.

Итак, я пришел к выводу, что мое прерывание реагирует недостаточно быстро. Как вы думаете, в чем проблема?

Вам нужно сначала увидеть форму сигнала входного сигнала, прежде чем обвинять скорость процедуры прерывания. Затем вам нужно проверить скорость прерывания, применяя заведомо исправный ввод, и установить другой GPIO внутри вашей процедуры обработки прерывания и посмотреть на синхронизацию фронтов сигнала. Какую модель осциллографа вы используете при отладке кода?

Ответы (1)

Мой ISR включит таймер в первый раз и отключит его при следующем вызове прерывания.

Это неправильный метод для измерения сигналов с быстрым временем. В микроконтроллере есть таймеры, и эти таймеры имеют режим захвата.
В режиме захвата нарастающий/спадающий фронт входного сигнала приводит к тому, что фактическое значение таймера сохраняется в регистре захвата. У вас будет время до следующего ребра, чтобы прочитать временную метку ребра.
Когда у вас есть две метки времени, вы можете рассчитать время между ними.

Таким образом, вы не зависите от задержки прерывания и джиттера.

Проблема (которую я обнаружил, изучая поведение переменной) заключается в том, что когда я заставляю датчик реагировать быстро, мое прерывание генерируется только один раз, а не при исчезновении отражающей поверхности.

Здесь у вас могут быть проблемы с электрикой. Проверьте правильность краев и отсутствие подпрыгивания.
Вы можете устранить некоторые электрические проблемы с помощью базовых цифровых входных фильтров в таймерах ST. Но лучше иметь фильтр в первую очередь.

Есть и другая проблема. Бьюсь об заклад, он использует HAL, и задержка прерывания не является проблемой (если только триггеры прерывания не входят в нашу долю). Использование библиотечных функций HAL добавляет к этому сотни (иногда тысячи) тактов.
@PeterJ_01 Да, все, что вы строите из лего, будет неуклюжим.
Но я вижу много вопросов, например: контактный переключатель очень медленный.