現在STM32F4をSTM32F429ZI Nucleo-144 Boardで使用しています。私は、このマイクロコントローラを使用して、直交エンコーダインタフェースを介してロータリエンコーダの位置を評価しようとしています。ドキュメントを見ると、これはタイマーで行われます。私はA/Bエンコーダの出力をマイクロのPA6とPC7に接続していますが、カウントがドリフトしているように見えます。STM32F4エンコーダーの数が変化しない場合
デバッグ中に、エンコーダ出力の1つをマイクロコントローラに接続してモータを動かすと、エンコーダラインの1つだけが接続されていてもカウントが増減することに気付きました。私はTI1とTI2の両方のエッジをカウントしているので、これは起こってはいけません。下の図を正しく読んでいると、私のラインの1つが内部プルアップを使ってハイに保持されているため、他の入力のクロックパルスは上下/上下に移動し、2つの異なるカウント間でサイクリングする必要があります。ただし、エンコーダを回転させている場合、カウントは方向に応じて増減し続けます。
1つのエンコーダ入力のみでエンコーダカウントが変化するのはなぜですか?私はまた、コードだけでなく、アクティブなカウントが1つだけであることを証明するためにスコープトレースを添付しています。
EDIT:私はまた、両エッジから上昇エッジに極性を変えようとしましたが、認識される利点はありません。さらなる調査の際
#include "stm32f4xx_hal.h"
#include "encoder_test.h"
GPIO_InitTypeDef GPIO_InitStruct;
TIM_HandleTypeDef Timer_InitStruct;
TIM_Encoder_InitTypeDef Encoder_InitStruct;
void EncoderTest_Init()
{
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_TIM3_CLK_ENABLE();
/**TIM3 GPIO Configuration
PA6 ------> TIM3_CH1
PC7 ------> TIM3_CH2
*/
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
Timer_InitStruct.Instance = TIM3;
Timer_InitStruct.Init.Period = 0xFFFF;
Timer_InitStruct.Init.CounterMode = TIM_COUNTERMODE_UP;
Timer_InitStruct.Init.Prescaler = 1;
Timer_InitStruct.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
Encoder_InitStruct.EncoderMode = TIM_ENCODERMODE_TI12;
Encoder_InitStruct.IC1Filter = 0x00;
Encoder_InitStruct.IC1Polarity = TIM_INPUTCHANNELPOLARITY_BOTHEDGE;
Encoder_InitStruct.IC1Prescaler = TIM_ICPSC_DIV1;
Encoder_InitStruct.IC1Selection = TIM_ICSELECTION_DIRECTTI;
Encoder_InitStruct.IC2Filter = 0x00;
Encoder_InitStruct.IC2Polarity = TIM_INPUTCHANNELPOLARITY_BOTHEDGE;
Encoder_InitStruct.IC2Prescaler = TIM_ICPSC_DIV1;
Encoder_InitStruct.IC2Selection = TIM_ICSELECTION_DIRECTTI;
if (HAL_TIM_Encoder_Init(&Timer_InitStruct, &Encoder_InitStruct) != HAL_OK)
{
while (1);
}
if (HAL_TIM_Encoder_Start_IT(&Timer_InitStruct, TIM_CHANNEL_1) != HAL_OK)
{
while (1);
}
}
void TIM3_IRQHandler()
{
HAL_TIM_IRQHandler(&Timer_InitStruct);
}
それはインクリメンタルエンコーダのように見えます。アングルを把握する必要がある場合、アブソリュートロータリーエンコーダが最適ですか?最初の位置からポジションを評価することはできますが(それがわかっている場合)、ある時点で割り込みを逃してカウントを失うことになります – Emilien