Перейти к содержанию
    

stm32f4, Input Compare

Сейчас я например могу измерять ширину входного пульса и его период. Ну и по мере активности входного пульса срабатывается прерывание, и я внутри прерывания могу видеть значения периода и ширины пульса.

 

Но теперь мне нужно чтобы прерывание срабатывало только тогда когда скажем ширина пульса имеет определенное значение (или выше/ниже определенного значения).

 

 

Пытаюсь разобратся, смотрю на сХему, на стр. 375 мануала, я не могу пока понять мне значение для сравнения нужно в CCR1 класть? или иначе как это можно достичь? т.е. мне нужно чтобы это произошло без участия программного кода, скажем код какой то исполняется, и вдруг ширина входного пульса на какой то ноге превысила какое то значение и сработало прерывание, а не так чтобы я постоянно должен был в прерывании проверять ширину пульса.

 

мне кажется нужно использовать Мастер/Слейв режим, но не могу понять как это связать пока.

 

мне кажется сравнение с регистром CCR1 в основном в Output Compare режиме, но я не знаю работает ли это каким то образом в Input Compare?

 

Кто нибудь может подсказать или показать код если есть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сейчас я например могу измерять ширину входного пульса и его период. Ну и по мере активности входного пульса срабатывается прерывание, и я внутри прерывания могу видеть значения периода и ширины пульса.

 

Но теперь мне нужно чтобы прерывание срабатывало только тогда когда скажем ширина пульса имеет определенное значение (или выше/ниже определенного значения).

 

Период импульса не важен?

Если нужна аппаратная реализация с генерацией прерывания при поступлении импулься широной от T1 до T2 без участия CPU, то самое простое что мне видится:

- нстроить таймер на запуск по фронту с входа;

- настроить первый канал на время T1 с генерацией DMA-запроса;

- настроить второй канал на время T2 с генерацией DMA-запроса;

- DMA-запрос от первого канала настроить на запись управляющего слова в регистр РАЗРЕШЕНИЯ прерывания от внешнего входа по спаду импульса;

- DMA-запрос от второго канала настроить на запись управляющего слова в регистр ЗАПРЕЩЕНИЯ прерывания от внешнего входа по спаду импульса;

- иметь ввиду, что DMA имеет "приличное" время отклика на событие (порядка 12 тактов), поэтому очень короткие импульсы (с точность 100нс) отловить не получится.

 

Читать TIMER, DMA, EXTI.

Надеюсь, ясно описал)

 

PS. Кстати, может и не получится(

Чисто аппаратная реализация (без участия CPU) не всегда возможна.

Почему нельзя использовать прерывания?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тут такое дело: нет, период не важен. Он всегда будет одинаковый. Но ширина пульса разная может быть. Например пока ширина входного пульса меньше 1.5мс я не хочу чтобы срабатывало прерывание, но если вдруг ширина превысит скажем 1.5мс, мне нужно чтобы сработало прерывание.

 

дело в том что я не хочу отвлекать процессор кажтые 1.5мс на прерывание чтобы проверять ширину импульса. т.е. пусть это дело аппаратно работает, но только при вышеуказанном условии отвлечет процессор прерыванием.

 

 

понятно, тогда покопаюсь дальше, напишу. а так если есть еще какие идеи будет интерестно узнать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тут такое дело: нет, период не важен. Он всегда будет одинаковый. Но ширина пульса разная может быть. Например пока ширина входного пульса меньше 1.5мс я не хочу чтобы срабатывало прерывание, но если вдруг ширина превысит скажем 1.5мс, мне нужно чтобы сработало прерывание.

 

дело в том что я не хочу отвлекать процессор кажтые 1.5мс на прерывание чтобы проверять ширину импульса. т.е. пусть это дело аппаратно работает, но только при вышеуказанном условии отвлечет процессор прерыванием.

 

 

понятно, тогда покопаюсь дальше, напишу. а так если есть еще какие идеи будет интерестно узнать.

Для тактовой 168МГц 1.5мс это аж 252000 тактов.

Если процедура обработки займет 100 тактов, то проц будет нагружен на 0.04%.

Можно не заморачиваться и сделать обработку в прерывании.

Хотя есть одна уязвимость. Если на вход подать меандр с частотой мегагерц 10, то скорее всего все умрет.

Я бы сделал так:

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

2. Добавляете еще один (третий) канал сравнения на 1.5мс (и включаете ему прерывания).

3. При возникновении события по третьему каналу входим в прерывание и анализируем флаги в статусном регистре. Если флаг второго канала установлен, то спад от импульса пришел ранее 1.5мс и это короткий имульс - отбрасываем. Если флаг второго канала НЕ установлен, то спада импульса еще не было, и получается импульс шире 1.5мс - интересующий нас случай.

4. Можно показать, что сигналы короче 1.5мс (частота выше 666Гц) не будут вызывать прерывания. В самом хужшем случае прерывания будут каждые 1.5мс с указанной выше нагрузкой (порядка 0.04%).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...