您好,是可以的,在编码器时,使用计数器溢出中断。给个参考程序,您试一下。[AppleScript] 纯文本查看 复制代码 //TIM2_Encoder_Init,Tim2_CH1(PA0);Tim2_CH2(PA1)
//arr:自动重装值 0XFFFF
//psc:时钟预分频数 ,不分频
void TIM2_Encoder_Init_1(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<0; //TIM2时钟使能
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFFFFFF00; //PA0、PA1 清除之前设置
GPIOA->CRL|=0X00000044; //PA0、PA1 浮空输入
TIM2->ARR=arr; //设定计数器自动重装值
TIM2->PSC=psc; //预分频器
TIM2->CCMR1 |= 1<<0; //输入模式,IC1FP1映射到TI1上
TIM2->CCMR1 |= 1<<8; //输入模式,IC2FP2映射到TI2上
TIM2->CCER |= 0<<1; //IC1不反向
TIM2->CCER |= 0<<5; //IC2不反向
TIM2->SMCR |= 3<<0; //所用输入均在上升沿或下降沿有效
TIM2->DIER|=1<<0; //允许更新中断
TIM2->DIER|=1<<6; //允许触发中断
TIM2->CR1 |= 1<<0; //使能计数器
MY_NVIC_Init(1,3,TIM2_IRQChannel,2);//抢占1,子优先级3,组2
}
//定时器2中断服务程序
void TIM2_IRQHandler(void)
{
if(TIM2->SR&0X0001)//溢出中断
{
Motor_Speed_Control( 0);//刹车
}
TIM2->SR&=~(1<<0);//清除中断标志位
}
初始化void TIM2_Encoder_Init_1(u16 arr,u16 psc);这条语句。
例:初始化TIM2_Encoder_Init_1(1360, 0);340线,一圈检测到*4=1360个脉冲,也就是电机转一圈,然后刹车停止。
但是,这直流电机定位不准确,除非电机转动很慢的状况下才能实现,不然由于惯性,电机还是不能停在设定位置,建议直接使用步进电机,定位更加准确。
|