При генерации выходных сигналов ШИМ мы используем функцию «сравнения» регистра захвата / сравнения. В этом разделе мы обсуждаем «захват». Регистры захвата обеспечивают механизм для контроля входного контакта и на основе запрограммированного фронта фиксируют текущее значение соответствующего счетчика таймера. Основная цель регистров захвата состоит в том, чтобы позволить измерять относительно времени, когда происходят события. Для измерения длительности импульса можно привязать несколько регистров захвата к одному входу, фиксируя время нарастания и спада фронтов. Можно использовать входные события для сброса счетчика таймера, использования входных значений для включения счетчика таймера и синхронизации нескольких таймеров. В этом разделе рассмотрим, как захват ввода можно использовать вместе с выходом ШИМ для управления общедоступными устройствами ультразвукового диапазона, такими как показано на рисунке.
Ультразвуковой дальномер HC-SR04 имеет разрешение 3 мм в диапазоне 20-500 мм. Требуется питание 5 В. В процессе работы модуль запускается путем подачи импульса 10 мкс. Некоторое время спустя генерируется импульс «эха», длина которого пропорциональна измеренному расстоянию и определяется следующей формулой, где pw — импульс эха.
distance = pw ∗ cm/58µs
Если расстояние меньше 20 мм или больше 500 мм, возвращается импульс 38 мс. Внутренне схема ультразвукового контроллера генерирует 8-импульсный сигнал 40 кГц, который приводит в действие преобразователь.
В дальнейшем мы опишем использование двух таймеров — одного для вывода и одного для ввода — для полностью автономного управления ультразвуковым сенсором. Это означает, что после настройки таймеров приложение должно только прочитать регистр захвата, чтобы узнать самое последнее измерение расстояния. С добавлением прерываний приложение может уведомлять о появлении нового измерения. Здесь мы используем непрерывный процесс измерения. Обратите внимание, что при использовании нескольких модулей сенсора желательно, чтобы они не были активными непрерывно. С небольшим количеством внешнего оборудования и несколькими выводами GPIO можно мультиплексировать оборудование синхронизации для управления произвольным числом модулей измерения с двумя таймерами.
Как уже упоминалось, мы используем два таймера — один для генерации импульса запуска и один для измерения импульса эха. Мы рассмотрели, как генерировать выходной сигнал с широтно-импульсной модуляцией в посте ранее, и теперь мы в качестве упражнения будем использовать таймер TIM4 и контака PB9 для генерации импульсов запуска с частотой 10 Гц.
Для измерения импульса эха мы будем использовать таймер TIM1, подключенный к PA8. Архитектура различных таймеров довольно сложна. Мы будем использовать две ключевые концепции:
- Пары регистров захвата (1,2) и (3,4) могут быть «связаны», чтобы обеспечить захват на противоположных краях одного входа.
- Счетчики таймера могут быть сконфигурированы как ведомые для захвата входов 1 и 2, например, для сброса счетчика при указанном входном событии.
Детали настройки регистров захвата могут быть довольно сложными, далее мы будем ссылаться на упрощенную модель, показанную на рисунке ниже. На этом рисунке показаны два регистра захвата и функциональный путь от входов (t1 и t2). Входы (опционально) фильтруются и сигналы генерируются по нарастающему и спадающему фронту. Любой из четырех граничных сигналов может быть выбран и после (необязательно) деления использован для запуска события захвата. Таким образом, регистр захвата (канал) 1 или 2 может быть загружен по нарастающим или спадающим фронтам на входе t1 или t2. Кроме того, два сигнала TI1FP1 и TI2FP2 могут использоваться, например, для управления счетчиком таймера, вызывая его сброс на выбранном входном фронте.
Чтобы настроить TIM1 для измерения импульса ультразвукового эха, мы должны сделать следующее (в дополнение к выводу, настройке и распределению тактовых импульсов!):
- Настройть прескалер TIM1 и период.
- Сконфигурировать канал 1, чтобы зафиксировать таймер на восходящем входе в t1.
- Сконфигурировать канал 2, чтобы зафиксировать таймер на падающем входе в t2.
- Сконфигурировать TIM1 в slave mode, чтобы сбросить событие захвата 1.
Задача идентична задаче для генерации триггера; хотя вы можете использовать более длительный период. Конфигурация для канала 1 следующая:
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = 0; TIM_ICInitStructure.TIM_ICFilter = 0; TIM_ICInit(TIM1, &TIM_ICInitStructure);
Мы не требуем фильтрации или предварительного масштабирования (деления) входного сигнала. Мы хотим захватить на растущих фронтах, используя вход T1. Конфигурирование канала 2 имеет следующие отличия:
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;
Наконец, мы должны настроить подчиненный режим таймера с TI1FP1 в качестве сигнала сброса:
TIM_SelectInputTrigger(TIM1, TIM_TS_TI1FP1); TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Reset); TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);


