ARM Encoder не может считать

Я пытался работать с кодировщиком на своем чипе ARM STM32F0, и мне не повезло.

Сначала я прошел InputCapture, используя CaptureCallback и некоторое вычитание, но это дало почти случайные результаты. Поскольку я узнал, что внутри кода HAL есть библиотека кодировщика, я должен просто иметь возможность похлопать ее и счастливых дней. Пример 1 2 3

Я реализовал каждый из этих разных методов, и все они наносят вред одному и тому же факту. TIMx->CNT не возвращает какой-либо счетный регистр, а вместо этого возвращает состояние вывода. Как будто библиотека HAL неправильно настраивает внутренний счетчик, но также возможно, что я просто делаю ошибку. Если бы кто-то мог направить меня, я был бы очень признателен. Ниже я вставил некоторые из моих конфигураций/примеров, чтобы показать, что я делаю.

Настраивать

  Tim_ENCHandle.Instance = TIMENC;
  Tim_ENCHandle.Init.Period = 0xFFFF;
  Tim_ENCHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
  Tim_ENCHandle.Init.Prescaler = 0;
  Tim_ENCHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

  encConfig.EncoderMode = TIM_ENCODERMODE_TI12;

  encConfig.IC1Filter = 0x0F;
  encConfig.IC1Polarity = TIM_INPUTCHANNELPOLARITY_RISING;
  encConfig.IC1Prescaler = TIM_ICPSC_DIV1;
  encConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;

  encConfig.IC2Filter = 0x0F;
  encConfig.IC2Polarity = TIM_INPUTCHANNELPOLARITY_FALLING;
  encConfig.IC2Prescaler = TIM_ICPSC_DIV1;
  encConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;


  if (HAL_TIM_Encoder_Init(&Tim_ENCHandle, &encConfig) != HAL_OK) {
    Error_Handler();
  }

  if(HAL_TIM_Encoder_Start_IT(&Tim_ENCHandle,TIM_CHANNEL_ALL)!=HAL_OK){
    Error_Handler();
  } 

определяет:

/* Definition for TIMENC clock resources */
#define TIMENC                           TIM2
#define TIMENC_CLK_ENABLE()              __HAL_RCC_TIM2_CLK_ENABLE()

#define TIMENC_CHANNEL_GPIO_PORT()       __HAL_RCC_GPIOA_CLK_ENABLE()
#define TIMENC_GPIO_PORT                 GPIOA
#define TIMENC_GPIO_PIN_CHANNEL1         GPIO_PIN_1
#define TIMENC_GPIO_AF_TIMx              GPIO_AF2_TIM2

#define TIMENC_IRQn                      TIM2_IRQn
#define TIMENC_IRQHandler                TIM2_IRQHandler

MSP:

void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim) {
 GPIO_InitTypeDef GPIO_InitStruct;
  TIMENC_CLK_ENABLE();
  TIMENC_CHANNEL_GPIO_PORT();

  GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  GPIO_InitStruct.Alternate = TIMENC_GPIO_AF_TIMx;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  HAL_NVIC_SetPriority(TIMENC_IRQn, 0, 1);

  HAL_NVIC_EnableIRQ(TIMENC_IRQn);
}

Захватить данные, которые возвращают только состояние контакта

transmitBufferSize = snprintf((char *)aTxBuffer, 64, "cnt: %d\n\r", TIMENC->CNT);

Техническое описание моего конкретного чипа


person arduic    schedule 28.04.2018    source источник
comment
Это сработало для меня: electronics.stackexchange.com/a/296093/56348 для стандартного оптического кодирования с A и сигналы В.   -  person Bence Kaulics    schedule 29.04.2018
comment
Я действительно видел ваш ответ ранее и попробовал. В настоящее время у меня есть TIM3 для драйвера PWM, но я сделал аналогичную настройку с TIM1. По какой-то причине внутренний счетчик моей установки не считает, а просто считывает состояние вывода. Я пробовал несколько вещей, чтобы счетчик хорошо считал, но библиотека кодировщика никогда не работает (таймер плоскости работал вроде). Для проверки я подключил кнопку к одному из GPIO и прочитал значение CNT, оно всегда равно 0 или 1 в зависимости от состояния контакта. Также исправьте, если неправильно, но я думал, что цель библиотеки кодировщика заключалась в том, чтобы не требовать второго TIM для синхронизации?   -  person arduic    schedule 30.04.2018


Ответы (1)


Для тех, кто сталкивается с подобной проблемой, я нашел решение.

GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2;

Вместо этого должно быть

GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;

Из таблицы данных STM и примечаний к библиотеке HAL.

PA0 - TIM2_CH1_ETR

PA1 - TIM2_CH2

PA2 - TIM2_CH3

PA3 - TIM2_CH4

HAL_StatusTypeDef HAL_TIM_Encoder_Start (TIM_HandleTypeDef * htim, uint32_t Channel)

Запускает интерфейс кодировщика TIM. Параметры: htim : дескриптор интерфейса TIM Encoder Channel : каналы TIM, которые необходимо включить. Этот параметр может принимать одно из следующих значений: •TIM_CHANNEL_1: выбран канал TIM 1
•TIM_CHANNEL_2: выбран канал TIM 2
•TIM_CHANNEL_ALL: канал TIM 1 и TIM Channel 2 выбраны

По-видимому, эта заметка в библиотеке HAL пыталась мне сказать, что модуль энкодера работает только на каналах 1 и 2. Каналы 3 и 4 не работают с библиотекой энкодера. Однако кажется, что это ограничение произвольно ограничено в реализации библиотеки HAL, потому что единственное упоминание о поддержке кодировщика в техническом описании STM32 — это.

Эти таймеры могут обрабатывать квадратурные (инкрементальные) сигналы энкодера и цифровые выходы от 1 до 3 датчиков Холла.

person arduic    schedule 11.06.2018