bsp.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437
  1. #include "bsp.h"
  2. #include "tim.h"
  3. #include "pwm.h"
  4. /* USER CODE BEGIN 0 */
  5. int16_t Current[Motion_Num]={0};
  6. uint8_t RTK_Send_Flag=0;
  7. static uint16_t time_sharing=0;
  8. /* USER CODE END 0 */
  9. static uint8_t PWM_FLAG=0;//PWM执行一次标志位
  10. static PWM_StateTypeDef pwm_state = PWM_STATE_DISABLED; // 当前PWM状态
  11. static uint32_t startup_delay_tick = 0; // 启动延迟计时
  12. /* USER CODE BEGIN 1 */
  13. LOOPRXTYPE U_RX_BUFFER[Usart_Num];
  14. /* USER CODE END 1 */
  15. /* USER CODE BEGIN 2 */
  16. uint8_t SBUS_DATA[SBUS_SINGLE_BUFSIZE]={0};
  17. _NOM Re_Bool={
  18. .Bit.bool_0=0,
  19. .Bit.bool_1=0,
  20. .Bit.bool_2=0,
  21. .Bit.bool_3=0,
  22. .Bit.bool_4=0,
  23. .Bit.bool_5=0,
  24. .Bit.bool_6=0,
  25. .Bit.bool_7=0
  26. };
  27. SBUS_CH_Struct SBUS_CH;
  28. uint8_t sbus_init_flag = 0;
  29. /* USER CODE END 2 */
  30. /* USER CODE RECEIVE CAN */
  31. /*
  32. * 函数名 :CAN_Rx
  33. * 描述 : can中断接收函数
  34. * 根据CAN 具体配置 改写下方配置函数以及调用;
  35. * 0:无错误
  36. * 1:尚未学习
  37. * 2:堵转停止
  38. * 3:霍尔错误
  39. * 4:无法达到目标速度
  40. * 5:保留
  41. * 6:过流
  42. * 7:过热
  43. * 8:过压
  44. * 9:欠压
  45. * 10:短路/过流
  46. */
  47. void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
  48. {
  49. CAN_RXBuffer CAN1_RX_buffer;
  50. CAN_RXBuffer CAN2_RX_buffer;
  51. uint8_t CAN2_RX_R_data[8],CAN2_RX_L_data[8]={0};
  52. _uint2B Data_Move2;
  53. if(HAL_CAN_GetRxFifoFillLevel(hcan,CAN_RX_FIFO0)!=1)//有数据
  54. {
  55. }
  56. if(hcan->Instance==hcan1.Instance)
  57. {
  58. HAL_CAN_GetRxMessage(hcan, CAN_FILTER_FIFO0, &CAN1_RX_buffer.RXHeader, CAN1_RX_buffer.DATA);//获取数据
  59. }
  60. if(hcan->Instance==hcan2.Instance)
  61. {
  62. HAL_CAN_GetRxMessage(hcan, CAN_FILTER_FIFO0, &CAN2_RX_buffer.RXHeader, CAN2_RX_buffer.DATA);//获取数据
  63. if(CAN2_RX_buffer.RXHeader.StdId == 0x582)
  64. {
  65. memcpy(CAN2_RX_R_data,&CAN2_RX_buffer.DATA,8);
  66. if((CAN2_RX_R_data[0]==0x4B)&&(CAN2_RX_R_data[2]==0x21)&&(CAN2_RX_R_data[3]==0x02))
  67. {
  68. Data_Move2.data_Byte[0]= CAN2_RX_R_data[4];
  69. Data_Move2.data_Byte[1]= CAN2_RX_R_data[5];
  70. Motion_Data.Electric_Current[Motion_Right] = Data_Move2.data_int16;
  71. }
  72. }else if(CAN2_RX_buffer.RXHeader.StdId == 0x581)
  73. {
  74. memcpy(CAN2_RX_L_data,&CAN2_RX_buffer.DATA,8);
  75. if((CAN2_RX_L_data[0]==0x4B)&&(CAN2_RX_L_data[2]==0x21)&&(CAN2_RX_L_data[3]==0x01))
  76. {
  77. Data_Move2.data_Byte[0]= CAN2_RX_L_data[4];
  78. Data_Move2.data_Byte[1]= CAN2_RX_L_data[5];
  79. Motion_Data.Electric_Current[Motion_Left] =Data_Move2.data_int16;
  80. }
  81. }
  82. }
  83. }
  84. /* USER CODE END CAN */
  85. /* USER CODE RECEIVE USART1 */
  86. void Recive_Handle_Usart1 (void)
  87. {
  88. // LOGI("ID_DATA:%d,%d\n",RS232_rxbuffer.recv_end_flag,RS232_rxbuffer.rx_len);
  89. if(Rxbuffer[Usart_1].recv_end_flag == 1) //接收完成标志
  90. {
  91. Rxbuffer[Usart_1].recv_end_flag = 0;//清除接收结束标志位
  92. if(Rxbuffer[Usart_1].rx_len<25)
  93. {
  94. memset(Rxbuffer[Usart_1].RX_BUFFER,0,BUFFER_SIZE);//清除DMA缓存区
  95. }else
  96. {
  97. for(uint16_t i=0;i<Rxbuffer[Usart_1].rx_len;i++)
  98. {
  99. U_RX_BUFFER[Usart_1].RX_BUFFER[U_RX_BUFFER[Usart_1].Write] = Rxbuffer[Usart_1].RX_BUFFER[i];
  100. U_RX_BUFFER[Usart_1].Write = (U_RX_BUFFER[Usart_1].Write+1)& RXBUFFLEN;
  101. }
  102. }
  103. memset(Rxbuffer[Usart_1].RX_BUFFER,0,BUFFER_SIZE);//清除DMA缓存区
  104. Rxbuffer[Usart_1].rx_len = 0;//清除接收数量
  105. }
  106. HAL_UART_Receive_DMA(&huart1,Rxbuffer[Usart_1].RX_BUFFER,BUFFER_SIZE);//重新打开DMA接收
  107. sbus_loopdead (); //SBUS 数据处理
  108. }
  109. /* USER CODE END USART1 */
  110. /* USER CODE RECEIVE USART3 */
  111. void Recive_Handle_Usart3 (void)
  112. {
  113. if(Rxbuffer[Usart_3].recv_end_flag == 1) //接收完成标志
  114. {
  115. Rxbuffer[Usart_3].recv_end_flag = 0;//清除接收结束标志位
  116. memset(U_RX_BUFFER[Usart_3].RX_BUFFER,0,BUFFER_SIZE);//清除buf缓存区
  117. memcpy(U_RX_BUFFER[Usart_3].RX_BUFFER,Rxbuffer[Usart_3].RX_BUFFER,Rxbuffer[Usart_3].rx_len);
  118. memset(Rxbuffer[Usart_3].RX_BUFFER,0,BUFFER_SIZE);//清除DMA缓存区
  119. Rxbuffer[Usart_3].rx_len = 0;//清除接收数量
  120. }
  121. HAL_UART_Receive_DMA(&huart3,Rxbuffer[Usart_3].RX_BUFFER,BUFFER_SIZE);//重新打开DMA接收
  122. }
  123. /* USER CODE END USART3 */
  124. /* USER CODE END USART6 */
  125. /* USER CODE HANDLE SBUS */
  126. static void update_sbus(uint8_t *buf)
  127. {
  128. SBUS_CH.CH1 = ((int16_t)buf[ 1] >> 0 | ((int16_t)buf[ 2] << 8 )) & 0x07FF;
  129. SBUS_CH.CH2 = ((int16_t)buf[ 2] >> 3 | ((int16_t)buf[ 3] << 5 )) & 0x07FF;
  130. SBUS_CH.CH3 = ((int16_t)buf[ 3] >> 6 | ((int16_t)buf[ 4] << 2 ) | (int16_t)buf[ 5] << 10 ) & 0x07FF;
  131. SBUS_CH.CH4 = ((int16_t)buf[ 5] >> 1 | ((int16_t)buf[ 6] << 7 )) & 0x07FF;
  132. SBUS_CH.CH5 = ((int16_t)buf[ 6] >> 4 | ((int16_t)buf[ 7] << 4 )) & 0x07FF;
  133. SBUS_CH.CH6 = ((int16_t)buf[ 7] >> 7 | ((int16_t)buf[ 8] << 1 ) | (int16_t)buf[9] << 9 ) & 0x07FF;
  134. SBUS_CH.CH7 = ((int16_t)buf[ 9] >> 2 | ((int16_t)buf[10] << 6 )) & 0x07FF;
  135. SBUS_CH.CH8 = ((int16_t)buf[10] >> 5 | ((int16_t)buf[11] << 3 )) & 0x07FF;
  136. SBUS_CH.CH9 = ((int16_t)buf[12] << 0 | ((int16_t)buf[13] << 8 )) & 0x07FF;
  137. SBUS_CH.CH10 = ((int16_t)buf[13] >> 3 | ((int16_t)buf[14] << 5 )) & 0x07FF;
  138. SBUS_CH.CH11 = ((int16_t)buf[14] >> 6 | ((int16_t)buf[15] << 2 ) | (int16_t)buf[16] << 10 ) & 0x07FF;
  139. SBUS_CH.CH12 = ((int16_t)buf[16] >> 1 | ((int16_t)buf[17] << 7 )) & 0x07FF;
  140. SBUS_CH.CH13 = ((int16_t)buf[17] >> 4 | ((int16_t)buf[18] << 4 )) & 0x07FF;
  141. SBUS_CH.CH14 = ((int16_t)buf[18] >> 7 | ((int16_t)buf[19] << 1 ) | (int16_t)buf[20] << 9 ) & 0x07FF;
  142. SBUS_CH.CH15 = ((int16_t)buf[20] >> 2 | ((int16_t)buf[21] << 6 )) & 0x07FF;
  143. SBUS_CH.CH16 = ((int16_t)buf[21] >> 5 | ((int16_t)buf[22] << 3 )) & 0x07FF;
  144. }
  145. static void Remote_re_con(void)
  146. {
  147. //遥控器 E
  148. if(SBUS_CH.CH5==SBUS_KEY_MIN)
  149. {Re_Bool.Bit.bool_0=1;
  150. Re_Bool.Bit.bool_1=0;
  151. }else if(SBUS_CH.CH5==SBUS_KEY_MIDDLE)
  152. {Re_Bool.Bit.bool_0=0;
  153. Re_Bool.Bit.bool_1=0;
  154. }else if(SBUS_CH.CH5==SBUS_KEY_MAX)
  155. {Re_Bool.Bit.bool_0=0;
  156. Re_Bool.Bit.bool_1=1;
  157. }else{Re_Bool.Bit.bool_0=0;
  158. Re_Bool.Bit.bool_1=0;}
  159. //遥控器 F
  160. if(SBUS_CH.CH6==SBUS_KEY_MIN)
  161. {Re_Bool.Bit.bool_2=1;
  162. Re_Bool.Bit.bool_3=0;
  163. }else if(SBUS_CH.CH6==SBUS_KEY_MIDDLE)
  164. {Re_Bool.Bit.bool_2=0;
  165. Re_Bool.Bit.bool_3=0;
  166. }else if(SBUS_CH.CH6==SBUS_KEY_MAX)
  167. {Re_Bool.Bit.bool_2=0;
  168. Re_Bool.Bit.bool_3=1;
  169. }else{Re_Bool.Bit.bool_2=0;
  170. Re_Bool.Bit.bool_3=0;}
  171. //遥控器 A
  172. if(SBUS_CH.CH7==SBUS_KEY_MIN)
  173. {Re_Bool.Bit.bool_4=0;}else if(SBUS_CH.CH7==SBUS_KEY_MAX)
  174. {Re_Bool.Bit.bool_4=1;}else{Re_Bool.Bit.bool_4=0;}
  175. //遥控器 B
  176. if(SBUS_CH.CH8==SBUS_KEY_MIN)
  177. {Re_Bool.Bit.bool_5=0;}else if(SBUS_CH.CH8==SBUS_KEY_MAX)
  178. {Re_Bool.Bit.bool_5=1;}else{Re_Bool.Bit.bool_5=0;}
  179. //遥控器 C
  180. if(SBUS_CH.CH9==SBUS_KEY_MIN)
  181. {Re_Bool.Bit.bool_6=0;}else if(SBUS_CH.CH9==SBUS_KEY_MAX)
  182. {Re_Bool.Bit.bool_6=1;}else{Re_Bool.Bit.bool_6=0;}
  183. //遥控器 D
  184. if(SBUS_CH.CH10==SBUS_KEY_MIN)
  185. {Re_Bool.Bit.bool_7=0;}else if(SBUS_CH.CH10==SBUS_KEY_MAX)
  186. {Re_Bool.Bit.bool_7=1;}else{Re_Bool.Bit.bool_7=0;}
  187. }
  188. void sbus_loopdead (void)
  189. {
  190. uint8_t i;
  191. if( U_RX_BUFFER[Usart_1].Write == U_RX_BUFFER[Usart_1].Read)return; //没有新数据
  192. if( (U_RX_BUFFER[Usart_1].RX_BUFFER[U_RX_BUFFER[Usart_1].Read]==0x0f) && \
  193. (U_RX_BUFFER[Usart_1].RX_BUFFER[(U_RX_BUFFER[Usart_1].Read +24)& RXBUFFLEN] == 0x00 )&&\
  194. (U_RX_BUFFER[Usart_1].RX_BUFFER[(U_RX_BUFFER[Usart_1].Read +23)& RXBUFFLEN] == 0x00) ) //此处为SBUS协议 根据情况修改
  195. {
  196. if(((U_RX_BUFFER[Usart_1].Write - U_RX_BUFFER[Usart_1].Read)& RXBUFFLEN)>=SBUS_SINGLE_BUFSIZE)
  197. {
  198. for(i=0;i<SBUS_SINGLE_BUFSIZE;i++)
  199. {
  200. SBUS_DATA[i] = U_RX_BUFFER[Usart_1].RX_BUFFER[(U_RX_BUFFER[Usart_1].Read +i)&RXBUFFLEN]; //将数据装入数组
  201. }
  202. update_sbus(SBUS_DATA); //将sbus信号转化为通道值
  203. Remote_re_con();
  204. U_RX_BUFFER[Usart_1].Read = (U_RX_BUFFER[Usart_1].Read +SBUS_SINGLE_BUFSIZE)&RXBUFFLEN;
  205. U_RX_BUFFER[Usart_1].Flag=0;
  206. }
  207. // LOGG("SBUS_DATA %d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",SBUS_CH.CH1,SBUS_CH.CH2,SBUS_CH.CH3,SBUS_CH.CH4,SBUS_CH.CH5,SBUS_CH.CH6 \
  208. // ,SBUS_CH.CH7,SBUS_CH.CH8,SBUS_CH.CH9,SBUS_CH.CH10,SBUS_CH.CH11,SBUS_CH.CH12,SBUS_CH.CH13 \
  209. // ,SBUS_CH.CH14,SBUS_CH.CH15,SBUS_CH.CH13);
  210. // LOGG("\n");
  211. }
  212. else
  213. {
  214. U_RX_BUFFER[Usart_1].Read = (U_RX_BUFFER[Usart_1].Read +1)&RXBUFFLEN;
  215. }
  216. }
  217. /* USER CODE END SBUS */
  218. /**遥控器接收函数**/
  219. void Sbus_Can_Handle(void)
  220. {
  221. /*
  222. 上电检测各个摇杆要在中间位置才可以进行操作
  223. 自检依靠标志为检测
  224. */
  225. //(SBUS_CH.CH10 == SBUS_KEY_MIN)&&\
  226. //(SBUS_CH.CH9 == SBUS_KEY_MIN)&&\
  227. if(
  228. (SBUS_CH.CH8 == SBUS_KEY_MIN)&&\
  229. (SBUS_CH.CH7 == SBUS_KEY_MIN)&&\
  230. (SBUS_CH.CH6 == SBUS_KEY_MIDDLE)&&\
  231. (SBUS_CH.CH5 == SBUS_KEY_MIDDLE)&&\
  232. (!sbus_init_flag)&&\
  233. (SBUS_ROCK_DOWNDEAD<SBUS_CH.CH2)&&\
  234. (SBUS_CH.CH2< SBUS_ROCK_UPDEAD)&&\
  235. (SBUS_ROCK_LEFTDEAD<SBUS_CH.CH1)&&\
  236. ( SBUS_CH.CH1< SBUS_ROCK_RIGHTDEAD))
  237. {
  238. sbus_init_flag = 1;
  239. }
  240. //LOGG("%d\n",sbus_init_flag);
  241. if(sbus_init_flag)
  242. {
  243. Remote_re_con();//按键
  244. if(Re_Bool.Bit.bool_5)//手动运行
  245. {
  246. if((!Re_Bool.Bit.bool_2)&&(!Re_Bool.Bit.bool_3))
  247. {
  248. Max_Speed = 800;
  249. }else if((Re_Bool.Bit.bool_2)&&(!Re_Bool.Bit.bool_3))
  250. {
  251. Max_Speed = 500;
  252. }else if((!Re_Bool.Bit.bool_2)&&(Re_Bool.Bit.bool_3))
  253. {
  254. Max_Speed = 1000;
  255. }else Max_Speed = 800;
  256. Sbus_Motion_Re();//运动
  257. Can_Drive_Send(Speed_left_flag,Speed_left,Speed_right_flag,Speed_right);//发送
  258. // KY_CAN_Send(Speed_left_flag,Speed_left,Speed_right_flag,Speed_right);
  259. // PWM_send();//同时启停
  260. PWM_Send_Tim();// 启动带先后响应
  261. memset(&SBUS_CH,0,sizeof(SBUS_CH) );// 失控保护清零
  262. }else
  263. {
  264. Can_Drive_Stop();
  265. // KY_Can_Stop();
  266. }
  267. }
  268. }
  269. //void PWM_send(void)
  270. //{
  271. // if(Re_Bool.Bit.bool_0)
  272. // {
  273. // if((!Re_Bool.Bit.bool_1)&&(!Re_Bool.Bit.bool_2))
  274. // {
  275. //
  276. // if(PWM_FLAG !=1)
  277. // {
  278. // Tim_PWM(&htim9,1,NULL,70);//搅拌
  279. // Tim_PWM(&htim9,2,NULL,28);//抛洒
  280. // PWM_FLAG=1;
  281. //
  282. // }
  283. // }else if((Re_Bool.Bit.bool_1)&&(!Re_Bool.Bit.bool_2))
  284. // {
  285. //
  286. // if(PWM_FLAG!=2)
  287. // {
  288. // Tim_PWM(&htim9,1,NULL,75);
  289. // Tim_PWM(&htim9,2,NULL,56);
  290. // PWM_FLAG=2;
  291. //
  292. // }
  293. //
  294. // }else if((!Re_Bool.Bit.bool_1)&&(Re_Bool.Bit.bool_2))
  295. // {
  296. // if(PWM_FLAG!=3)
  297. // {
  298. // Tim_PWM(&htim9,1,NULL,80);
  299. // Tim_PWM(&htim9,2,NULL,84);
  300. // PWM_FLAG=3;
  301. // }
  302. //
  303. // }
  304. // }else
  305. // {
  306. // if(PWM_FLAG!=4)
  307. // {
  308. // Tim_PWM(&htim9,1,NULL,0);
  309. // Tim_PWM(&htim9,2,NULL,0);
  310. // PWM_FLAG=4;
  311. //
  312. // }
  313. //
  314. // }
  315. //
  316. //}
  317. //搅拌抛洒 先后 启动
  318. void PWM_Send_Tim(void)
  319. {
  320. if (!Re_Bool.Bit.bool_4) {
  321. // 失能时重置所有状态
  322. if (pwm_state != PWM_STATE_DISABLED) {
  323. Tim_PWM(&htim4, 3, NULL, 0); // 搅拌PWM关闭
  324. Tim_PWM(&htim4, 4, NULL, 0); // 抛洒PWM关闭
  325. PWM_FLAG = 0;
  326. pwm_state = PWM_STATE_DISABLED;
  327. startup_delay_tick = 0;
  328. }
  329. return;
  330. }
  331. // PD14 ------> TIM4_CH3
  332. // PD15 ------> TIM4_CH4
  333. if (pwm_state == PWM_STATE_DISABLED) {
  334. // 执行最低档抛洒(仅抛洒,搅拌暂不启动)
  335. Tim_PWM(&htim4, 3, NULL, 0); // 搅拌关闭
  336. Tim_PWM(&htim4, 4, NULL, 35); // 抛洒PWM 可改
  337. pwm_state = PWM_STATE_STARTUP;
  338. // 记录启动时间 FreeRTOS 滴答
  339. startup_delay_tick = xTaskGetTickCount();
  340. return;
  341. }
  342. if (pwm_state == PWM_STATE_STARTUP) {
  343. // 是否达到启动延迟时间 5s
  344. if (xTaskGetTickCount() - startup_delay_tick < pdMS_TO_TICKS(STARTUP_DELAY_MS)) {
  345. return;
  346. } else {
  347. // 进入正常状态
  348. pwm_state = PWM_STATE_NORMAL;
  349. }
  350. }
  351. // 档位切换(只执行一次)
  352. if (pwm_state == PWM_STATE_NORMAL) {
  353. // 中档位
  354. if ((!Re_Bool.Bit.bool_0) && (!Re_Bool.Bit.bool_1) && (PWM_FLAG != 1)) {
  355. Tim_PWM(&htim4, 3, NULL, 90); // 搅拌
  356. Tim_PWM(&htim4, 4, NULL, 56); // 抛洒
  357. PWM_FLAG = 1;
  358. }
  359. // 低档位
  360. else if ((Re_Bool.Bit.bool_0) && (!Re_Bool.Bit.bool_1) && (PWM_FLAG != 2)) {
  361. Tim_PWM(&htim4, 3, NULL, 85);
  362. Tim_PWM(&htim4, 4, NULL, 28);
  363. PWM_FLAG = 2;
  364. }
  365. // 高档位
  366. else if ((!Re_Bool.Bit.bool_0) && (Re_Bool.Bit.bool_1) && (PWM_FLAG != 3)) {
  367. Tim_PWM(&htim4, 3, NULL, 95);
  368. Tim_PWM(&htim4, 4, NULL, 84);
  369. PWM_FLAG = 3;
  370. }
  371. }
  372. }
  373. //分时发送请求数据
  374. void Time_Slicing(void)
  375. {
  376. //uint8_t data[8] = {0x40,0x00,0x21,0x01,0x00,0x00,0x00,0x00}; //请求错误状态
  377. time_sharing++;
  378. if(time_sharing%5==0) //250MS询问一次
  379. {
  380. uint8_t data[8] = {0x40,0x00,0x21,0x01,0x00,0x00,0x00,0x00};//请求电流
  381. can_send_msg(&hcan2,0,KY_Driver, data,8 );
  382. }
  383. if(time_sharing%5==4) //250MS询问一次
  384. {
  385. uint8_t data[8] = {0x40,0x00,0x21,0x02,0x00,0x00,0x00,0x00};//请求电流
  386. can_send_msg(&hcan2,0,KY_Driver, data,8 );
  387. }
  388. if(time_sharing>50000)time_sharing=0;
  389. }