2015-10-16 1 views
0

Как добавить код сброса кода на изменение направления? счетчик протестирован с сигналом для шагового двигателя и работают хорошо, подсчета вверх и вниз, но предел 32767 после -32766 -32765 ..stm32 counter up/down и reset on change direction

для сброса на изменение направления я думаю, чтобы добавить эти строки:

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 кГц –

+0

Я создаю новую программу и с той же проблемой! –

+0

Я не уверен, что вы изменили в своей новой программе. Сможете ли вы обновить свой вопрос, чтобы отразить ваши изменения и ожидаемые результаты? – jayant