1. void doSomethingHere(HardwareTimer*)
    2. {
    3. //循迹
    4. float error = 0,PWM = 0; //初始化
    5. int flag=1; //当时决定1为直行
    6. int Target = //目标速度
    7. //定时中断主程序,然后用编码器得到轮子的实际速度,然后和设计的Target速度比较
    8. 通过PID进行调整四个轮子的速度。
    9. double PWM[4]={0}; //调整的值
    10. //--------------------获取灰度的值----------------//
    11. int straight_error()
    12. {
    13. //获取灰度传感器的值
    14. rayGet_value (value); //这里之前写错了,rayGet_value (value[]);
    15. //调用数组时形参是数组名,不加括号,后面用串口监视器的时候才发现
    16. //电机编码器:A8-A15左前,左后,右前,右后
    17. //-----------------------------解释----------------------//
    18. //__HAL_TIM_GET_COUNTER(A8 , A9)获得实际速度;
    19. //Incremental_PI (__HAL_TIM_GET_COUNTER(A8 , A9),Target)增量式PID,最后返回调整后的速度
    20. //我理解的:轮子实际转肯定和设定值有偏差,所以测一下实际,然后用PID动态改变偏差
    21. //-------------------------------------------------------//
    22. PWM[0]=Incremental_PI (__HAL_TIM_GET_COUNTER(A8 , A9),Target);//左前的速度
    23. PWM[1]=Incremental_PI (__HAL_TIM_GET_COUNTER(A10, A11),Target);//左后的速度
    24. PWM[2]=Incremental_PI (__HAL_TIM_GET_COUNTER(A12, A13),Target);//右前的速度
    25. PWM[3]=Incremental_PI (__HAL_TIM_GET_COUNTER(A14, A15),Target);//右后的速度
    26. //灰度传感器前方左到右0,1,2,3,4,5
    27. if (value[0] == 0 &&value[1]== 0 &&value[2]== 1 &&value[3]== 1 &&value[4]==0 &&value[5]== 0)
    28. //中间的两个检测到,正常时 //001100 //后来用二进制来写的
    29. {
    30. _M_Front(2,3,PWM[0]);//这里的接线是原始的,最后引脚全部换了
    31. _M_Front(4,5,PWM[1]);
    32. _M_Front(6,7,PWM[2]);
    33. _M_Front(8,9,PWM[3]);
    34. }
    35. else if (value[0]== 0 &&value[1]== 1 &&value[2]== 1 &&value[3]== 0 &&value[4]== 0 &&value[5]== 0)
    36. //车小右偏 //011000 //后来觉得这种不是小右偏,001000才是
    37. //因为黑线宽度3.3,中间另个2.5,其余1.5
    38. {
    39. _M_Front(2,3,PWM[0]-10);//左前慢
    40. _M_Front(4,5,PWM[1]-10);//左后慢
    41. _M_Front(6,7,PWM[2]+10);//右前快
    42. _M_Front(8,9,PWM[3]+10);//右后快
    43. }
    44. else if (value[0]== 1 &&value[1]== 0 &&value[2]== 0 &&value[3]== 1 &&value[4]== 1 &&value[5]== 0)
    45. //车小左偏 //000110 //同上
    46. {
    47. _M_Front(2,3,PWM[0]+10);
    48. _M_Front(4,5,PWM[1]+10);
    49. _M_Front(6,7,PWM[2]-10);
    50. _M_Front(8,9,PWM[3]-10);
    51. }
    52. else if (value[0]== 1 &&value[1]==1 &&value[2]== 1 &&value[3]== 0 &&value[4]== 0 &&value[5]== 0)
    53. //车大右偏 //111000
    54. {
    55. _M_Front(2,3,PWM[0]-20);
    56. _M_Front(4,5,PWM[1]-20);
    57. _M_Front(6,7,PWM[2]+20);
    58. _M_Front(8,9,PWM[3]+20);
    59. }
    60. else if (value[0]== 0 &&value[1]== 0 &&value[2]== 0 &&value[3]== 1 &&value[4]== 1 &&value[5]== 1)
    61. //车大左偏 //000111
    62. {
    63. _M_Front(2,3,PWM[0]+20);
    64. _M_Front(4,5,PWM[1]+20);
    65. _M_Front(6,7,PWM[2]-20);
    66. _M_Front(8,9,PWM[3]-20);
    67. }
    68. else
    69. //前方灰度已经偏差很大,启用后方灰度
    70. //后方灰度6,7,8,9,10,11从左到右
    71. {
    72. if (value[6] == 0 &&value[7]== 0 &&value[8]== 1 &&value[9]== 1 &&value[10]==0 &&value[11]== 0)
    73. {} //001100
    74. //什么也不做,等它走一会儿
    75. else if (value[6] == 0 &&value[7]== 1 &&value[8]== 1 &&value[9]== 0 &&value[10]==0 &&value[11]== 0)
    76. //车大右偏,但是前方灰度已经偏差很大 //011000
    77. {
    78. _M_Front(2,3,PWM[0]-20);
    79. _M_Front(4,5,PWM[1]-20);
    80. _M_Front(6,7,PWM[2]+20);
    81. _M_Front(8,9,PWM[3]+20);
    82. }
    83. else if (value[6] == 0 &&value[7]== 0 &&value[8]== 0 &&value[9]== 1 &&value[10]==1 &&value[11]== 0)
    84. //车大左偏,但是前方灰度已经偏差很大 //000110
    85. {
    86. _M_Front(2,3,PWM[0]+20);
    87. _M_Front(4,5,PWM[1]+20);
    88. _M_Front(6,7,PWM[2]-20);
    89. _M_Front(8,9,PWM[3]-20);
    90. }
    91. }
    92. if( (value[13]== 0 &&value[14]== 0 &&value[15]== 1 &&value[16]== 0 &&value[17]== 0)
    93. ||(value[18]== 0 &&value[19]== 0 &&value[20]== 1 &&value[21]== 0 &&value[22]== 0) )
    94. {
    95. x=x+1;
    96. }
    97. }
    98. int left_error() //左侧没写
    99. {
    100. }
    101. //stm32语言,也不会
    102. void MsTimer_to_do()
    103. {
    104. TIM_TypeDef *Instance = TIM2;
    105. // Instantiate HardwareTimer object. Thanks to 'new' instanciation, HardwareTimer is not destructed when setup() function is finished.
    106. HardwareTimer *MyTim = new HardwareTimer(Instance);
    107. 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.
    108. MyTim->setOverflow(10, HERTZ_FORMAT); // 10 Hz
    109. MyTim->attachInterrupt(doSomethingHere); //表示定时器中断去做dosomethinghere的工作
    110. MyTim->resume();
    111. }