void doSomethingHere(HardwareTimer*){ //循迹float error = 0,PWM = 0; //初始化int flag=1; //当时决定1为直行int Target = //目标速度//定时中断主程序,然后用编码器得到轮子的实际速度,然后和设计的Target速度比较通过PID进行调整四个轮子的速度。double PWM[4]={0}; //调整的值//--------------------获取灰度的值----------------//int straight_error(){ //获取灰度传感器的值 rayGet_value (value); //这里之前写错了,rayGet_value (value[]); //调用数组时形参是数组名,不加括号,后面用串口监视器的时候才发现 //电机编码器:A8-A15左前,左后,右前,右后 //-----------------------------解释----------------------// //__HAL_TIM_GET_COUNTER(A8 , A9)获得实际速度; //Incremental_PI (__HAL_TIM_GET_COUNTER(A8 , A9),Target)增量式PID,最后返回调整后的速度 //我理解的:轮子实际转肯定和设定值有偏差,所以测一下实际,然后用PID动态改变偏差 //-------------------------------------------------------// PWM[0]=Incremental_PI (__HAL_TIM_GET_COUNTER(A8 , A9),Target);//左前的速度 PWM[1]=Incremental_PI (__HAL_TIM_GET_COUNTER(A10, A11),Target);//左后的速度 PWM[2]=Incremental_PI (__HAL_TIM_GET_COUNTER(A12, A13),Target);//右前的速度 PWM[3]=Incremental_PI (__HAL_TIM_GET_COUNTER(A14, A15),Target);//右后的速度 //灰度传感器前方左到右0,1,2,3,4,5 if (value[0] == 0 &&value[1]== 0 &&value[2]== 1 &&value[3]== 1 &&value[4]==0 &&value[5]== 0) //中间的两个检测到,正常时 //001100 //后来用二进制来写的 { _M_Front(2,3,PWM[0]);//这里的接线是原始的,最后引脚全部换了 _M_Front(4,5,PWM[1]); _M_Front(6,7,PWM[2]); _M_Front(8,9,PWM[3]); } else if (value[0]== 0 &&value[1]== 1 &&value[2]== 1 &&value[3]== 0 &&value[4]== 0 &&value[5]== 0) //车小右偏 //011000 //后来觉得这种不是小右偏,001000才是 //因为黑线宽度3.3,中间另个2.5,其余1.5 { _M_Front(2,3,PWM[0]-10);//左前慢 _M_Front(4,5,PWM[1]-10);//左后慢 _M_Front(6,7,PWM[2]+10);//右前快 _M_Front(8,9,PWM[3]+10);//右后快 } else if (value[0]== 1 &&value[1]== 0 &&value[2]== 0 &&value[3]== 1 &&value[4]== 1 &&value[5]== 0) //车小左偏 //000110 //同上 { _M_Front(2,3,PWM[0]+10); _M_Front(4,5,PWM[1]+10); _M_Front(6,7,PWM[2]-10); _M_Front(8,9,PWM[3]-10); } else if (value[0]== 1 &&value[1]==1 &&value[2]== 1 &&value[3]== 0 &&value[4]== 0 &&value[5]== 0) //车大右偏 //111000 { _M_Front(2,3,PWM[0]-20); _M_Front(4,5,PWM[1]-20); _M_Front(6,7,PWM[2]+20); _M_Front(8,9,PWM[3]+20); } else if (value[0]== 0 &&value[1]== 0 &&value[2]== 0 &&value[3]== 1 &&value[4]== 1 &&value[5]== 1) //车大左偏 //000111 { _M_Front(2,3,PWM[0]+20); _M_Front(4,5,PWM[1]+20); _M_Front(6,7,PWM[2]-20); _M_Front(8,9,PWM[3]-20); } else //前方灰度已经偏差很大,启用后方灰度 //后方灰度6,7,8,9,10,11从左到右 { if (value[6] == 0 &&value[7]== 0 &&value[8]== 1 &&value[9]== 1 &&value[10]==0 &&value[11]== 0) {} //001100 //什么也不做,等它走一会儿 else if (value[6] == 0 &&value[7]== 1 &&value[8]== 1 &&value[9]== 0 &&value[10]==0 &&value[11]== 0) //车大右偏,但是前方灰度已经偏差很大 //011000 { _M_Front(2,3,PWM[0]-20); _M_Front(4,5,PWM[1]-20); _M_Front(6,7,PWM[2]+20); _M_Front(8,9,PWM[3]+20); } else if (value[6] == 0 &&value[7]== 0 &&value[8]== 0 &&value[9]== 1 &&value[10]==1 &&value[11]== 0) //车大左偏,但是前方灰度已经偏差很大 //000110 { _M_Front(2,3,PWM[0]+20); _M_Front(4,5,PWM[1]+20); _M_Front(6,7,PWM[2]-20); _M_Front(8,9,PWM[3]-20); } } if( (value[13]== 0 &&value[14]== 0 &&value[15]== 1 &&value[16]== 0 &&value[17]== 0) ||(value[18]== 0 &&value[19]== 0 &&value[20]== 1 &&value[21]== 0 &&value[22]== 0) ) { x=x+1; }}int left_error() //左侧没写{}//stm32语言,也不会void MsTimer_to_do(){ TIM_TypeDef *Instance = TIM2; // Instantiate HardwareTimer object. Thanks to 'new' instanciation, HardwareTimer is not destructed when setup() function is finished. HardwareTimer *MyTim = new HardwareTimer(Instance); MyTim->setMode(2, TIMER_OUTPUT_COMPARE); // In our case, channekFalling is configured but not really used. Nevertheless it would be possible to attach a callback to channel compare match. MyTim->setOverflow(10, HERTZ_FORMAT); // 10 Hz MyTim->attachInterrupt(doSomethingHere); //表示定时器中断去做dosomethinghere的工作 MyTim->resume();}