bsp.c 14 KB

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