C ARM编码器无法计数

C ARM编码器无法计数,c,arm,stm32,hal,C,Arm,Stm32,Hal,我一直在尝试在我的ARM STM32F0芯片上使用一个编码器,但一直运气不佳 首先,我使用CaptureCallback和一些减法进行InputCapture,但这几乎产生了随机结果。因为我发现HAL代码中有一个编码器库,所以我应该可以在快乐的日子里使用它 我已经实现了每一种不同的方法,它们都基于相同的事实TIMx->CNT不返回一些计数寄存器,而是返回引脚状态。这就好像HAL库没有正确配置内部计数器,但也有可能我只是犯了一个错误。如果有人能指导我,我将不胜感激。下面我粘贴了一些配置/示例,以帮

我一直在尝试在我的ARM STM32F0芯片上使用一个编码器,但一直运气不佳

首先,我使用CaptureCallback和一些减法进行InputCapture,但这几乎产生了随机结果。因为我发现HAL代码中有一个编码器库,所以我应该可以在快乐的日子里使用它

我已经实现了每一种不同的方法,它们都基于相同的事实
TIMx->CNT
不返回一些计数寄存器,而是返回引脚状态。这就好像HAL库没有正确配置内部计数器,但也有可能我只是犯了一个错误。如果有人能指导我,我将不胜感激。下面我粘贴了一些配置/示例,以帮助展示我正在做什么

设置

定义:

/* 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:

抓取仅返回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\u CH1\u ETR

PA1-TIM2_CH2

PA2-TIM2_CH3

PA3-TIM2_CH4

HAL_状态类型定义HAL_TIM_编码器启动(TIM_HandletTypedef*htim, uint32(t频道)

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

显然,HAL库中的这个注释试图告诉我的是编码器模块只在通道1和通道2上工作。通道3和4不与编码器库一起工作。然而,在HAL库实现中,这一限制似乎受到了任意限制,因为STM32数据表中唯一提到的编码器支持就是这一点

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


这一个对我来说很有用:对于a和B信号的标准光学编码。我实际上在前面看到了你的答案,并尝试了一下。目前,我有一个PWM驱动器的TIM3,但我做了一个类似的设置与TIM1。由于某些原因,我的设置的内部计数器部分不计数,而只是读取pin状态。我尝试了一些方法来让计数器计数,但是编码器库从来都不起作用(平面计时器有点起作用)。为了进行测试,我将一个按钮连接到其中一个GPIO并读取CNT的值,根据引脚状态,它总是0或1。如果错误也可以纠正,但我认为编码器库的要点是不需要第二次计时?
GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2;
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;