2017-11-08 2 views
0

펄스를 카운트하는 데 타이머를 사용하는 것에 대해 질문이 있습니다 (단 하나의 핀) 방향에 대해서는 신경 쓰지 않습니다.STM32F7에서 펄스를 카운트하는 타이머를 사용

타이머 3을 사용하려고하는데 CubeMx에서 설정하는 방법을 모르겠습니다. HAL_TIM_Base_Start (mpEncoderTim) :

picture and text

나는 그것을 시작

그리고 다음으로 읽기 : count = mpEncoderTim-> Instance-> CNT;

당신의 힌트 나에게

사전에 감사와 안부 panduro을 줄 수 있도록의 사람이, 전에이 작업을 수행 한

희망 ..

답변

0

I'v 스테퍼와 유사한 문제의 어떤 종류가 있었다 모터. I'v는 (DRV8825, A4899 칩)을위한 스테퍼 드라이버 코드를 만들었고, 코드는 iRQ를 기반으로하고 모터 가속, 속도 등을 계산하는 수학을 사용했습니다. 그러나 그것이 정확한지 테스트해야했기 때문에 단계를 세워야했습니다. 테스트 케이스의 경우, 콘크리트 핀을 ETR (외부 트리거 입력)으로 설정했습니다. 입력 핀이므로 스테퍼 출력 핀이 해당 입력으로 이동합니다 (모터도 마찬가지 임). 그리고 각 상승 또는 하강 에지 (구성에 따라 다름)는 irq를 생성하므로, irq에서 귀하의 경우 펄스의 단계 카운터를 설정할 수 있습니다.

저는 cubeMX에 익숙하지 않아 대부분의 경우 직접 등록하거나 오래된 SPL (표준 주변 드라이버)을 사용하여 작성합니다. cubeMX 사용자가 읽을 수 있어야하므로 SPL과 어떻게 작동하는지 보여 드리겠습니다. 어쨌든

난 그냥 껄 구체적인 코드는 첫째

입력 핀 (단지 몇 개의 핀이 외부 트리거로 콘크리트 타이머 작업 할 수 있습니다 데이터 시트 읽기)를 구성 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); 
} 

그리고 펄스 카운팅을 할 수 있습니다.

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 :-(보다 높은 계산하지 않을 것

관련 문제