ARM Encoder 无法计数
ARM Encoder fails to count
我一直在尝试使用我的 ARM STM32F0 芯片上的编码器,但运气一直为 0。
首先,我使用 CaptureCallback 和一些减法来降低 InputCapture,但这产生了几乎随机的结果。因为我发现 HAL 代码中有一个编码器库,所以我应该能够在快乐的日子里拍打它。 Example 1 2 3
我已经实施了这些不同的方法中的每一种,但它们都基于相同的事实而瘫痪。 TIMx->CNT
不是 return 一些计数寄存器而是 return 引脚状态。好像 HAL 库没有正确配置内部计数器,但也有可能我只是犯了一个错误。如果有人可以指导我,我将不胜感激。下面我粘贴了一些我的 config/examples 以帮助展示我在做什么。
设置
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);
}
抓取只有 returning pin 状态的数据
transmitBufferSize = snprintf((char *)aTxBuffer, 64, "cnt: %d\n\r", TIMENC->CNT);
对于那些面临类似问题的人,我找到了解决方案。
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 )
Starts the TIM Encoder Interface. Parameters: htim : TIM Encoder
Interface handle Channel : TIM Channels to be enabled This parameter
can be one of the following values: •TIM_CHANNEL_1: TIM Channel 1
selected
•TIM_CHANNEL_2: TIM Channel 2 selected
•TIM_CHANNEL_ALL:
TIM Channel 1 and TIM Channel 2 are selected
显然,HAL 库中的这条注释试图告诉我编码器模块仅适用于通道 1 和 2。通道 3 和 4 不适用于编码器库。然而,似乎这个限制在 HAL 库实现中是任意限制的,因为 STM32 数据表上唯一提到的编码器支持是这样的。
These timers are capable of handling quadrature (incremental) encoder
signals and the digital outputs from 1 to 3 hall-effect sensors
我一直在尝试使用我的 ARM STM32F0 芯片上的编码器,但运气一直为 0。
首先,我使用 CaptureCallback 和一些减法来降低 InputCapture,但这产生了几乎随机的结果。因为我发现 HAL 代码中有一个编码器库,所以我应该能够在快乐的日子里拍打它。 Example 1 2 3
我已经实施了这些不同的方法中的每一种,但它们都基于相同的事实而瘫痪。 TIMx->CNT
不是 return 一些计数寄存器而是 return 引脚状态。好像 HAL 库没有正确配置内部计数器,但也有可能我只是犯了一个错误。如果有人可以指导我,我将不胜感激。下面我粘贴了一些我的 config/examples 以帮助展示我在做什么。
设置
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);
}
抓取只有 returning pin 状态的数据
transmitBufferSize = snprintf((char *)aTxBuffer, 64, "cnt: %d\n\r", TIMENC->CNT);
对于那些面临类似问题的人,我找到了解决方案。
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 )
Starts the TIM Encoder Interface. Parameters: htim : TIM Encoder Interface handle Channel : TIM Channels to be enabled This parameter can be one of the following values: •TIM_CHANNEL_1: TIM Channel 1 selected
•TIM_CHANNEL_2: TIM Channel 2 selected
•TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected
显然,HAL 库中的这条注释试图告诉我编码器模块仅适用于通道 1 和 2。通道 3 和 4 不适用于编码器库。然而,似乎这个限制在 HAL 库实现中是任意限制的,因为 STM32 数据表上唯一提到的编码器支持是这样的。
These timers are capable of handling quadrature (incremental) encoder signals and the digital outputs from 1 to 3 hall-effect sensors