STM32 HAL核子F446RE正交编码器
我的手机定时器TIM3上的正交编码器模式有问题 / :STM32 HAL核子F446RE正交编码器,stm32,encoder,stm32f4,nucleo,cubemx,Stm32,Encoder,Stm32f4,Nucleo,Cubemx,我的手机定时器TIM3上的正交编码器模式有问题 / : TIM3对第一个信号的每个上升沿进行计数。 CNT寄存器向上计数,我用1Hz读取值,然后 我将寄存器设置为0 当我看电视的时候 该频率是来自的值的一半高 为什么? TIM3在第一个信号的两侧计数。 这个 这是完全错误的 我的配置是: GPIO_InitTypeDef sInitEncoderPin1; sInitEncoderPin1.Pin = pin1Encoder.pin; // A GPIO
CNT
寄存器向上计数,我用1Hz读取值,然后
我将寄存器设置为0
当我看电视的时候
该频率是来自的值的一半高
为什么?GPIO_InitTypeDef sInitEncoderPin1;
sInitEncoderPin1.Pin = pin1Encoder.pin; // A GPIO_PIN_6
sInitEncoderPin1.Mode = GPIO_MODE_AF_PP;
sInitEncoderPin1.Pull = GPIO_PULLUP;
sInitEncoderPin1.Speed = GPIO_SPEED_HIGH;
sInitEncoderPin1.Alternate = altFunctionEncoder; // GPIO_AF2_TIM3
GPIO_InitTypeDef sInitEncoderPin2;
sInitEncoderPin2.Pin = pin2Encoder.pin; // A GPIO_PIN_7
sInitEncoderPin2.Mode = GPIO_MODE_AF_PP;
sInitEncoderPin2.Pull = GPIO_PULLUP;
sInitEncoderPin2.Speed = GPIO_SPEED_HIGH;
sInitEncoderPin2.Alternate = altFunctionEncoder; // GPIO_AF2_TIM3
HAL_GPIO_Init(GPIOA, &sInitEncoderPin1);
HAL_GPIO_Init(GPIOA, &sInitEncoderPin2);
encoderTimer.Init.Period = 0xffff;
encoderTimer.Init.Prescaler = 0;
encoderTimer.Init.CounterMode = TIM_COUNTERMODE_UP;
encoderTimer.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
encoderTimer.Init.RepetitionCounter = 0;
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 1);
encoder.EncoderMode = TIM_ENCODERMODE_TI1;
encoder.IC1Filter = 0x0f;
encoder.IC1Polarity = TIM_INPUTCHANNELPOLARITY_RISING; // TIM_INPUTCHANNELPOLARITY_BOTHEDGE
encoder.IC1Prescaler = TIM_ICPSC_DIV1;
encoder.IC1Selection = TIM_ICSELECTION_DIRECTTI;
encoder.IC2Filter = 0x0f;
encoder.IC2Polarity = TIM_INPUTCHANNELPOLARITY_RISING;
encoder.IC2Prescaler = TIM_ICPSC_DIV1;
encoder.IC2Selection = TIM_ICSELECTION_DIRECTTI;
HAL_TIM_Encoder_Init(&encoderTimer, &encoder);
HAL_TIM_Encoder_Start_IT(&encoderTimer, TIM_CHANNEL_ALL);
显示的频率约为416 Hz
encoder.EncoderMode = TIM_ENCODERMODE_TI1;
选择“X2分辨率编码器模式”,该模式计算每个信号周期的2个CNT
增量。
在申请须知中
,
(第4.3.4节/图7)有一个详细说明编码器模式如何工作的示意图TIM_ENCODERMODE_TI1
)假设两个通道仅在定向侧面以交替方式触发(请参阅上面的an链接)
如果两个通道中的一个由于以下原因触发两倍的事件:
配置
encoder.IC1Polarity = TIM_INPUTCHANNELPOLARITY_BOTHEDGE,
计数器将只计算一个位置,然后“识别”一个“反转”事件(=方向改变)。
记住
65535u = 0xFFFF = -1
第二个屏幕截图仅显示值-1、0、+1,这与此解释完全相符问题仍然是为什么第一个屏幕截图显示了
800
和822
之间的(可再现)测量值。
我想
- 编码器信号的物理源以恒定的速度运行
- 触发外壳输出的1 Hz定时器独立于TIM3,并且
- 它已在编码器定时器之前启动 (即,在所示代码示例上方)
0
:TIM3尚未启动。545
:TIM3已在shell输出计时器期间启动)。
丢弃前两个测量样本,测量信号频率的平均值和标准偏差分别为
8089091+/-05950[X2每秒增量]
4044545+/-02975[Hz]
这相当于一段时间
24331+/-0003[ms]
因此,测得的频率过低约11 Hz,即测得的周期过高近30µs,且该误差明显超出统计噪声
问题给出了此错误可能来自何处的提示:
CNT寄存器计数,我用1 Hz读取值,然后将寄存器设置为0
CNT
值CNT
值重置为零,
由于已读取CNT
值,因此丢弃进一步的增量