C ARM编码器无法计数
我一直在尝试在我的ARM STM32F0芯片上使用一个编码器,但一直运气不佳 首先,我使用CaptureCallback和一些减法进行InputCapture,但这几乎产生了随机结果。因为我发现HAL代码中有一个编码器库,所以我应该可以在快乐的日子里使用它 我已经实现了每一种不同的方法,它们都基于相同的事实C ARM编码器无法计数,c,arm,stm32,hal,C,Arm,Stm32,Hal,我一直在尝试在我的ARM STM32F0芯片上使用一个编码器,但一直运气不佳 首先,我使用CaptureCallback和一些减法进行InputCapture,但这几乎产生了随机结果。因为我发现HAL代码中有一个编码器库,所以我应该可以在快乐的日子里使用它 我已经实现了每一种不同的方法,它们都基于相同的事实TIMx->CNT不返回一些计数寄存器,而是返回引脚状态。这就好像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;