Motion_model.c 18 KB

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