2017-11-08 20 views
0

タイマを使用してエンコーダからパルスをカウントすることについての質問があります(1つのピンのみ)。タイマを使用してSTM32F7のパルスをカウントする

私はタイマー3を使用しようとしていますが、CubeMxでセットアップする方法がわかりません。

picture and text

私はそれを起動します。 HAL_TIM_Base_Start(mpEncoderTim)。

そして次のように読んでください: count = mpEncoderTim-> Instance-> CNT;あなたが私にヒントを与えることができるように

希望あなたの誰もが、I'vは、ステッパーと同様の問題のいくつかの種類を持っていた..前

答えて

0

事前に感謝し、よろしく panduroこれを行っていますモーター。私は(DRV8825、A4899チップ)のステッパードライバーコードを作成し、コードはiRQベースで、モーターの加速、スピードなどの計算をしました。しかし、正確かどうかをテストしなければならなかったので、ステップ数を数えなければなりませんでした。 テストケースの場合、コンクリートピンをETR(外部トリガ入力)として設定しました。これは入力ピンですが、私のステッパー出力ピンはその入力に行きます(もちろんモータにも行きます)。そして、それぞれの立ち上がりまたは立ち下がりエッジ(設定に依存します)はirqを生成します。したがって、irqでは、あなたのケースのパルスでステップカウンタを設定することができます。

私はcubeMXに精通していません。ほとんどの場合、古いSPL(標準的なペリフェラルドライバ)を登録したり使用したりするために直接書きます。私はcubeMXユーザーにとってより読みやすいはずなので、SPLとどのように動作するかを示します。とにかく

私はちょうどit.This具体的なコードはまず

入力端子(わずか数のピンが外部トリガとして、コンクリートタイマーで動作することができますデータシート読む)を設定STM32f030上で動作行う方法を基本的な考え方を示すようにしてみてください

void digital_input_config (void){ 

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); 
    GPIO_InitTypeDef GPIO_InitStructure; 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; 
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
    GPIO_Init(GPIOA,&GPIO_InitStructure); 
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_2); 
} 

ここでタイマー設定が必要です。タイマーごとにETRとピンが異なるため、STM32 MCUによって異なります。データシートを正確に読み取る必要があります。

void enable_capture_TIM1(void){ 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); 
    TIM_ETRClockMode2Config(TIM1,TIM_ExtTRGPSC_DIV_NONE,TIM_ExtTRGPolarity_NonInverted,0x00); 
    TIM_SelectInputTrigger(TIM1,TIM_TS_ETRF); 
    TIM_SelectSlaveMode(TIM1,TIM_SlaveMode_Trigger); 

    NVIC_InitTypeDef NVIC_InitStruct; 
    NVIC_InitStruct.NVIC_IRQChannel = TIM1_BRK_UP_TRG_COM_IRQn; 
    NVIC_InitStruct.NVIC_IRQChannelPriority = 0; 
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; 
    NVIC_Init(&NVIC_InitStruct); 
    TIM_Cmd(TIM1, ENABLE); 
    TIM_ITConfig(TIM1, TIM_IT_Trigger, ENABLE); 
} 

そして、IRQではパルスカウントが可能です。

void TIM1_BRK_UP_TRG_COM_IRQHandler(void){ 

    if(TIM_GetITStatus(TIM1, TIM_IT_Trigger) != RESET) { 
     TIM_ClearITPendingBit(TIM1, TIM_IT_Trigger); 
     PulseCNT++; 
    } 

} 

このコードをパルスジェネレータでテストしたところ、実際には正確でパルスカウントや周波数測定に使用できます。

0

ありがとうございました。

私はタイマー期間が0に設定し、エラーを発見したので、タイマーが0

:-(よろしくよりも高いを数えることはない..

関連する問題