PROGCONT.RU

Форма входа







Регистрация Вход/

No No No

STM32F101-107 HAL Input filters цифровые фильтры на входах портов таймеров.

Назначение цифрового фильтра — это отделение помех от истинного сигнала на входе контроллера, например, возникающие при дребезге контактов. Многие пытаются реализовать такой фильтр аналоговым путём или программным, что усложняет схему устройства или программный код и замедляет работу контроллера. Разработчики ST позаботились об этой проблеме, создав на некоторых входах контроллера цифровые фильтры. Именно таймеры, у которых есть регистры Capture/Compare и вход TIMx_ETR, имеют на своих входах эти цифровые фильтры, назначение которых — пропускать сигнал не меньше определенной продолжительности для отфильтровки помех.

Ниже на схеме они выделены.

NO

Эти фильтры довольно-таки сложные устройства, но принцип их работы прост: фильтр захватывает сигнал, и если он будет держаться нужное время на входе или более, то он пропустится дальше в контроллер. Поподробней о работе фильтра: фильтр состоит из двух счётчиков — это счётчик захвата сигнала и счётчик фильтра или подтверждение сигнала. Счётчик захвата должен отсчитать время присутствия высокого сигнала на входе для его генерации на выходе в дальнейшем, так как фильтр пропускает сигнал не в реальном времени, а с задержкой. Второй счётчик — это подтверждение, который отсчитывает время, меньше которого сигнал не должен пропускаться, если он видит, что сигнал на входе держится неизменно нужное время, то сигнал пропускается дальше в контроллер. Пропущенный сигнал после того, как пропадёт на входе, будет до восстановлен из счётчика захвата для его повторения с входным сигналом.

Ещё подробней показано ниже.

Что такое FDTS и TDTS!

FDTS(Frequency Device Tree Source)-частота источника тактирования.

TDTS(Time Device Tree Source)-продолжительность одного такта источника тактирования.

Источник тактирования здесь тод же что и у рассматриваемого таймера.

Фильтрация сигнала FDTS/2 и N=6 для входа TIMx_CH1.

NO

Пример расчёта продолжительности сигнала для счётчика фильтра.

1.Тактирование таймера 8MHz это будет 1 / 8000000 = 125 наносекунд.

2.TDTS TIMx_CR1 CKD[1:0]=’01′ или htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV2; значит 125 наносекунды * 2 = 250 наносекунд.

3.TIMx_CCMR1 IC1F[3:0]=’0100′ или sConfig.IC1Filter = 4; находим параметр ниже в таблице 0100: fSAMPLING=fDTS/2, N=6 вычисляем 250 наносекунд * 2 * 6 = 3 микросекунды, сигнал меньше этой продолжительности не буде пропускаться фильтром.

Пример настройки входного фильтра.

Описание функций и параметров настройки фильтров находятся в статье.

Пример настройки таймера и фильтров.

static void MX_TIM2_Init(void){ TIM_Encoder_InitTypeDef sConfig = {0}; htim2.Instance = TIM2; /*Устанавливаем предделитель /2, одна риска один отсчёт*/ htim2.Init.Prescaler = 1; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; /*Устанавливаем ограничение счёта до 15*/ htim2.Init.Period = 14; /*Устанавливаем масимальный делитель для входных фильтров*/ htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV2; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; sConfig.EncoderMode = TIM_ENCODERMODE_TI1; sConfig.IC1Polarity = TIM_ICPOLARITY_RISING; sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI; sConfig.IC1Prescaler = TIM_ICPSC_DIV1; /*Устанавливаем максимально продолжительный сигнал для входного фильтра входа 1*/ sConfig.IC1Filter = 4; sConfig.IC2Polarity = TIM_ICPOLARITY_RISING; sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI; sConfig.IC2Prescaler = TIM_ICPSC_DIV1; /*Устанавливаем максимально продолжительный сигнал для входного фильтра входа 2*/ sConfig.IC2Filter = 4; HAL_TIM_Encoder_Init(&htim2, &sConfig); }

htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV2 - делитель(на рисунке выше строка TDTS TIMx_CR1 CKD[1:0]=’01′) для всех фильтров таймера входы Capture/Compare и вход TIMx_ETR, за это отвечает регистр TIMx_CR1 биты CKD.

Варианты .Init.ClockDivision = TIM_CLOCKDIVISION_DIV1 TIM_CLOCKDIVISION_DIV2 TIM_CLOCKDIVISION_DIV4

sConfig.IC1Filter = 4 и sConfig.IC2Filter = 4 - установка делителя для счётчика времени подтверждения(рисунок выше строка TIMx_CCMR1 IC1F[3:0]=’0100′) и продолжительность N времени подтверждения сигнала(на рисунке выше строка Счётчик фильтра N=6), настраиваются в регистре TIMx_CCMR1 биты IC1F и IC2F. Для sConfig.IC3Filter, sConfig.IC4Filter регистр TIMx_CCMR2 биты IC3F и IC4F.

Варианты для входов Capture/Compare sConfig.IC1Filter, sConfig.IC2Filter, sConfig.IC3Filter и sConfig.IC4Filter = 0000: No filter, sampling is done at fDTS 0001: fSAMPLING=fCK_INT, N=2 0010: fSAMPLING=fCK_INT, N=4 0011: fSAMPLING=fCK_INT, N=8 0100: fSAMPLING=fDTS/2, N=6 0101: fSAMPLING=fDTS/2, N=8 0110: fSAMPLING=fDTS/4, N=6 0111: fSAMPLING=fDTS/4, N=8 1000: fSAMPLING=fDTS/8, N=6 1001: fSAMPLING=fDTS/8, N=8 1010: fSAMPLING=fDTS/16, N=5 1011: fSAMPLING=fDTS/16, N=6 1100: fSAMPLING=fDTS/16, N=8 1101: fSAMPLING=fDTS/32, N=5 1110: fSAMPLING=fDTS/32, N=6 1111: fSAMPLING=fDTS/32, N=8 Варианты для TIMx_ETR входа 0000: No filter, sampling is done at fDTS 0001: fSAMPLING=fCK_INT, N=2 0010: fSAMPLING=fCK_INT, N=4 0011: fSAMPLING=fCK_INT, N=8² 0100: fSAMPLING=fDTS/2, N=6 0101: fSAMPLING=fDTS/2, N=8 0110: fSAMPLING=fDTS/4, N=6² 0111: fSAMPLING=fDTS/4, N=8 1000: fSAMPLING=fDTS/8, N=6 1001: fSAMPLING=fDTS/8, N=8 1010: fSAMPLING=fDTS/16, N=5 1011: fSAMPLING=fDTS/16, N=6 1100: fSAMPLING=fDTS/16, N=8 1101: fSAMPLING=fDTS/32, N=5 1110: fSAMPLING=fDTS/32, N=6 1111: fSAMPLING=fDTS/32, N=8


Комментариев нет  Только зарегистрированные пользователи могут оставлять комментарии!