我这里用的是出现的问题是:在定时器7里面调用时钟产生的延时函数,出现延时出错,时间变短,无论延时多少都是一样的结果,修改定时器优先级也是一样。
附上程序供大家借鉴。
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
delay_init(168); //延时函数初始化 *******************************************这里
PID_leftinit();
PID_rightinit();
KEY_Init();//PD0\PD1\PD2\PD3的IO初始化,用来判断小车转向
EXTIX_Init();
uart_init(460800); //串口1初始化波特率为460800
uart3_init(115200);//串口3初始化波特率为115200
Trlg_Init();
TIM2_Cap_Init(0xffff,83);
TIM7_Int_Init(14999,83); *******************************************这里
TIM3_PWM_Init(1000,83);//84分频。PWM频率=1/((1/(84000000/(83+1)))*10000)=100hz 10ms输给电机驱动模块
TIM4_PWM_Init(10000,41);//输给舵机,1us*10000=10ms 0度
// delay_ms(300);
// WWDG_Init(0x7F,0X47,WWDG_Prescaler_8); //计数器值为7f,窗口寄存器为47,分频数为8
while(1)
{
// WWDG_SetCounter(0x7f); //重设窗口看门狗值
// WWDG_ClearFlag();//清除提前唤醒中断标志位
// kalman_Distance();//卡尔曼——距离
printf("KF_distance1:%f m\r\n",KF_distance1);//打印总的高点平时间
printf("KF_distance2:%f m\r\n",KF_distance2);//打印总的高点平时间
printf("KF_distance3:%f m\r\n",KF_distance3);//打印总的高点平时间
printf("KF_distance4:%f m\r\n",KF_distance4);//打印总的高点平时间
// printf("HIGH1:%d us\r\n",temp1);//打印总的高点平时间
// produce_flag();//判断产生标志位
// flag_motion();//根据标志位执行相应的动作
// currency();//根据puslleft_forecase判断输出的moterleft_goorback,
moter_speed2=1080;
PWM();//输出PWM给驱动模块
delay_ms(6000);
moter_speed2=4000;
PWM();//输出PWM给驱动模块
delay_ms(6000);
}
}
void TIM7_IRQHandler(void) //TIM2中断
{
if (TIM_GetITStatus(TIM7, TIM_IT_Update) != RESET) //检查TIM7更新中断发生与否
{
TIM_ClearITPendingBit(TIM7, TIM_IT_Update ); //清除TIM7更新中断标志
switch(sign)
{
case 0:{Trlg0=1;delay_us(25);Trlg0=0;};break;*******************************************这里
case 1:{Trlg1=1;delay_us(25);Trlg1=0;};break;*******************************************这里
case 2:{Trlg2=1;delay_us(25);Trlg2=0;};break;*******************************************这里
case 3:{Trlg3=1;delay_us(25);Trlg3=0;};break;*******************************************这里
}
sign++;
if(sign==4)sign=0;
puslleft_whlle+=((exti_puslleft+puslright)/2);//轮胎转一圈2939,估算3000
puslleft=exti_puslleft/0.015;
// printf("puslleft_whlle:%ld \r\n",puslleft_whlle);//打印左边的脉冲数/s 14200
puslright=exti_puslright/0.015;
if(Turnleft_drection==1)
{
puslleft=puslleft;
// printf("puslleft0:%ld \r\n",puslleft);//打印左边的脉冲数/s 14200
}
else if(Turnleft_drection==2)
{
puslleft=0-puslleft;
// printf("puslleft1:%ld \r\n",puslleft);//打印左边的脉冲数/s 14200
}
if(Turnright_drection==1)
{
puslright=puslright;
// printf("puslright0:%ld \r\n",puslright);//打印右边的脉冲数/s
}
else if(Turnright_drection==2)
{
puslright=0-puslright;
// printf("puslright1:%ld \r\n",puslright);//打印右边的脉冲数/s
}
time15ms++;
exti_puslleft=0;
exti_puslright=0;
KF_pusllef=puslleftkalman();
KF_puslright=puslrightkalman();
if(puslleft_whlle>655360)
{
puslleft_whlle=655360;
}
else if(puslleft_whlle<0)
{
puslleft_whlle=0;
}
}
}