概述
我和步进电机有类似的问题。我为(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++;
}
}
我用脉冲发生器对此代码进行了测试,它非常准确,可用于脉冲计数或频率测量。
最后
以上就是高高茉莉为你收集整理的stmcubemx 脉冲计数_使用定时器计数STM32F7上的脉冲的全部内容,希望文章能够帮你解决stmcubemx 脉冲计数_使用定时器计数STM32F7上的脉冲所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复