Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
STM32 HAL核子F446RE正交编码器_Stm32_Encoder_Stm32f4_Nucleo_Cubemx - Fatal编程技术网

STM32 HAL核子F446RE正交编码器

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

我的手机定时器TIM3上的正交编码器模式有问题 / :

  • TIM3对第一个信号的每个上升沿进行计数。
    CNT
    寄存器向上计数,我用1Hz读取值,然后 我将寄存器设置为0

    当我看电视的时候 该频率是来自的值的一半高

    为什么?

  • TIM3在第一个信号的两侧计数。 这个 这是完全错误的

  • 我的配置是:

    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)有一个详细说明编码器模式如何工作的示意图

  • TIM3配置不正确导致的结果: 编码器模式(
    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

  • 每当1Hz“轮询计时器”过期时,它就会触发一个中断 (或轮询软件中的逻辑事件)
  • 此中断/事件的处理可能会稍微延迟, 取决于其他软件(IRQ:软件中其他地方的停用时间, 轮询:循环持续时间(直到轮询事件)
  • 软件读取
    CNT
  • 软件将
    CNT
    值重置为零, 由于已读取
    CNT
    值,因此丢弃进一步的增量
  • TIM3继续计数(从零开始)
  • 这意味着软件在(3.)和(4.)之间需要30µs,这在STM32F4上需要相当多的时间

    编辑:我刚刚重新检查了示波器屏幕截图。误差是可见的,但我相信它比我最初假设的要小(从图中计算侧面)