2015-10-16 203 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