ARM编码器无法计数

时间:2018-04-28 00:58:37

标签: c arm stm32 hal

我一直试图在我的ARM STM32F0芯片上使用编码器,并且运气不好。

首先,我使用CaptureCallback和一些减法进入InputCapture但产生了几乎随机的结果。因为我发现在HAL代码中有一个编码器库所以我应该能够在快乐的日子里拍打它。 Example 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);

Datasheet for my specific chip

1 个答案:

答案 0 :(得分:0)

对于那些面临类似问题的人,我发现了解决方案。

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频道)

     

启动TIM编码器接口。参数:htim:TIM编码器   接口句柄通道:要启用的TIM通道此参数   可以是以下值之一:•TIM_CHANNEL_1:TIM通道1   选择
  •TIM_CHANNEL_2:TIM通道2已选中
  •TIM_CHANNEL_ALL:   选择TIM通道1和TIM通道2

显然,HAL库中的这个注释试图告诉我的是编码器模块仅适用于通道1和2.通道3和4不适用于编码器库。但是,似乎这个限制在HAL库实现中是任意限制的,因为在STM32数据表中仅提到编码器支持就是这个。

  

这些定时器能够处理正交(增量)编码器   信号和1到3个霍尔效应传感器的数字输出