本人用407的板子驱动1524电机转动,由于其内部自带的编码器,所有用TIM4的编码器模式捕获脉冲,来计算速度,我估计在定时器、IO口初始化部分都没有错,应该是在采集脉冲时候的处理出错了,
我是用定时器14产生PWM波驱动电机,连接了一个L298N的驱动模块,,这样可以很方便的驱动电机正转,反转,停止,加速减速
用定时器4的编码器模式来捕获编码器产生的脉冲个数Num,然后用定时器3定时100MS,速度就可以算出了,speed = (Num*600)/(4*512) (r/min) 1524电机转一圈,编码器会产生512个脉冲
我贴出来,我的定时器3的中断处理函数,也就是检测100ms内计数脉冲个数,里面的错误还希望各位大神给我指出
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
{
curCount = TIM_GetCounter(TIM4);
if(curCount >= lastCount)
{
speed = curCount - lastCount;
}
else //如果定时器4计数溢出
{
speed = curCount + 65535 - lastCount;
}
lastCount = curCount;
TIM4_CAP_STA = 0x80;
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
//主函数
u8 TIM4_CAP_STA;
u16 Num;
int main(void)
{
u32 temp = 0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init(168);
uart_init(115200);
TIM14_PWM_Init(500-1,84-1);
OUT_Init();
TIM4_ENcoder_Init();
TIM3_Int_Init(1000-1,8400-1); //定时100ms
TIM_SetCompare1(TIM14,100);
GPIO_SetBits(GPIOF,GPIO_Pin_10); //IN1 = 0
GPIO_ResetBits(GPIOF,GPIO_Pin_12); //IN2=0
while(1)
{
if(TIM4_CAP_STA&0x80)
{
temp = Num/(4*512);
temp *= 600;
printf("速度:%d r/min
",temp);
delay_ms(50);
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>