You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

218 lines
9.4 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. #include "hardware.hpp"
  2. #include "adc.h"
  3. #include "tim.h"
  4. #include "zsdk/hmp110/hmp110.hpp"
  5. #include "zsdk/hpp272/hpp272.hpp"
  6. #include "zsdk/zcanreceiver/zcanreceiver.hpp"
  7. #define TAG "HARD"
  8. using namespace iflytop;
  9. /***********************************************************************************************************************
  10. * EXT *
  11. ***********************************************************************************************************************/
  12. static osThreadId H2O2CaptureThreadId;
  13. static osThreadId AdcCaptureThreadId;
  14. /***********************************************************************************************************************
  15. * FUNC *
  16. ***********************************************************************************************************************/
  17. static void c_onAdcCaptureThread(void const* argument) { Hardware::ins().onAdcCaptureThread(); }
  18. static void c_onH2O2CaptureThread(void const* argument) { Hardware::ins().onH2O2CaptureThread(); }
  19. void Hardware::init() {
  20. /***********************************************************************************************************************
  21. * *
  22. ***********************************************************************************************************************/
  23. m_Heater_ctrlGpio.initAsOutput(HEATER_CTRL_GPIO, kxs_gpio_nopull, true, false);
  24. m_Heater_safeCtrlGpio.initAsOutput(HEATER_SAFE_CTRL_GPIO, kxs_gpio_nopull, true, false);
  25. m_Heater_electricCurrentAdc.initialize(&hadc1, HEATER_ELECTRIC_CURRENT_ADC_CH);
  26. m_Heater_temperatureAdc.initialize(&hadc1, HEATER_TEMPERATURE_ADC_CH);
  27. /***********************************************************************************************************************
  28. * *
  29. ***********************************************************************************************************************/
  30. m_Blowser_ctrlGpio.initAsOutput(BLOWER_CTRL_GPIO, kxs_gpio_nopull, true, false);
  31. m_Blowser_safeCtrlGpio.initAsOutput(BLOWER_SAFE_CTRL_GPIO, kxs_gpio_nopull, true, false);
  32. m_Blowser_electricCurrentAdc.initialize(&hadc1, BLOWER_ELECTRIC_CURRENT_ADC_CH);
  33. /***********************************************************************************************************************
  34. * *
  35. ***********************************************************************************************************************/
  36. m_AirCompressor_ctrlGpio.initAsOutput(AIRCOMPRESSOR_CTRL_GPIO, kxs_gpio_nopull, true, false);
  37. m_AirCompressor_safeCtrlGpio.initAsOutput(AIRCOMPRESSOR_SAFE_CTRL_GPIO, kxs_gpio_nopull, true, false);
  38. m_AirCompressor_electricCurrentAdc.initialize(&hadc1, AIRCOMPRESSOR_ELECTRIC_CURRENT_ADC_CH);
  39. /***********************************************************************************************************************
  40. * H2O2传感器 *
  41. ***********************************************************************************************************************/
  42. /**
  43. * @brief HMP110
  44. */
  45. osDelay(2000); // 等待传感器上电
  46. #ifdef H2O2_SENSOR_TYPE_HMP110
  47. ZASSERT(huart2.Init.BaudRate == 19200);
  48. m_H2o2Sensor_ModbusBlockHost.initialize(&huart2);
  49. m_H2o2Sensor_H2O2Adc.initialize(&hadc1, ADC_CHANNEL_0); // PA0
  50. m_H2o2Sensor_HMP110.init(&m_H2o2Sensor_ModbusBlockHost);
  51. if (m_H2o2Sensor_HMP110.ping(1)) {
  52. m_h2o2sensor_detectId = 1;
  53. }
  54. if (m_H2o2Sensor_HMP110.ping(240)) {
  55. m_h2o2sensor_detectId = 240;
  56. }
  57. m_H2o2Sensor_HMP110.setid(m_h2o2sensor_detectId);
  58. ZLOGI(TAG, "H2O2 HMP110 Sensor detect id: %d", m_h2o2sensor_detectId);
  59. #endif
  60. #ifdef H2O2_SENSOR_TYPE_HPP272
  61. ZASSERT(huart3.Init.BaudRate == 19200);
  62. ZASSERT(huart3.Init.StopBits == UART_STOPBITS_2);
  63. m_H2o2Sensor_ModbusBlockHost.initialize(&huart3);
  64. m_H2o2Sensor_HPP272.init(&m_H2o2Sensor_ModbusBlockHost);
  65. if (m_H2o2Sensor_HPP272.ping(1)) {
  66. m_h2o2sensor_detectId = 1;
  67. }
  68. if (m_H2o2Sensor_HPP272.ping(240)) {
  69. m_h2o2sensor_detectId = 240;
  70. }
  71. m_H2o2Sensor_HPP272.setid(m_h2o2sensor_detectId);
  72. ZLOGI(TAG, "H2O2 HPP272 Sensor detect id: %d", m_h2o2sensor_detectId);
  73. #endif
  74. osThreadDef(AdcCaptureThread, c_onAdcCaptureThread, osPriorityNormal, 0, 1024);
  75. AdcCaptureThreadId = osThreadCreate(osThread(AdcCaptureThread), NULL);
  76. osThreadDef(H2O2CaptureThread, c_onH2O2CaptureThread, osPriorityNormal, 0, 1024);
  77. H2O2CaptureThreadId = osThreadCreate(osThread(H2O2CaptureThread), NULL);
  78. }
  79. /***********************************************************************************************************************
  80. * H2O2 *
  81. ***********************************************************************************************************************/
  82. bool Hardware::h2o2_sensor_is_online() {
  83. #ifdef H2O2_SENSOR_TYPE_HMP110
  84. if (m_h2o2sensor_detectId <= 0) return false;
  85. int32_t ecode = m_H2o2Sensor_HMP110.read_cache_errorcode();
  86. if (ecode == -1) return false;
  87. #endif
  88. #ifdef H2O2_SENSOR_TYPE_HPP272
  89. if (m_h2o2sensor_detectId <= 0) return false;
  90. int32_t ecode = m_H2o2Sensor_HPP272.read_cache_errorcode();
  91. if (ecode == -1) return false;
  92. #endif
  93. return true;
  94. }
  95. int32_t Hardware::h2o2_sensor_read_calibration_date(int32_t* year, int32_t* month, int32_t* day) { //
  96. return 0;
  97. }
  98. int32_t Hardware::h2o2_sensor_read_sub_ic_errorcode() { //
  99. #ifdef H2O2_SENSOR_TYPE_HPP272
  100. return m_H2o2Sensor_HPP272.read_cache_errorcode();
  101. #endif
  102. #ifdef H2O2_SENSOR_TYPE_HMP110
  103. return m_H2o2Sensor_HMP110.read_cache_errorcode();
  104. #endif
  105. }
  106. int32_t Hardware::h2o2_sensor_read_sub_ic_reg(int32_t add, uint16_t* val, size_t len) { //
  107. #ifdef H2O2_SENSOR_TYPE_HPP272
  108. return m_H2o2Sensor_HPP272.read_reg(add, val, len);
  109. #endif
  110. #ifdef H2O2_SENSOR_TYPE_HMP110
  111. return m_H2o2Sensor_HMP110.read_reg(add, val, len);
  112. #endif
  113. }
  114. int32_t Hardware::h2o2_sensor_data(report_h2o2_data_t* readdata) {
  115. #ifdef H2O2_SENSOR_TYPE_HMP110
  116. int32_t ecode = m_H2o2Sensor_HMP110.read_cache_errorcode();
  117. int32_t h2o2adcVal = m_H2o2Sensor_H2O2Adc.getCacheVal();
  118. HMP110::hmp110_sensordata_t sensordata;
  119. m_H2o2Sensor_HMP110.read_cache_sensor_data(&sensordata);
  120. // float mv = adcv / 4095.0 * 3.3 * 1000;
  121. // float ma = mv / 150.0;
  122. // float ppm = (ma - 4) / (20 - 4) * 2000;
  123. int32_t h2o2ma = (h2o2adcVal / 4095.0 * 3.3 * 1000) / 150.0;
  124. int32_t h2o2ppm = (h2o2ma - 4) / (20 - 4) * 2000;
  125. readdata->subid = 0;
  126. readdata->sensor_error = ecode != 0;
  127. readdata->h2o2 = h2o2ppm;
  128. readdata->humid = sensordata.rh;
  129. readdata->temp = sensordata.temp;
  130. readdata->saturation = 0;
  131. ZLOGI(TAG, "ppm:%d, rh:%d, temp:%d, df_ptemp:%d, ah:%d, mr:%d, wbt:%d, eh:%d", //
  132. h2o2ppm, //
  133. sensordata.rh, //
  134. sensordata.temp, //
  135. sensordata.df_ptemp, //
  136. sensordata.ah, //
  137. sensordata.mr, //
  138. sensordata.wet_bulb_temp, //
  139. sensordata.enthalpy);
  140. return 0;
  141. #endif
  142. #ifdef H2O2_SENSOR_TYPE_HPP272
  143. int32_t ecode = m_H2o2Sensor_HPP272.read_cache_errorcode();
  144. HPP272::hpp272_data_t sensordata;
  145. m_H2o2Sensor_HPP272.read_cache_sensor_data(&sensordata);
  146. readdata->subid = 0;
  147. readdata->sensor_error = ecode != 0;
  148. readdata->h2o2 = sensordata.hydrogen_peroxide_volume / 10.0;
  149. readdata->humid = sensordata.relative_humidity / 10.0;
  150. readdata->temp = sensordata.temperature1 / 10.0;
  151. readdata->saturation = sensordata.h2o_h2o2_rs / 10.0;
  152. ZLOGI(TAG, "h2o2 %d, humid %d, temp %d, sat %d",
  153. sensordata.hydrogen_peroxide_volume / 10, //
  154. sensordata.relative_humidity / 10, //
  155. sensordata.temperature1 / 10, //
  156. sensordata.h2o_h2o2_rs / 10);
  157. return 0;
  158. #endif
  159. }
  160. void Hardware::onAdcCaptureThread() {
  161. while (1) {
  162. osDelay(30);
  163. m_Heater_electricCurrentAdc.updateAdcValToCache();
  164. m_Heater_temperatureAdc.updateAdcValToCache();
  165. m_Blowser_electricCurrentAdc.updateAdcValToCache();
  166. m_AirCompressor_electricCurrentAdc.updateAdcValToCache();
  167. }
  168. }
  169. void Hardware::onH2O2CaptureThread() {
  170. while (1) {
  171. osDelay(1000);
  172. #ifdef H2O2_SENSOR_TYPE_HMP110
  173. if (m_h2o2sensor_detectId > 0) {
  174. m_H2o2Sensor_H2O2Adc.updateAdcValToCache();
  175. m_H2o2Sensor_HMP110.updateSensorDataAndErrorcode();
  176. }
  177. #endif
  178. #ifdef H2O2_SENSOR_TYPE_HPP272
  179. if (m_h2o2sensor_detectId > 0) {
  180. m_H2o2Sensor_HPP272.updateSensorDataAndErrorcode();
  181. }
  182. #endif
  183. }
  184. }