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.

180 lines
7.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. #include "hardware.hpp"
  2. #include "adc.h"
  3. #include "tim.h"
  4. #include "zsdk/hmp110/hmp110.hpp"
  5. #include "zsdk/zcanreceiver/zcanreceiver.hpp"
  6. #define TAG "HARD"
  7. using namespace iflytop;
  8. /***********************************************************************************************************************
  9. * EXT *
  10. ***********************************************************************************************************************/
  11. static osThreadId H2O2CaptureThreadId;
  12. static osThreadId AdcCaptureThreadId;
  13. // MINI_PWM 鼓风机
  14. static TIM_HandleTypeDef* m_miniPwmBlower_htim;
  15. static uint32_t m_miniPwmBlower_channle;
  16. static ZGPIO m_miniPwmBlower_enGpio;
  17. static ZGPIO m_miniPwmBlower_fbGpio;
  18. // 加热片控制
  19. static ZGPIO m_Heater_ctrlGpio;
  20. static ZGPIO m_Heater_safeCtrlGpio;
  21. static ZADC m_Heater_electricCurrentAdc;
  22. static ZADC m_Heater_temperatureAdc;
  23. // H2O2过氧化氢
  24. static ModbusBlockHost m_H2o2Sensor_TempSensorModbusBlockHost; //
  25. static ZADC m_H2o2Sensor_H2O2Adc; // H2O2传感器控制
  26. static HMP110 m_H2o2Sensor_HMP110; // H2O2传感器
  27. static int32_t m_hmp100_detectId = -1;
  28. static void onAdcCaptureThreadId(void const* argument) {
  29. while (1) {
  30. osDelay(30);
  31. m_Heater_electricCurrentAdc.updateAdcValToCache();
  32. m_Heater_temperatureAdc.updateAdcValToCache();
  33. }
  34. }
  35. static void onH2O2CaptureThreadId(void const* argument) {
  36. while (1) {
  37. osDelay(1000);
  38. if (m_hmp100_detectId > 0) {
  39. m_H2o2Sensor_H2O2Adc.updateAdcValToCache();
  40. m_H2o2Sensor_HMP110.updateSensorDataAndErrorcode();
  41. // float mv = adcv / 4095.0 * 3.3 * 1000;
  42. // float ma = mv / 150.0;
  43. // float ppm = (ma - 4) / (20 - 4) * 2000;
  44. }
  45. }
  46. }
  47. void Hardware::init() {
  48. m_miniPwmBlower_htim = &htim3;
  49. m_miniPwmBlower_channle = TIM_CHANNEL_3;
  50. m_miniPwmBlower_enGpio.initAsOutput(PC10, kxs_gpio_nopull, true, false);
  51. m_miniPwmBlower_fbGpio.initAsInput(PC9, kxs_gpio_nopull, kxs_gpio_rising_irq, false);
  52. m_Heater_ctrlGpio.initAsOutput(PC6, kxs_gpio_nopull, true, false);
  53. m_Heater_safeCtrlGpio.initAsOutput(PC7, kxs_gpio_nopull, true, false);
  54. // m_Heater_electricCurrentAdc.initialize(&hadc1, ADC_CHANNEL_0); //暂时注释掉,板子少了一个ADC,该ADC用于H2O2浓度
  55. m_Heater_temperatureAdc.initialize(&hadc1, ADC_CHANNEL_1); // PA0
  56. ZASSERT(huart2.Init.BaudRate == 19200);
  57. m_H2o2Sensor_TempSensorModbusBlockHost.initialize(&huart2);
  58. m_H2o2Sensor_H2O2Adc.initialize(&hadc1, ADC_CHANNEL_0); // PA0
  59. m_H2o2Sensor_HMP110.init(&m_H2o2Sensor_TempSensorModbusBlockHost);
  60. /**
  61. * @brief HMP110
  62. */
  63. osDelay(2000); // 等待传感器上电
  64. if (m_H2o2Sensor_HMP110.ping(1)) {
  65. m_hmp100_detectId = 1;
  66. }
  67. if (m_H2o2Sensor_HMP110.ping(240)) {
  68. m_hmp100_detectId = 240;
  69. }
  70. m_H2o2Sensor_HMP110.setid(m_hmp100_detectId);
  71. ZLOGI(TAG, "H2O2 Sensor detect id: %d", m_hmp100_detectId);
  72. osThreadDef(AdcCaptureThread, onAdcCaptureThreadId, osPriorityNormal, 0, 1024);
  73. AdcCaptureThreadId = osThreadCreate(osThread(AdcCaptureThread), NULL);
  74. osThreadDef(H2O2CaptureThread, onH2O2CaptureThreadId, osPriorityNormal, 0, 1024);
  75. H2O2CaptureThreadId = osThreadCreate(osThread(H2O2CaptureThread), NULL);
  76. }
  77. /***********************************************************************************************************************
  78. * FUMP_IMPL *
  79. ***********************************************************************************************************************/
  80. void Hardware::mini_pwm_blower_ctrl(int32_t duty) {
  81. duty = 100 - duty;
  82. if (duty < 0) duty = 0;
  83. if (duty > 100) duty = 100;
  84. TIM_OC_InitTypeDef sConfigOC = {0};
  85. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  86. sConfigOC.Pulse = duty / 100.0 * __HAL_TIM_GET_AUTORELOAD(m_miniPwmBlower_htim);
  87. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  88. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  89. sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  90. sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  91. HAL_TIM_PWM_ConfigChannel(m_miniPwmBlower_htim, &sConfigOC, m_miniPwmBlower_channle);
  92. HAL_TIM_PWM_Stop(m_miniPwmBlower_htim, m_miniPwmBlower_channle);
  93. HAL_TIM_PWM_Start(m_miniPwmBlower_htim, m_miniPwmBlower_channle);
  94. m_miniPwmBlower_enGpio.write(duty != 0);
  95. }
  96. int32_t Hardware::mini_pwm_blower_read_fbcount() { //
  97. return 0;
  98. }
  99. void Hardware::heater_ctrl(int32_t val) { m_Heater_ctrlGpio.write(val); }
  100. void Hardware::heater_ctrl_safe_valve(int32_t val) { m_Heater_safeCtrlGpio.write(val); }
  101. int32_t Hardware::heater_read_electric_current() {
  102. // float mv = adcv / 4095.0 * 3.3 * 1000;
  103. // float ma = mv / 150.0;
  104. int32_t adcv = m_Heater_electricCurrentAdc.getCacheVal();
  105. int32_t ma = (adcv / 4095.0 * 3.3 * 1000) / 150.0;
  106. return ma;
  107. }
  108. int32_t Hardware::heater_read_temperature_data() {
  109. // float mv = adcv / 4095.0 * 3.3 * 1000;
  110. // float ma = mv / 150.0;
  111. // float ppm = (ma - 4) / (20 - 4) * 2000;
  112. int32_t adcv = m_Heater_temperatureAdc.getCacheVal();
  113. int32_t ma = (adcv / 4095.0 * 3.3 * 1000) / 150.0;
  114. int32_t temp = (ma - 4) / (20 - 4) * (3000 - 0) + 0;
  115. return temp; // C*10
  116. }
  117. bool Hardware::h2o2_sensor_is_online() {
  118. if (m_hmp100_detectId <= 0) {
  119. return false;
  120. }
  121. int32_t ecode = m_H2o2Sensor_HMP110.read_cache_errorcode();
  122. if (ecode == -1) {
  123. return false;
  124. }
  125. return true;
  126. }
  127. int32_t Hardware::h2o2_sensor_read_calibration_date(int32_t* year, int32_t* month, int32_t* day) { return 0; }
  128. int32_t Hardware::h2o2_sensor_read_sub_ic_errorcode() { return m_H2o2Sensor_HMP110.read_cache_errorcode(); }
  129. int32_t Hardware::h2o2_sensor_read_sub_ic_reg(int32_t add, uint16_t* val, size_t len) { return m_H2o2Sensor_HMP110.read_reg(add, val, len); }
  130. int32_t Hardware::h2o2_sensor_data(report_h2o2_data_t* readdata) {
  131. int32_t ecode = m_H2o2Sensor_HMP110.read_cache_errorcode();
  132. int32_t h2o2adcVal = m_H2o2Sensor_H2O2Adc.getCacheVal();
  133. HMP110::hmp110_sensordata_t sensordata;
  134. m_H2o2Sensor_HMP110.read_cache_sensor_data(&sensordata);
  135. // float mv = adcv / 4095.0 * 3.3 * 1000;
  136. // float ma = mv / 150.0;
  137. // float ppm = (ma - 4) / (20 - 4) * 2000;
  138. int32_t h2o2ma = (h2o2adcVal / 4095.0 * 3.3 * 1000) / 150.0;
  139. int32_t h2o2ppm = (h2o2ma - 4) / (20 - 4) * 2000;
  140. readdata->subid = 0;
  141. readdata->sensor_error = ecode != 0;
  142. readdata->h2o2 = h2o2ppm;
  143. readdata->humid = sensordata.rh;
  144. readdata->temp = sensordata.temp;
  145. readdata->saturation = 0;
  146. ZLOGI(TAG, "ppm:%d, rh:%d, temp:%d, df_ptemp:%d, ah:%d, mr:%d, wbt:%d, eh:%d", //
  147. h2o2ppm, //
  148. sensordata.rh, //
  149. sensordata.temp, //
  150. sensordata.df_ptemp, //
  151. sensordata.ah, //
  152. sensordata.mr, //
  153. sensordata.wet_bulb_temp, //
  154. sensordata.enthalpy);
  155. return 0;
  156. }