soft_flow.c 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  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. GPIO_PinState L3_status = GPIO_PIN_SET;
  97. GPIO_PinState L4_status = GPIO_PIN_SET;
  98. void L1L2_GPIO_check()
  99. {
  100. static int l1l2_time = 0;
  101. if ( HAL_GetTick() - l1l2_time < 100 )
  102. {
  103. return;
  104. }
  105. l1l2_time = HAL_GetTick();
  106. // 抛球信号 接PMUA1
  107. // 抛球反馈信号接 L1
  108. // 断药L2
  109. if(uavinf.uavtype == JET_UAV_TYPE)
  110. {
  111. static bool jet_active = false;
  112. static uint32_t jet_time = 0;
  113. static bool jet_ack_flag = false;
  114. GPIO_PinState Dev_ack = HAL_GPIO_ReadPin( GPIOB, EXIT_3T_Pin );
  115. L3_status = GPIO_PIN_SET;//L3给默认值
  116. L4_status = HAL_GPIO_ReadPin( GPIOB, EXIT_4T_Pin );
  117. //上电持续高电平检测
  118. if (Dev_ack == 1 && jet_active == false)
  119. {
  120. //持续一段时间2s
  121. if (HAL_GetTick() - jet_time > 2000)
  122. {
  123. jet_active = true;
  124. }
  125. }
  126. //检测到低电平
  127. else if (Dev_ack == 0 && jet_active == true)
  128. {
  129. //抛物机回应已抛出
  130. if(jet_ack_flag == true)
  131. {
  132. pmu_set_ack(JET_UAV_TYPE,1,0,0);
  133. jet_ack_flag = false;
  134. }
  135. }
  136. else
  137. {
  138. jet_time = HAL_GetTick();
  139. jet_ack_flag = true;
  140. }
  141. }
  142. else if(uavinf.uavtype == VK_ALL_IN_ONE)
  143. {
  144. //Tim4_init_pwmout(); //pwm输出初始化
  145. Dev.Arm_Link.connect_status = COMP_NORMAL;
  146. Dev.Arm.facid = FAC_VK_ALLINONE;
  147. Dev.Arm_Link.recv_time = HAL_GetTick();
  148. }
  149. else
  150. {
  151. L3_status = HAL_GPIO_ReadPin( GPIOB, EXIT_3T_Pin );
  152. L4_status = HAL_GPIO_ReadPin( GPIOB, EXIT_4T_Pin );
  153. }
  154. }
  155. /**
  156. * @file flow_function
  157. * @brief 流量计相关函数
  158. * @param none
  159. * @details
  160. * @author Zhang Sir
  161. **/
  162. void flow_function(void)
  163. {
  164. if ( Get_Systimer_Us() - flow_dev1.last_time >= 300000 )
  165. {
  166. if(Get_Systimer_Us() - flow_dev1.cal_delay_time > 200000)//在增加一个延时,中断里赋值lasttime有问题
  167. {
  168. flow_dev1.irq_flag = 1;
  169. flow_dev1.speed = ( 1000.0f * ( flow_dev1.irq_count - flow_dev1.irq_last_count ) ) / FlOW_KP *
  170. ( 1000000.0f / ( Get_Systimer_Us() - flow_dev1.last_time ) ); //ml/min *60 /60
  171. flow_dev1.irq_last_count = flow_dev1.irq_count;
  172. flow_dev1.last_time = Get_Systimer_Us();
  173. flow_dev1.irq_flag = 0;
  174. }
  175. }
  176. else
  177. {
  178. flow_dev1.cal_delay_time = Get_Systimer_Us();
  179. }
  180. if ( Get_Systimer_Us() - flow_dev2.last_time >= 300000 )
  181. {
  182. if(Get_Systimer_Us() - flow_dev2.cal_delay_time > 200000)
  183. {
  184. flow_dev2.irq_flag = 1;
  185. flow_dev2.speed = ( 1000.0f * ( flow_dev2.irq_count - flow_dev2.irq_last_count ) ) / FlOW_KP *
  186. ( 1000000.0f / ( Get_Systimer_Us() - flow_dev2.last_time ) ); //ml/min
  187. flow_dev2.irq_last_count = flow_dev2.irq_count;
  188. flow_dev2.last_time = Get_Systimer_Us();
  189. flow_dev2.irq_flag = 0;
  190. }
  191. }
  192. else
  193. {
  194. flow_dev2.cal_delay_time = Get_Systimer_Us();
  195. }
  196. }
  197. mimo_flow flow_mimo1;
  198. mimo_flow flow_mimo2;
  199. /**
  200. * @file can_recv_mimor_flow_function
  201. * @brief 恩曌流量计检测
  202. * @param none
  203. * @details
  204. * @author Zhang Sir
  205. **/
  206. void can_recv_mimor_flow_function(uint32_t CanID, uint8_t data[], uint8_t len)
  207. {
  208. Dev.Flow.facid = FAC_MIMO_SIG;
  209. Dev.Flow_Link1.connect_status = COMP_NORMAL;
  210. Dev.Flow_Link1.recv_time = HAL_GetTick();
  211. if(Dev.Flow_Link2.connect_status == COMP_NORMAL)
  212. {
  213. Dev.Flow.facid = FAC_MIMO_DOU;
  214. }
  215. if(CanID == CAN_MIMO_FLOW)
  216. {
  217. switch (data[0])
  218. {
  219. case 0:
  220. memcpy(&flow_mimo1.ch,&data[0],8);
  221. if(flow_mimo1.last_total_ml > flow_mimo1.total_ml)
  222. {
  223. flow_mimo1.overturn_count++;
  224. }
  225. flow_mimo1.last_total_ml = flow_mimo1.total_ml;
  226. break;
  227. case 1:
  228. Dev.Flow_Link2.connect_status = COMP_NORMAL;
  229. Dev.Flow_Link2.recv_time = HAL_GetTick();
  230. memcpy(&flow_mimo2.ch,&data[0],8);
  231. if(flow_mimo2.last_total_ml > flow_mimo2.total_ml)
  232. {
  233. flow_mimo2.overturn_count++;
  234. }
  235. flow_mimo2.last_total_ml = flow_mimo2.total_ml;
  236. break;
  237. default:
  238. break;
  239. }
  240. }
  241. else if(CanID == CAN_MIMO_FLOW_K)
  242. {
  243. if(data[1] == 0xFB && data[2] == 0x01)
  244. switch (data[2])
  245. {
  246. case 0:
  247. if(data[4] == 0XD1)
  248. {
  249. flow_mimo1.flow_k = data[5] * 256 + data[6];
  250. }
  251. break;
  252. case 1:
  253. if(data[4] == 0XD1)
  254. {
  255. flow_mimo2.flow_k = data[5] * 256 + data[6];
  256. }
  257. break;
  258. default:
  259. break;
  260. }
  261. }
  262. }
  263. vk_flow flow_vkdev1;
  264. vk_flow flow_vkdev2;