2015-10-16 274 views
0

如何在此代碼中添加重置更改方向? 計數器與信號對步進電機和工作很好的測試, 計數是向上和向下但限制-32766 -32765後爲32767 ..stm32計數器向上/向下和在更改方向上重置

用於在變化方向復位我認爲添加此行:

TIM_SlaveConfigTypeDef SlaveModeselect 
TIM_MasterConfigTypeDef MasterConfig 

SlaveModeselect.SlaveMode = .... 
SlaveModeselect.InputTrigger = TIM_TS_TI1FP1 

MasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_...... 
MasterConfig.MasterOutputTrigger = ..... 

HAL_TIM_SlaveConfigSynchronization(&timer, &SlaveModeselect) 
HAL_TIMEx_MasterConfigSynchronization(&timer, &MasterConfig) 

當前代碼:

#include "mbed.h" 
#include "stm32f4xx.h" 
#include "stm32f4xx_hal_tim_ex.h" 

TIM_HandleTypeDef timer; 
TIM_Encoder_InitTypeDef encoder; 

//direction to PA_9 -- step pulse to PA_8 

int main(){ 
    GPIO_InitTypeDef GPIO_InitStruct; 
     __TIM1_CLK_ENABLE(); 
     __GPIOA_CLK_ENABLE(); 
     GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9; 
     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; 
     GPIO_InitStruct.Pull = GPIO_PULLDOWN; 
     GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; 
     GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; 
     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 

    timer.Instance = TIM1; 
    timer.Init.Period = 0xffff; 
    timer.Init.Prescaler = 1; 
    timer.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; 
    timer.Init.CounterMode = TIM_COUNTERMODE_UP; 

    encoder.EncoderMode = TIM_ENCODERMODE_TI1; 
    encoder.IC1Filter = 0x0f; 
    encoder.IC1Polarity = TIM_INPUTCHANNELPOLARITY_RISING; 
    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_INDIRECTTI; 

    HAL_TIM_Encoder_Init(&timer, &encoder); 
    HAL_TIM_Encoder_Start(&timer,TIM_CHANNEL_1); 


    TIM1->EGR = 1;   // Generate an update event 
    TIM1->CR1 = 1;   // Enable the counter 


while (1) { 
     int16_t count1; 
     count1=TIM1->CNT; 

     printf("%d\r\n", count1); 
     wait(1.0); 

}; 
} 
+0

這段代碼如何倒數?根據我的理解,你只能計數,即TIM1-> CNT只會增加。那麼我的理解是否正確:在達到32767之後,你想去0而不是-32766? – jayant

回答

1

使用uint16_t count1代替int16_t有你的計數器計數到65535,然後重置爲0時,有一個溢出。

+0

這是正確的,但我需要重置計數器的每個方向更改 中斷不是很好的解決方案,因爲步/方向信號非常快> 200 kHz –

+0

我使新程序和同樣的問題! –

+0

我不確定你在新程序中改變了什麼。你能否更新你的問題以反映你的變化以及你期望的結果? – jayant