Motion_model.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. #include "Motion_model.h"
  2. int16_t Speed_left,Speed_right,Speed_left_flag,Speed_right_flag=0;
  3. uint16_t Max_Speed = 500;
  4. uint8_t Stop_Flag,Drive_Flag=0;
  5. _Motion_Data Motion_Data={0}; // 左右驱动器数据
  6. int16_t JDZ_4_20(int16_t In_Put,int32_t AIMAX,int32_t AIMIN,int32_t SDMAX,int32_t SDMIN )
  7. {
  8. uint64_t TEP,TED,OUT=0;
  9. TED=(In_Put-AIMIN)*(SDMAX-SDMIN) ;
  10. TEP=TED/(AIMAX-AIMIN);
  11. OUT= TEP+(SDMIN);
  12. return OUT;
  13. }
  14. /*
  15. *********************************************************************************************************
  16. *
  17. * 模块名称 : Motion_model模块
  18. * 匹配左右
  19. *********************************************************************************************************
  20. */
  21. void Sbus_Motion_Re(void)
  22. {
  23. memset(&Motion_Data,0,sizeof(Motion_Data));
  24. int16_t RockX=0, RockY=0; // X Y 变化量
  25. uint8_t RockYStopFlag=0, RockXStopFlag=0; // X Y 停止标志位
  26. int32_t speed=0;
  27. //
  28. RockY = SBUS_CH.CH2; // Y 轴
  29. RockX = SBUS_CH.CH1; // X 轴
  30. // if(((SBUS_ROCK_LEFTDEAD <= RockX)&&(RockX <= SBUS_ROCK_RIGHTDEAD)) || (RockX == 0)){
  31. // //摇杆X轴中位死区
  32. // RockXStopFlag=1;
  33. // }
  34. // if(((SBUS_ROCK_DOWNDEAD <= RockY)&&(RockY <= SBUS_ROCK_UPDEAD)) || (RockY == 0)){
  35. // //摇杆Y轴中位死区
  36. // RockYStopFlag=1;
  37. // }
  38. // if(RockYStopFlag && RockXStopFlag){//停止
  39. // Motion_Data.SetSpeed[Motion_Left] = 0;
  40. // Motion_Data.SetSpeed[Motion_Right] = 0;
  41. // Motion_Data.MotionFlag[Motion_Left] = Con_Mot_Stop;
  42. // Motion_Data.MotionFlag[Motion_Right] =Con_Mot_Stop;
  43. // }else
  44. // {
  45. // Motion_Data.MotionFlag[Motion_Left] = Con_Mot_Speed;
  46. // Motion_Data.MotionFlag[Motion_Right] =Con_Mot_Speed;
  47. // if(!RockYStopFlag && RockXStopFlag){ //X轴无动作
  48. // if(RockY > SBUS_ROCK_UPDEAD){ // 前进
  49. // if(RockY >= SBUS_ROCK_Y_MAX) // 越界
  50. // {
  51. // Motion_Data.SetSpeed[Motion_Left] = Max_Speed;
  52. // Motion_Data.SetSpeed[Motion_Right] =(~Max_Speed)+1; //Max_Speed;//
  53. // }
  54. // else //界内
  55. // { //计算匹配两侧速度
  56. // Motion_Data.SetSpeed[Motion_Left] = (Max_Speed*(RockY-SBUS_ROCK_UPDEAD)/(SBUS_ROCK_Y_MAX-SBUS_ROCK_UPDEAD));
  57. // Motion_Data.SetSpeed[Motion_Right] = (~(Max_Speed*(RockY-SBUS_ROCK_UPDEAD)/(SBUS_ROCK_Y_MAX-SBUS_ROCK_UPDEAD)))+1;//(Max_Speed*(RockY-SBUS_ROCK_UPDEAD)/(SBUS_ROCK_Y_MAX-SBUS_ROCK_UPDEAD));
  58. // }
  59. // }else if((0<RockY)&&(RockY < SBUS_ROCK_DOWNDEAD)){//后退
  60. // if(RockY <= SBUS_ROCK_Y_MIN){
  61. // Motion_Data.SetSpeed[Motion_Left] = (~Max_Speed)+1;
  62. // Motion_Data.SetSpeed[Motion_Right] = Max_Speed;//(~Max_Speed)+1;//
  63. // }
  64. // else{
  65. // Motion_Data.SetSpeed[Motion_Left] = (~(Max_Speed*(SBUS_ROCK_DOWNDEAD-RockY)/(SBUS_ROCK_DOWNDEAD-SBUS_ROCK_Y_MIN)))+1;
  66. // Motion_Data.SetSpeed[Motion_Right] = (Max_Speed*(SBUS_ROCK_DOWNDEAD-RockY)/(SBUS_ROCK_DOWNDEAD-SBUS_ROCK_Y_MIN));//(~(Max_Speed*(SBUS_ROCK_DOWNDEAD-RockY)/(SBUS_ROCK_DOWNDEAD-SBUS_ROCK_Y_MIN)))+1;//
  67. // }
  68. // }
  69. // else{}
  70. //
  71. // }else if(RockYStopFlag&&!RockXStopFlag){//Y轴无动作
  72. // if((0<RockX)&&(RockX < SBUS_ROCK_LEFTDEAD)){//原地左转
  73. // if(RockX <= SBUS_ROCK_X_MIN){
  74. // Motion_Data.SetSpeed[Motion_Left] = (~(Max_Speed/2))+1;
  75. // Motion_Data.SetSpeed[Motion_Right] =(~(Max_Speed/2))+1;// (Max_Speed/2);//
  76. // }
  77. // else{
  78. // Motion_Data.SetSpeed[Motion_Left] = (~(Max_Speed/2*(SBUS_ROCK_LEFTDEAD-RockX)/(SBUS_ROCK_LEFTDEAD-SBUS_ROCK_X_MIN)))+1;
  79. // Motion_Data.SetSpeed[Motion_Right] = (~(Max_Speed/2*(SBUS_ROCK_LEFTDEAD-RockX)/(SBUS_ROCK_LEFTDEAD-SBUS_ROCK_X_MIN)))+1;//(Max_Speed/2*(SBUS_ROCK_LEFTDEAD-RockX)/(SBUS_ROCK_LEFTDEAD-SBUS_ROCK_X_MIN));//
  80. // }
  81. // }
  82. // else if(RockX > SBUS_ROCK_RIGHTDEAD){//原地右转
  83. // if(RockX >= SBUS_ROCK_X_MAX){
  84. // Motion_Data.SetSpeed[Motion_Left] = (Max_Speed/2);
  85. // Motion_Data.SetSpeed[Motion_Right] = (Max_Speed/2);//(~(Max_Speed/2))+1;//
  86. // }
  87. // else{
  88. // Motion_Data.SetSpeed[Motion_Left] = (Max_Speed/2*(RockX-SBUS_ROCK_RIGHTDEAD)/(SBUS_ROCK_X_MAX-SBUS_ROCK_RIGHTDEAD));
  89. // Motion_Data.SetSpeed[Motion_Right]=(Max_Speed/2*(RockX-SBUS_ROCK_RIGHTDEAD)/(SBUS_ROCK_X_MAX-SBUS_ROCK_RIGHTDEAD));//(~(Max_Speed/2*(RockX-SBUS_ROCK_RIGHTDEAD)/(SBUS_ROCK_X_MAX-SBUS_ROCK_RIGHTDEAD)))+1; //
  90. // }
  91. // }
  92. // else{}
  93. // }else{//摇杆XY轴都有动作
  94. // if((SBUS_ROCK_UPDEAD<RockY) && ((0<RockX)&&(RockX<SBUS_ROCK_LEFTDEAD))){//左前方 2
  95. // if((RockY-SBUS_ROCK_UPDEAD) >= (SBUS_ROCK_LEFTDEAD-RockX)){//左前偏上
  96. // speed = Max_Speed*(RockY-SBUS_ROCK_UPDEAD)/(SBUS_ROCK_Y_MAX-SBUS_ROCK_UPDEAD);//计算中心速度
  97. // Motion_Data.SetSpeed[Motion_Left] = (speed-speed*(SBUS_ROCK_LEFTDEAD-RockX)/(SBUS_ROCK_LEFTDEAD-SBUS_ROCK_X_MIN));
  98. // Motion_Data.SetSpeed[Motion_Right] =(~(speed-speed*(SBUS_ROCK_LEFTDEAD-RockX)/(SBUS_ROCK_LEFTDEAD-SBUS_ROCK_X_MIN)/4))+1;//(speed-speed*(SBUS_ROCK_LEFTDEAD-RockX)/(SBUS_ROCK_LEFTDEAD-SBUS_ROCK_X_MIN)/4); //
  99. // }else{//左前偏下
  100. // speed = Max_Speed*(SBUS_ROCK_LEFTDEAD-RockX)/(SBUS_ROCK_LEFTDEAD-SBUS_ROCK_X_MIN);
  101. // Motion_Data.SetSpeed[Motion_Left] = (~(speed/2-speed*(RockY-SBUS_ROCK_UPDEAD)/(SBUS_ROCK_Y_MAX-SBUS_ROCK_UPDEAD)/2))+1;
  102. // Motion_Data.SetSpeed[Motion_Right] =(~(speed/2+speed*(RockY-SBUS_ROCK_UPDEAD)/(SBUS_ROCK_Y_MAX-SBUS_ROCK_UPDEAD)/4))+1;//(speed/2+speed*(RockY-SBUS_ROCK_UPDEAD)/(SBUS_ROCK_Y_MAX-SBUS_ROCK_UPDEAD)/4); //
  103. // }
  104. // }
  105. // else if((SBUS_ROCK_UPDEAD<RockY) && (SBUS_ROCK_RIGHTDEAD<RockX)){//右前方 1
  106. // if((RockY-SBUS_ROCK_UPDEAD) >= (RockX-SBUS_ROCK_RIGHTDEAD)){//右前偏上
  107. // speed = Max_Speed*(RockY-SBUS_ROCK_UPDEAD)/(SBUS_ROCK_Y_MAX-SBUS_ROCK_UPDEAD);
  108. // Motion_Data.SetSpeed[Motion_Left] = (speed-speed*(RockX-SBUS_ROCK_RIGHTDEAD)/(SBUS_ROCK_X_MAX-SBUS_ROCK_RIGHTDEAD)/4);
  109. // Motion_Data.SetSpeed[Motion_Right] =(~(speed-speed*(RockX-SBUS_ROCK_RIGHTDEAD)/(SBUS_ROCK_X_MAX-SBUS_ROCK_RIGHTDEAD)))+1;//(speed-speed*(RockX-SBUS_ROCK_RIGHTDEAD)/(SBUS_ROCK_X_MAX-SBUS_ROCK_RIGHTDEAD)); //
  110. // }
  111. // else{//右前偏下
  112. // speed = Max_Speed*(RockX-SBUS_ROCK_RIGHTDEAD)/(SBUS_ROCK_X_MAX-SBUS_ROCK_RIGHTDEAD);
  113. // Motion_Data.SetSpeed[Motion_Left] = (speed/2+speed*(RockY-SBUS_ROCK_UPDEAD)/(SBUS_ROCK_Y_MAX-SBUS_ROCK_UPDEAD)/4);
  114. // Motion_Data.SetSpeed[Motion_Right] =(speed/2-speed*(RockY-SBUS_ROCK_UPDEAD)/(SBUS_ROCK_Y_MAX-SBUS_ROCK_UPDEAD)/2);//(~(speed/2-speed*(RockY-SBUS_ROCK_UPDEAD)/(SBUS_ROCK_Y_MAX-SBUS_ROCK_UPDEAD)/2))+1; //
  115. // }
  116. // }
  117. // else if(((0<RockY)&&(RockY<SBUS_ROCK_DOWNDEAD)) && ((0<RockX)&&(RockX<SBUS_ROCK_LEFTDEAD))){//左后方 3
  118. // if((SBUS_ROCK_DOWNDEAD-RockY) >= (SBUS_ROCK_LEFTDEAD-RockX)){//左后偏下
  119. // speed = Max_Speed*(SBUS_ROCK_DOWNDEAD-RockY)/(SBUS_ROCK_DOWNDEAD-SBUS_ROCK_Y_MIN);
  120. // Motion_Data.SetSpeed[Motion_Left] = (~(speed-speed*(SBUS_ROCK_LEFTDEAD-RockX)/(SBUS_ROCK_LEFTDEAD-SBUS_ROCK_X_MIN)))+1;
  121. // Motion_Data.SetSpeed[Motion_Right]= (speed-speed*(SBUS_ROCK_LEFTDEAD-RockX)/(SBUS_ROCK_LEFTDEAD-SBUS_ROCK_X_MIN)/4);//(~(speed-speed*(SBUS_ROCK_LEFTDEAD-RockX)/(SBUS_ROCK_LEFTDEAD-SBUS_ROCK_X_MIN)/4))+1;//
  122. // }
  123. // else{//左后偏上
  124. // speed = Max_Speed*(SBUS_ROCK_LEFTDEAD-RockX)/(SBUS_ROCK_LEFTDEAD-SBUS_ROCK_X_MIN);
  125. // Motion_Data.SetSpeed[Motion_Left] = (speed/2-speed*(SBUS_ROCK_DOWNDEAD-RockY)/(SBUS_ROCK_DOWNDEAD-SBUS_ROCK_Y_MIN)/2);
  126. // Motion_Data.SetSpeed[Motion_Right] =(speed/2+speed*(SBUS_ROCK_DOWNDEAD-RockY)/(SBUS_ROCK_DOWNDEAD-SBUS_ROCK_Y_MIN)/4);//(~(speed/2+speed*(SBUS_ROCK_DOWNDEAD-RockY)/(SBUS_ROCK_DOWNDEAD-SBUS_ROCK_Y_MIN)/4))+1; //
  127. // }
  128. // }
  129. // else if(((0<RockY)&&(RockY<SBUS_ROCK_DOWNDEAD)) && (RockX>SBUS_ROCK_RIGHTDEAD)){//右后方 4
  130. // if((SBUS_ROCK_DOWNDEAD-RockY) >= (RockX-SBUS_ROCK_RIGHTDEAD)){//右后偏下
  131. // speed = Max_Speed*(SBUS_ROCK_DOWNDEAD-RockY)/(SBUS_ROCK_DOWNDEAD-SBUS_ROCK_Y_MIN);
  132. // Motion_Data.SetSpeed[Motion_Left] = (~(speed-speed*(RockX-SBUS_ROCK_RIGHTDEAD)/(SBUS_ROCK_X_MAX-SBUS_ROCK_RIGHTDEAD)/4))+1;
  133. // Motion_Data.SetSpeed[Motion_Right]= (speed-speed*(RockX-SBUS_ROCK_RIGHTDEAD)/(SBUS_ROCK_X_MAX-SBUS_ROCK_RIGHTDEAD));//(~(speed-speed*(RockX-SBUS_ROCK_RIGHTDEAD)/(SBUS_ROCK_X_MAX-SBUS_ROCK_RIGHTDEAD)))+1;//
  134. // }
  135. // else{//右后偏上
  136. // speed = Max_Speed*(RockX-SBUS_ROCK_RIGHTDEAD)/(SBUS_ROCK_X_MAX-SBUS_ROCK_RIGHTDEAD);
  137. // Motion_Data.SetSpeed[Motion_Left] = (~(speed/2+speed*(SBUS_ROCK_DOWNDEAD-RockY)/(SBUS_ROCK_DOWNDEAD-SBUS_ROCK_Y_MIN)/4))+1;
  138. // Motion_Data.SetSpeed[Motion_Right] =(~(speed/2-speed*(SBUS_ROCK_DOWNDEAD-RockY)/(SBUS_ROCK_DOWNDEAD-SBUS_ROCK_Y_MIN)/2))+1;//(speed/2-speed*(SBUS_ROCK_DOWNDEAD-RockY)/(SBUS_ROCK_DOWNDEAD-SBUS_ROCK_Y_MIN)/2); //
  139. // }
  140. // }
  141. // }
  142. // //可整体限制
  143. // Motion_Data.SetSpeed[Motion_Left]=Motion_Data.SetSpeed[Motion_Left]*1.0;
  144. // Motion_Data.SetSpeed[Motion_Right]=Motion_Data.SetSpeed[Motion_Right]*1.0;
  145. // }
  146. if(((SBUS_ROCK_LEFTDEAD <= RockX)&&(RockX <= SBUS_ROCK_RIGHTDEAD)) || (RockX == 0)){
  147. //摇杆X轴中位死区
  148. RockXStopFlag=1;
  149. }
  150. if(((SBUS_ROCK_DOWNDEAD <= RockY)&&(RockY <= SBUS_ROCK_UPDEAD)) || (RockY == 0)){
  151. //摇杆Y轴中位死区
  152. RockYStopFlag=1;
  153. }
  154. if(RockYStopFlag && RockXStopFlag){//停止
  155. Motion_Data.SetSpeed[Motion_Left] = 0;
  156. Motion_Data.SetSpeed[Motion_Right] = 0;
  157. Motion_Data.MotionFlag[Motion_Left] = Con_Mot_Stop;
  158. Motion_Data.MotionFlag[Motion_Right] =Con_Mot_Stop;
  159. }else
  160. {
  161. Motion_Data.MotionFlag[Motion_Left] = Con_Mot_Speed;
  162. Motion_Data.MotionFlag[Motion_Right] =Con_Mot_Speed;
  163. if(!RockYStopFlag && RockXStopFlag){ //X轴无动作
  164. if(RockY > SBUS_ROCK_UPDEAD){ // 前进
  165. if(RockY >= SBUS_ROCK_Y_MAX) // 越界
  166. {
  167. Motion_Data.SetSpeed[Motion_Left] = Max_Speed;
  168. Motion_Data.SetSpeed[Motion_Right] =(~Max_Speed)+1; //Max_Speed;//
  169. }
  170. else //界内
  171. { //计算匹配两侧速度
  172. Motion_Data.SetSpeed[Motion_Left] = (Max_Speed*(RockY-SBUS_ROCK_UPDEAD)/(SBUS_ROCK_Y_MAX-SBUS_ROCK_UPDEAD));
  173. Motion_Data.SetSpeed[Motion_Right] = (~(Max_Speed*(RockY-SBUS_ROCK_UPDEAD)/(SBUS_ROCK_Y_MAX-SBUS_ROCK_UPDEAD)))+1;//(Max_Speed*(RockY-SBUS_ROCK_UPDEAD)/(SBUS_ROCK_Y_MAX-SBUS_ROCK_UPDEAD));
  174. }
  175. }else if((0<RockY)&&(RockY < SBUS_ROCK_DOWNDEAD)){//后退
  176. if(RockY <= SBUS_ROCK_Y_MIN){
  177. Motion_Data.SetSpeed[Motion_Left] = (~Max_Speed)+1;
  178. Motion_Data.SetSpeed[Motion_Right] = Max_Speed;//(~Max_Speed)+1;//
  179. }
  180. else{
  181. Motion_Data.SetSpeed[Motion_Left] = (~(Max_Speed*(SBUS_ROCK_DOWNDEAD-RockY)/(SBUS_ROCK_DOWNDEAD-SBUS_ROCK_Y_MIN)))+1;
  182. Motion_Data.SetSpeed[Motion_Right] = (Max_Speed*(SBUS_ROCK_DOWNDEAD-RockY)/(SBUS_ROCK_DOWNDEAD-SBUS_ROCK_Y_MIN));//(~(Max_Speed*(SBUS_ROCK_DOWNDEAD-RockY)/(SBUS_ROCK_DOWNDEAD-SBUS_ROCK_Y_MIN)))+1;//
  183. }
  184. }
  185. else{}
  186. }else if(RockYStopFlag&&!RockXStopFlag){//Y轴无动作
  187. if((0<RockX)&&(RockX < SBUS_ROCK_LEFTDEAD)){//原地左转
  188. if(RockX <= SBUS_ROCK_X_MIN){
  189. Motion_Data.SetSpeed[Motion_Left] = (~(Max_Speed/2))+1;
  190. Motion_Data.SetSpeed[Motion_Right] =(~(Max_Speed/2))+1;// (Max_Speed/2);//
  191. }
  192. else{
  193. Motion_Data.SetSpeed[Motion_Left] = (~(Max_Speed/2*(SBUS_ROCK_LEFTDEAD-RockX)/(SBUS_ROCK_LEFTDEAD-SBUS_ROCK_X_MIN)))+1;
  194. Motion_Data.SetSpeed[Motion_Right] = (~(Max_Speed/2*(SBUS_ROCK_LEFTDEAD-RockX)/(SBUS_ROCK_LEFTDEAD-SBUS_ROCK_X_MIN)))+1;//(Max_Speed/2*(SBUS_ROCK_LEFTDEAD-RockX)/(SBUS_ROCK_LEFTDEAD-SBUS_ROCK_X_MIN));//
  195. }
  196. }
  197. else if(RockX > SBUS_ROCK_RIGHTDEAD){//原地右转
  198. if(RockX >= SBUS_ROCK_X_MAX){
  199. Motion_Data.SetSpeed[Motion_Left] = (Max_Speed/2);
  200. Motion_Data.SetSpeed[Motion_Right] = (Max_Speed/2);//(~(Max_Speed/2))+1;//
  201. }
  202. else{
  203. Motion_Data.SetSpeed[Motion_Left] = (Max_Speed/2*(RockX-SBUS_ROCK_RIGHTDEAD)/(SBUS_ROCK_X_MAX-SBUS_ROCK_RIGHTDEAD));
  204. Motion_Data.SetSpeed[Motion_Right]=(Max_Speed/2*(RockX-SBUS_ROCK_RIGHTDEAD)/(SBUS_ROCK_X_MAX-SBUS_ROCK_RIGHTDEAD));//(~(Max_Speed/2*(RockX-SBUS_ROCK_RIGHTDEAD)/(SBUS_ROCK_X_MAX-SBUS_ROCK_RIGHTDEAD)))+1; //
  205. }
  206. }
  207. else{}
  208. }else{//摇杆XY轴都有动作
  209. if((SBUS_ROCK_UPDEAD<RockY) && ((0<RockX)&&(RockX<SBUS_ROCK_LEFTDEAD))){//左前方 2
  210. if((RockY-SBUS_ROCK_UPDEAD) >= (SBUS_ROCK_LEFTDEAD-RockX)){//左前偏上
  211. speed = Max_Speed*(RockY-SBUS_ROCK_UPDEAD)/(SBUS_ROCK_Y_MAX-SBUS_ROCK_UPDEAD);//计算中心速度
  212. Motion_Data.SetSpeed[Motion_Left] = (speed-speed*(SBUS_ROCK_LEFTDEAD-RockX)/(SBUS_ROCK_LEFTDEAD-SBUS_ROCK_X_MIN)/4);
  213. Motion_Data.SetSpeed[Motion_Right] =(~(speed-speed*(SBUS_ROCK_LEFTDEAD-RockX)/(SBUS_ROCK_LEFTDEAD-SBUS_ROCK_X_MIN)))+1;//(speed-speed*(SBUS_ROCK_LEFTDEAD-RockX)/(SBUS_ROCK_LEFTDEAD-SBUS_ROCK_X_MIN)/4); //
  214. }else{//左前偏下
  215. speed = Max_Speed*(SBUS_ROCK_LEFTDEAD-RockX)/(SBUS_ROCK_LEFTDEAD-SBUS_ROCK_X_MIN);
  216. Motion_Data.SetSpeed[Motion_Left] = (speed/2+speed*(RockY-SBUS_ROCK_UPDEAD)/(SBUS_ROCK_Y_MAX-SBUS_ROCK_UPDEAD)/4);
  217. Motion_Data.SetSpeed[Motion_Right] =(speed/2-speed*(RockY-SBUS_ROCK_UPDEAD)/(SBUS_ROCK_Y_MAX-SBUS_ROCK_UPDEAD)/2);//(speed/2+speed*(RockY-SBUS_ROCK_UPDEAD)/(SBUS_ROCK_Y_MAX-SBUS_ROCK_UPDEAD)/4); //
  218. }
  219. }
  220. else if((SBUS_ROCK_UPDEAD<RockY) && (SBUS_ROCK_RIGHTDEAD<RockX)){//右前方 1
  221. if((RockY-SBUS_ROCK_UPDEAD) >= (RockX-SBUS_ROCK_RIGHTDEAD)){//右前偏上
  222. speed = Max_Speed*(RockY-SBUS_ROCK_UPDEAD)/(SBUS_ROCK_Y_MAX-SBUS_ROCK_UPDEAD);
  223. Motion_Data.SetSpeed[Motion_Left] = (speed-speed*(RockX-SBUS_ROCK_RIGHTDEAD)/(SBUS_ROCK_X_MAX-SBUS_ROCK_RIGHTDEAD));
  224. Motion_Data.SetSpeed[Motion_Right] =(~(speed-speed*(RockX-SBUS_ROCK_RIGHTDEAD)/(SBUS_ROCK_X_MAX-SBUS_ROCK_RIGHTDEAD)/4))+1;//(speed-speed*(RockX-SBUS_ROCK_RIGHTDEAD)/(SBUS_ROCK_X_MAX-SBUS_ROCK_RIGHTDEAD)); //
  225. }
  226. else{//右前偏下
  227. speed = Max_Speed*(RockX-SBUS_ROCK_RIGHTDEAD)/(SBUS_ROCK_X_MAX-SBUS_ROCK_RIGHTDEAD);
  228. Motion_Data.SetSpeed[Motion_Left] = (~(speed/2-speed*(RockY-SBUS_ROCK_UPDEAD)/(SBUS_ROCK_Y_MAX-SBUS_ROCK_UPDEAD)/2))+1;
  229. Motion_Data.SetSpeed[Motion_Right] =(~(speed/2+speed*(RockY-SBUS_ROCK_UPDEAD)/(SBUS_ROCK_Y_MAX-SBUS_ROCK_UPDEAD)/4))+1;//(~(speed/2-speed*(RockY-SBUS_ROCK_UPDEAD)/(SBUS_ROCK_Y_MAX-SBUS_ROCK_UPDEAD)/2))+1; //
  230. }
  231. }
  232. else if(((0<RockY)&&(RockY<SBUS_ROCK_DOWNDEAD)) && ((0<RockX)&&(RockX<SBUS_ROCK_LEFTDEAD))){//左后方 3
  233. if((SBUS_ROCK_DOWNDEAD-RockY) >= (SBUS_ROCK_LEFTDEAD-RockX)){//左后偏下
  234. speed = Max_Speed*(SBUS_ROCK_DOWNDEAD-RockY)/(SBUS_ROCK_DOWNDEAD-SBUS_ROCK_Y_MIN);
  235. Motion_Data.SetSpeed[Motion_Left] = (~(speed-speed*(SBUS_ROCK_LEFTDEAD-RockX)/(SBUS_ROCK_LEFTDEAD-SBUS_ROCK_X_MIN)/4))+1;
  236. Motion_Data.SetSpeed[Motion_Right]= (speed-speed*(SBUS_ROCK_LEFTDEAD-RockX)/(SBUS_ROCK_LEFTDEAD-SBUS_ROCK_X_MIN));//(~(speed-speed*(SBUS_ROCK_LEFTDEAD-RockX)/(SBUS_ROCK_LEFTDEAD-SBUS_ROCK_X_MIN)/4))+1;//
  237. }
  238. else{//左后偏上
  239. speed = Max_Speed*(SBUS_ROCK_LEFTDEAD-RockX)/(SBUS_ROCK_LEFTDEAD-SBUS_ROCK_X_MIN);
  240. Motion_Data.SetSpeed[Motion_Left] = (~(speed/2+speed*(SBUS_ROCK_DOWNDEAD-RockY)/(SBUS_ROCK_DOWNDEAD-SBUS_ROCK_Y_MIN)/4))+1;
  241. Motion_Data.SetSpeed[Motion_Right] =(~(speed/2-speed*(SBUS_ROCK_DOWNDEAD-RockY)/(SBUS_ROCK_DOWNDEAD-SBUS_ROCK_Y_MIN)/2))+1;//(~(speed/2+speed*(SBUS_ROCK_DOWNDEAD-RockY)/(SBUS_ROCK_DOWNDEAD-SBUS_ROCK_Y_MIN)/4))+1; //
  242. }
  243. }
  244. else if(((0<RockY)&&(RockY<SBUS_ROCK_DOWNDEAD)) && (RockX>SBUS_ROCK_RIGHTDEAD)){//右后方 4
  245. if((SBUS_ROCK_DOWNDEAD-RockY) >= (RockX-SBUS_ROCK_RIGHTDEAD)){//右后偏下
  246. speed = Max_Speed*(SBUS_ROCK_DOWNDEAD-RockY)/(SBUS_ROCK_DOWNDEAD-SBUS_ROCK_Y_MIN);
  247. Motion_Data.SetSpeed[Motion_Left] = (~(speed-speed*(RockX-SBUS_ROCK_RIGHTDEAD)/(SBUS_ROCK_X_MAX-SBUS_ROCK_RIGHTDEAD)))+1;
  248. Motion_Data.SetSpeed[Motion_Right]= (speed-speed*(RockX-SBUS_ROCK_RIGHTDEAD)/(SBUS_ROCK_X_MAX-SBUS_ROCK_RIGHTDEAD)/4);//(~(speed-speed*(RockX-SBUS_ROCK_RIGHTDEAD)/(SBUS_ROCK_X_MAX-SBUS_ROCK_RIGHTDEAD)))+1;//
  249. }
  250. else{//右后偏上
  251. speed = Max_Speed*(RockX-SBUS_ROCK_RIGHTDEAD)/(SBUS_ROCK_X_MAX-SBUS_ROCK_RIGHTDEAD);
  252. Motion_Data.SetSpeed[Motion_Left] = (speed/2-speed*(SBUS_ROCK_DOWNDEAD-RockY)/(SBUS_ROCK_DOWNDEAD-SBUS_ROCK_Y_MIN)/2);
  253. Motion_Data.SetSpeed[Motion_Right] =(speed/2+speed*(SBUS_ROCK_DOWNDEAD-RockY)/(SBUS_ROCK_DOWNDEAD-SBUS_ROCK_Y_MIN)/4);//(speed/2-speed*(SBUS_ROCK_DOWNDEAD-RockY)/(SBUS_ROCK_DOWNDEAD-SBUS_ROCK_Y_MIN)/2); //
  254. }
  255. }
  256. }
  257. //可整体限制
  258. Motion_Data.SetSpeed[Motion_Left]=Motion_Data.SetSpeed[Motion_Left]*1.0;
  259. Motion_Data.SetSpeed[Motion_Right]=Motion_Data.SetSpeed[Motion_Right]*1.0;
  260. }
  261. Speed_left = Motion_Data.SetSpeed[Motion_Left];
  262. Speed_right = Motion_Data.SetSpeed[Motion_Right];
  263. Speed_left_flag = Motion_Data.MotionFlag[Motion_Left];
  264. Speed_right_flag = Motion_Data.MotionFlag[Motion_Right];
  265. }
  266. /*****************************************运动发送*********************************************/
  267. void Can_Drive_Send(int16_t L_Flag,int16_t L_Speed,int16_t R_Flag,int16_t R_Speed)
  268. {
  269. uint8_t Can_Walk_Left[8]={0x2B,0x00,0x20,0x00,0x10,0x00,0x00,0x00};
  270. uint8_t Can_Walk_Right[8]={0x2B,0x00,0x20,0x00,0x10,0x00,0x00,0x00};
  271. //can_send_msg(CAN_HandleTypeDef *hcan,uint8_t IDE,uint32_t id, uint8_t *msg, uint8_t len )
  272. if((L_Flag==Con_Mot_Stop)||(Speed_right_flag==Con_Mot_Stop))
  273. {
  274. switch (Stop_Flag)
  275. {
  276. case 0:
  277. Can_Walk_Left[0]=0x2F;
  278. Can_Walk_Right[0]=0x2F;
  279. Can_Walk_Left[1]=0x00;
  280. Can_Walk_Right[1]=0x00;
  281. Can_Walk_Left[4]=Con_Mot_Stop;
  282. Can_Walk_Right[4]=Con_Mot_Stop;
  283. can_send_msg(&hcan2,0,Left_Driver, Can_Walk_Left,8 );
  284. can_send_msg(&hcan2,0,Right_Driver, Can_Walk_Right,8 );
  285. Stop_Flag=1;
  286. break;
  287. case 1:
  288. Can_Walk_Left[0]=0x2B;
  289. Can_Walk_Right[0]=0x2B;
  290. Can_Walk_Left[1]=0x01;
  291. Can_Walk_Right[1]=0x01;
  292. Can_Walk_Left[4]=0x00;
  293. Can_Walk_Right[4]=0x00;
  294. Can_Walk_Left[5]=0x00;
  295. Can_Walk_Right[5]=0x00;
  296. can_send_msg(&hcan2,0,Left_Driver, Can_Walk_Left,8 );
  297. can_send_msg(&hcan2,0,Right_Driver, Can_Walk_Right,8 );
  298. Stop_Flag=0;
  299. break;
  300. }
  301. }else
  302. {
  303. switch (Drive_Flag)
  304. {
  305. case 0:
  306. Can_Walk_Left[0]=0x2F;
  307. Can_Walk_Right[0]=0x2F;
  308. Can_Walk_Left[1]=0x00;
  309. Can_Walk_Right[1]=0x00;
  310. Can_Walk_Left[4]=Speed_left_flag;
  311. Can_Walk_Right[4]=Speed_right_flag;
  312. can_send_msg(&hcan2,0,Left_Driver, Can_Walk_Left,8 );
  313. can_send_msg(&hcan2,0,Right_Driver, Can_Walk_Right,8 );
  314. Drive_Flag=1;
  315. break;
  316. case 1:
  317. Can_Walk_Left[0]=0x2B;
  318. Can_Walk_Right[0]=0x2B;
  319. Can_Walk_Left[1]=0x01;
  320. Can_Walk_Right[1]=0x01;
  321. Can_Walk_Left[4]=L_Speed & 0xFF;
  322. Can_Walk_Right[4]=R_Speed & 0xFF;
  323. Can_Walk_Left[5]=(L_Speed>>8) & 0xFF;
  324. Can_Walk_Right[5]=(R_Speed>>8) & 0xFF;
  325. can_send_msg(&hcan2,0,Left_Driver, Can_Walk_Left,8 );
  326. can_send_msg(&hcan2,0,Right_Driver, Can_Walk_Right,8 );
  327. Drive_Flag=0;
  328. break;
  329. }
  330. }
  331. }
  332. void Can_Drive_Stop(void)
  333. {
  334. uint8_t Can_Walk_Left[8]={0x2B,0x00,0x20,0x00,0x10,0x00,0x00,0x00};
  335. uint8_t Can_Walk_Right[8]={0x2B,0x00,0x20,0x00,0x10,0x00,0x00,0x00};
  336. switch (Stop_Flag)
  337. {
  338. case 0:
  339. Can_Walk_Left[0]=0x2F;
  340. Can_Walk_Right[0]=0x2F;
  341. Can_Walk_Left[1]=0x00;
  342. Can_Walk_Right[1]=0x00;
  343. Can_Walk_Left[4]=0x10;
  344. Can_Walk_Right[4]=0x10;
  345. can_send_msg(&hcan2,0,Left_Driver, Can_Walk_Left,8 );
  346. can_send_msg(&hcan2,0,Right_Driver, Can_Walk_Right,8 );
  347. Stop_Flag=1;
  348. break;
  349. case 1:
  350. Can_Walk_Left[0]=0x2B;
  351. Can_Walk_Right[0]=0x2B;
  352. Can_Walk_Left[1]=0x01;
  353. Can_Walk_Right[1]=0x01;
  354. Can_Walk_Left[4]=0x00;
  355. Can_Walk_Right[4]=0x00;
  356. Can_Walk_Left[5]=0x00;
  357. Can_Walk_Right[5]=0x00;
  358. can_send_msg(&hcan2,0,Left_Driver, Can_Walk_Left,8 );
  359. can_send_msg(&hcan2,0,Right_Driver, Can_Walk_Right,8 );
  360. Stop_Flag=0;
  361. break;
  362. }
  363. }
  364. void KY_CAN_Send(int16_t L_Flag,int16_t L_Speed,int16_t R_Flag,int16_t R_Speed)
  365. {
  366. uint8_t Can_Walk_Left[8]={0x23,0x00,0x20,0x01,0x00,0x00,0x00,0x00};//左电机 01 速度报文
  367. uint8_t Can_Walk_Right[8]={0x23,0x00,0x20,0x02,0x00,0x00,0x00,0x00};//右电机 02 速度报文
  368. uint8_t Can_DisEnable[8]={0x2C,0x0C,0x20,0x00,0x00,0x00,0x00,0x00};//失能
  369. uint8_t Can_Enable[8]={0x2C,0x0D,0x20,0x00,0x00,0x00,0x00,0x00};//使能
  370. if((L_Flag==Con_Mot_Stop)||(R_Flag==Con_Mot_Stop))
  371. {
  372. switch (Stop_Flag)
  373. {
  374. case 0:
  375. can_send_msg(&hcan2,0,KY_Driver, Can_DisEnable,8 );
  376. Stop_Flag=1;
  377. break;
  378. case 1:
  379. Can_Walk_Left[4]=0x00;
  380. Can_Walk_Right[4]=0x00;
  381. Can_Walk_Left[5]=0x00;
  382. Can_Walk_Right[5]=0x00;
  383. can_send_msg(&hcan2,0,KY_Driver, Can_Walk_Left,8 );
  384. can_send_msg(&hcan2,0,KY_Driver, Can_Walk_Right,8 );
  385. Stop_Flag=0;
  386. break;
  387. // case 2:
  388. // Can_Walk_Left[4]=0x00;
  389. // Can_Walk_Right[4]=0x00;
  390. // Can_Walk_Left[5]=0x00;
  391. // Can_Walk_Right[5]=0x00;
  392. // //can_send_msg(&hcan2,0,KY_Driver, Can_Walk_Left,8 );
  393. // can_send_msg(&hcan2,0,KY_Driver, Can_Walk_Right,8 );
  394. // Stop_Flag=0;
  395. // break;
  396. }
  397. }else
  398. {
  399. switch (Drive_Flag)
  400. {
  401. case 0:
  402. can_send_msg(&hcan2,0,KY_Driver, Can_Enable,8 );
  403. Drive_Flag=1;
  404. break;
  405. case 1:
  406. Can_Walk_Left[4]=L_Speed & 0xFF;
  407. Can_Walk_Right[4]=R_Speed & 0xFF;
  408. Can_Walk_Left[5]=(L_Speed>>8) & 0xFF;
  409. Can_Walk_Right[5]=(R_Speed>>8) & 0xFF;
  410. can_send_msg(&hcan2,0,KY_Driver, Can_Walk_Left,8 );
  411. can_send_msg(&hcan2,0,KY_Driver, Can_Walk_Right,8 );
  412. Drive_Flag=0;
  413. break;
  414. // case 2:
  415. // Can_Walk_Left[4]=L_Speed & 0xFF;
  416. // Can_Walk_Right[4]=R_Speed & 0xFF;
  417. // Can_Walk_Left[5]=(L_Speed>>8) & 0xFF;
  418. // Can_Walk_Right[5]=(R_Speed>>8) & 0xFF;
  419. // // can_send_msg(&hcan2,0,KY_Driver, Can_Walk_Left,8 );
  420. // can_send_msg(&hcan2,0,KY_Driver, Can_Walk_Right,8 );
  421. // Drive_Flag=0;
  422. // break;
  423. }
  424. }
  425. }
  426. void KY_Can_Stop(void)
  427. {
  428. uint8_t Can_Walk_Left[8]={0x23,0x00,0x20,0x01,0x00,0x00,0x00,0x00};//左电机 01 速度报文
  429. uint8_t Can_Walk_Right[8]={0x23,0x00,0x20,0x02,0x00,0x00,0x00,0x00};//右电机 02 速度报文
  430. uint8_t Can_DisEnable[8]={0x2C,0x0C,0x20,0x00,0x00,0x00,0x00,0x00};//失能
  431. switch (Stop_Flag)
  432. {
  433. case 0:
  434. can_send_msg(&hcan2,0,KY_Driver, Can_DisEnable,8 );
  435. Stop_Flag=1;
  436. break;
  437. case 1:
  438. can_send_msg(&hcan2,0,KY_Driver, Can_Walk_Left,8 );
  439. can_send_msg(&hcan2,0,KY_Driver, Can_Walk_Right,8 );
  440. Stop_Flag=0;
  441. break;
  442. // case 2:
  443. // // can_send_msg(&hcan2,0,KY_Driver, Can_Walk_Left,8 );
  444. // can_send_msg(&hcan2,0,KY_Driver, Can_Walk_Right,8 );
  445. // Stop_Flag=0;
  446. // break;
  447. }
  448. }