soft_flow.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. #include "soft_flow.h"
  2. #include "gpio.h"
  3. #include "common.h"
  4. #include "soft_uart.h"
  5. #include "soft_flash.h"
  6. #include "soft_p_2_c.h"
  7. #include "string.h"
  8. #include "soft_water_device.h"
  9. #include "soft_seed_device.h"
  10. #include "soft_timer.h"
  11. #include "soft_test.h"
  12. #include "tim.h"
  13. flow_hl flow_dev1;
  14. flow_hl flow_dev2;
  15. void HAL_GPIO_EXTI_Callback( uint16_t GPIO_Pin )
  16. {
  17. //__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
  18. if ( GPIO_Pin == EXIT_1T_Pin )
  19. {
  20. if(HAL_GPIO_ReadPin( GPIOB, EXIT_1T_Pin ) == GPIO_PIN_SET)
  21. {
  22. flow_count_add(1,EXTI_UP);
  23. }
  24. else if (HAL_GPIO_ReadPin( GPIOB, EXIT_1T_Pin ) == GPIO_PIN_RESET)
  25. {
  26. flow_count_add(1,EXTI_FALL);
  27. }
  28. }
  29. if ( GPIO_Pin == EXIT_2T_Pin )
  30. {
  31. if(HAL_GPIO_ReadPin( GPIOB, EXIT_2T_Pin ) == GPIO_PIN_SET)
  32. {
  33. flow_count_add(2,EXTI_UP);
  34. }
  35. else if (HAL_GPIO_ReadPin( GPIOB, EXIT_2T_Pin ) == GPIO_PIN_RESET)
  36. {
  37. flow_count_add(2,EXTI_FALL);
  38. }
  39. }
  40. }
  41. /**
  42. * @file flow_count_add
  43. * @brief 外部中断计算触发数
  44. * @param none
  45. * @details
  46. * @author Zhang Sir
  47. **/
  48. void flow_count_add(uint8_t flow_num,uint8_t exti_status)
  49. {
  50. flow_hl *flow_temp = NULL;
  51. if(flow_num == 1)
  52. {
  53. flow_temp = &flow_dev1;
  54. }
  55. else
  56. {
  57. flow_temp = &flow_dev2;
  58. }
  59. if(exti_status == EXTI_UP)
  60. {
  61. if(Get_Systimer_Us() - flow_temp->falling_delay_time > 700)
  62. {
  63. flow_temp->falling_delay_falg = true;
  64. if(flow_temp->falling_delay_falg == true && flow_temp->rising_delay_flag == true)
  65. {
  66. flow_temp->falling_delay_falg = false;
  67. flow_temp->rising_delay_flag = false;
  68. flow_temp->irq_count++;
  69. if ( flow_temp->irq_count - flow_temp->irq_last_count >= 5 && flow_temp->irq_flag == 0)
  70. {
  71. flow_temp->speed = ( 1000.0f * ( flow_temp->irq_count - flow_temp->irq_last_count ) ) / FlOW_KP *
  72. ( 1000000.0f / ( Get_Systimer_Us() - flow_temp->last_time ) ); //ml/min
  73. flow_temp->irq_last_count = flow_temp->irq_count;
  74. flow_temp->last_time = Get_Systimer_Us();
  75. }
  76. }
  77. flow_temp->rising_delay_time = Get_Systimer_Us();
  78. }
  79. }
  80. else if(exti_status == EXTI_FALL)
  81. {
  82. if(Get_Systimer_Us() - flow_temp->rising_delay_time > 700)
  83. {
  84. flow_temp->rising_delay_flag = true;
  85. flow_temp->falling_delay_time = Get_Systimer_Us();
  86. }
  87. }
  88. }
  89. /**
  90. * @file L1L2_GPIO_check
  91. * @brief 34IO端口检测
  92. * @param none
  93. * @details
  94. * @author Zhang Sir
  95. **/
  96. uint8_t L3L4_Reusetype = FUNC_INPUT;
  97. GPIO_PinState L3_status = GPIO_PIN_SET;
  98. GPIO_PinState L4_status = GPIO_PIN_SET;
  99. void L1L2_GPIO_check()
  100. {
  101. static int l1l2_time = 0;
  102. if ( HAL_GetTick() - l1l2_time < 100 )
  103. return;
  104. if(L3L4_Reusetype != FUNC_INPUT)
  105. return;
  106. l1l2_time = HAL_GetTick();
  107. // 抛球信号 接PMUA1
  108. // 抛球反馈信号接 L1
  109. // 断药L2
  110. if(current_pmu_par.uavtype == JET_UAV_TYPE)
  111. {
  112. static bool jet_active = false;
  113. static uint32_t jet_time = 0;
  114. static bool jet_ack_flag = false;
  115. GPIO_PinState Dev_ack = HAL_GPIO_ReadPin( GPIOB, GPIO_PIN_8 );
  116. L3_status = GPIO_PIN_SET;//L3给默认值
  117. L4_status = HAL_GPIO_ReadPin( GPIOB, EXIT_4T_Pin );
  118. //上电持续高电平检测
  119. if (Dev_ack == 1 && jet_active == false)
  120. {
  121. //持续一段时间2s
  122. if (HAL_GetTick() - jet_time > 2000)
  123. {
  124. jet_active = true;
  125. }
  126. }
  127. //检测到低电平
  128. else if (Dev_ack == 0 && jet_active == true)
  129. {
  130. //抛物机回应已抛出
  131. if(jet_ack_flag == true)
  132. {
  133. pmu_set_ack(JET_UAV_TYPE,1,0,0);
  134. jet_ack_flag = false;
  135. }
  136. }
  137. else
  138. {
  139. jet_time = HAL_GetTick();
  140. jet_ack_flag = true;
  141. }
  142. }
  143. else if(current_pmu_par.uavtype == VK_ALL_IN_ONE)
  144. {
  145. //Tim4_init_pwmout(); //pwm输出初始化
  146. Dev.Arm_Link.connect_status = COMP_NORMAL;
  147. Dev.Arm.facid = FAC_VK_ALLINONE;
  148. Dev.Arm_Link.recv_time = HAL_GetTick();
  149. }
  150. else
  151. {
  152. L3_status = HAL_GPIO_ReadPin( GPIOB, EXIT_3T_Pin );
  153. L4_status = HAL_GPIO_ReadPin( GPIOB, EXIT_4T_Pin );
  154. }
  155. }
  156. /**
  157. * @file flow_function
  158. * @brief 流量计相关函数
  159. * @param none
  160. * @details
  161. * @author Zhang Sir
  162. **/
  163. void flow_function(void)
  164. {
  165. if ( Get_Systimer_Us() - flow_dev1.last_time >= 300000 )
  166. {
  167. if(Get_Systimer_Us() - flow_dev1.cal_delay_time > 200000)//在增加一个延时,中断里赋值lasttime有问题
  168. {
  169. flow_dev1.irq_flag = 1;
  170. flow_dev1.speed = ( 1000.0f * ( flow_dev1.irq_count - flow_dev1.irq_last_count ) ) / FlOW_KP *
  171. ( 1000000.0f / ( Get_Systimer_Us() - flow_dev1.last_time ) ); //ml/min *60 /60
  172. flow_dev1.irq_last_count = flow_dev1.irq_count;
  173. flow_dev1.last_time = Get_Systimer_Us();
  174. flow_dev1.irq_flag = 0;
  175. }
  176. }
  177. else
  178. {
  179. flow_dev1.cal_delay_time = Get_Systimer_Us();
  180. }
  181. if ( Get_Systimer_Us() - flow_dev2.last_time >= 300000 )
  182. {
  183. if(Get_Systimer_Us() - flow_dev2.cal_delay_time > 200000)
  184. {
  185. flow_dev2.irq_flag = 1;
  186. flow_dev2.speed = ( 1000.0f * ( flow_dev2.irq_count - flow_dev2.irq_last_count ) ) / FlOW_KP *
  187. ( 1000000.0f / ( Get_Systimer_Us() - flow_dev2.last_time ) ); //ml/min
  188. flow_dev2.irq_last_count = flow_dev2.irq_count;
  189. flow_dev2.last_time = Get_Systimer_Us();
  190. flow_dev2.irq_flag = 0;
  191. }
  192. }
  193. else
  194. {
  195. flow_dev2.cal_delay_time = Get_Systimer_Us();
  196. }
  197. }
  198. mimo_flow flow_mimo1;
  199. mimo_flow flow_mimo2;
  200. /**
  201. * @file can_recv_mimor_flow_function
  202. * @brief 恩曌流量计检测
  203. * @param none
  204. * @details
  205. * @author Zhang Sir
  206. **/
  207. void can_recv_mimor_flow_function(uint32_t CanID, uint8_t data[], uint8_t len)
  208. {
  209. Dev.Flow.facid = FAC_MIMO_SIG;
  210. Dev.Flow_Link1.connect_status = COMP_NORMAL;
  211. Dev.Flow_Link1.recv_time = HAL_GetTick();
  212. if(Dev.Flow_Link2.connect_status == COMP_NORMAL)
  213. {
  214. Dev.Flow.facid = FAC_MIMO_DOU;
  215. }
  216. if(CanID == CAN_MIMO_FLOW)
  217. {
  218. switch (data[0])
  219. {
  220. case 0:
  221. memcpy(&flow_mimo1.ch,&data[0],8);
  222. if(flow_mimo1.last_total_ml > flow_mimo1.total_ml)
  223. {
  224. flow_mimo1.overturn_count++;
  225. }
  226. flow_mimo1.last_total_ml = flow_mimo1.total_ml;
  227. break;
  228. case 1:
  229. Dev.Flow_Link2.connect_status = COMP_NORMAL;
  230. Dev.Flow_Link2.recv_time = HAL_GetTick();
  231. memcpy(&flow_mimo2.ch,&data[0],8);
  232. if(flow_mimo2.last_total_ml > flow_mimo2.total_ml)
  233. {
  234. flow_mimo2.overturn_count++;
  235. }
  236. flow_mimo2.last_total_ml = flow_mimo2.total_ml;
  237. break;
  238. default:
  239. break;
  240. }
  241. }
  242. else if(CanID == CAN_MIMO_FLOW_K)
  243. {
  244. if(data[1] == 0xFB && data[2] == 0x01)
  245. switch (data[2])
  246. {
  247. case 0:
  248. if(data[4] == 0XD1)
  249. {
  250. flow_mimo1.flow_k = data[5] * 256 + data[6];
  251. }
  252. break;
  253. case 1:
  254. if(data[4] == 0XD1)
  255. {
  256. flow_mimo2.flow_k = data[5] * 256 + data[6];
  257. }
  258. break;
  259. default:
  260. break;
  261. }
  262. }
  263. }
  264. vk_flow flow_vkdev1;
  265. vk_flow flow_vkdev2;