使用定时器计数STM32F7上的脉冲

时间:2017-11-08 09:52:02

标签: timer counter stm32

我有一个关于使用计时器来计算编码器脉冲(只有一个引脚)的问题我并不关心方向。

我尝试使用Timer 3,但我不确定如何在CubeMx中进行设置。

picture and text

我从以下开始: HAL_TIM_Base_Start(mpEncoderTim);

阅读: count = mpEncoderTim-> Instance-> CNT;

希望你们中的任何人以前做过这个,所以你们可以给我一个提示

提前感谢和最诚挚的问候 panduro ..

2 个答案:

答案 0 :(得分:0)

我和步进电机有类似的问题。我为(DRV8825,A4899芯片)制作了一个步进驱动程序代码,代码是基于iRQ的,并且有电机加速,速度等数学。但我必须测试它是否准确,所以我不得不计算步数。 对于测试案例,我将具体引脚配置为ETR(外部触发输入) - 它是输入引脚,我的步进输出引脚转到该输入,(当然也是电机)。每个上升或下降沿(取决于配置)都会产生一个irq,所以在irq我可以设置步数计数器,在你的情况下是脉冲。

我不熟悉cubeMX的东西,大多数时候我直接写注册或使用旧的SPL(标准外围驱动程序)。我将展示它如何与SPL一起工作,因为它应该对cubeMX用户更具可读性。

无论如何,我只是想表明基本的想法如何去做。这个具体的代码适用于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++;
    }

}

我用脉冲发生器对此代码进行了测试,它非常准确,可用于脉冲计数或频率测量。

答案 1 :(得分:0)

感谢。

我发现错误,计时器周期设置为0,因此计时器永远不会高于0: - (

最好的问候..