|
|
@ -3,6 +3,7 @@ |
|
|
|
#include "adc.h"
|
|
|
|
#include "tim.h"
|
|
|
|
#include "zsdk/hmp110/hmp110.hpp"
|
|
|
|
#include "zsdk/hpp272/hpp272.hpp"
|
|
|
|
#include "zsdk/zcanreceiver/zcanreceiver.hpp"
|
|
|
|
#define TAG "HARD"
|
|
|
|
using namespace iflytop; |
|
|
@ -14,74 +15,130 @@ using namespace iflytop; |
|
|
|
static osThreadId H2O2CaptureThreadId; |
|
|
|
static osThreadId AdcCaptureThreadId; |
|
|
|
|
|
|
|
// MINI_PWM 鼓风机
|
|
|
|
static TIM_HandleTypeDef* m_miniPwmBlower_htim; |
|
|
|
static uint32_t m_miniPwmBlower_channle; |
|
|
|
static ZGPIO m_miniPwmBlower_enGpio; |
|
|
|
static ZGPIO m_miniPwmBlower_fbGpio; |
|
|
|
|
|
|
|
// 加热片控制
|
|
|
|
static ZGPIO m_Heater_ctrlGpio; |
|
|
|
static ZGPIO m_Heater_safeCtrlGpio; |
|
|
|
static ZADC m_Heater_electricCurrentAdc; |
|
|
|
static ZADC m_Heater_temperatureAdc; |
|
|
|
ZGPIO m_Heater_ctrlGpio; |
|
|
|
ZGPIO m_Heater_safeCtrlGpio; |
|
|
|
ZADC m_Heater_electricCurrentAdc; |
|
|
|
ZADC m_Heater_temperatureAdc; |
|
|
|
|
|
|
|
// 鼓风机
|
|
|
|
ZGPIO m_Blowser_ctrlGpio; |
|
|
|
ZGPIO m_Blowser_safeCtrlGpio; |
|
|
|
ZADC m_Blowser_electricCurrentAdc; |
|
|
|
|
|
|
|
// 空压机
|
|
|
|
ZGPIO m_AirCompressor_ctrlGpio; |
|
|
|
ZGPIO m_AirCompressor_safeCtrlGpio; |
|
|
|
ZADC m_AirCompressor_electricCurrentAdc; |
|
|
|
|
|
|
|
// H2O2过氧化氢
|
|
|
|
static ModbusBlockHost m_H2o2Sensor_TempSensorModbusBlockHost; //
|
|
|
|
static ZADC m_H2o2Sensor_H2O2Adc; // H2O2传感器控制
|
|
|
|
static HMP110 m_H2o2Sensor_HMP110; // H2O2传感器
|
|
|
|
static int32_t m_hmp100_detectId = -1; |
|
|
|
|
|
|
|
#ifdef H2O2_SENSOR_TYPE_HMP110
|
|
|
|
static ModbusBlockHost m_H2o2Sensor_ModbusBlockHost; //
|
|
|
|
static ZADC m_H2o2Sensor_H2O2Adc; // H2O2传感器控制
|
|
|
|
static HMP110 m_H2o2Sensor_HMP110; // H2O2传感器
|
|
|
|
static int32_t m_h2o2sensor_detectId = -1; |
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef H2O2_SENSOR_TYPE_HPP272
|
|
|
|
static ModbusBlockHost m_H2o2Sensor_ModbusBlockHost; //
|
|
|
|
static HPP272 m_H2o2Sensor_HPP272; // H2O2传感器
|
|
|
|
static int32_t m_h2o2sensor_detectId = -1; |
|
|
|
#endif
|
|
|
|
|
|
|
|
/***********************************************************************************************************************
|
|
|
|
* FUNC * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
static void onAdcCaptureThreadId(void const* argument) { |
|
|
|
while (1) { |
|
|
|
osDelay(30); |
|
|
|
m_Heater_electricCurrentAdc.updateAdcValToCache(); |
|
|
|
m_Heater_temperatureAdc.updateAdcValToCache(); |
|
|
|
// m_Heater_electricCurrentAdc.updateAdcValToCache();
|
|
|
|
// m_Heater_temperatureAdc.updateAdcValToCache();
|
|
|
|
// m_Blowser_electricCurrentAdc.updateAdcValToCache();
|
|
|
|
// m_AirCompressor_electricCurrentAdc.updateAdcValToCache();
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static void onH2O2CaptureThreadId(void const* argument) { |
|
|
|
while (1) { |
|
|
|
osDelay(1000); |
|
|
|
if (m_hmp100_detectId > 0) { |
|
|
|
|
|
|
|
#ifdef H2O2_SENSOR_TYPE_HMP110
|
|
|
|
if (m_h2o2sensor_detectId > 0) { |
|
|
|
m_H2o2Sensor_H2O2Adc.updateAdcValToCache(); |
|
|
|
m_H2o2Sensor_HMP110.updateSensorDataAndErrorcode(); |
|
|
|
|
|
|
|
// float mv = adcv / 4095.0 * 3.3 * 1000;
|
|
|
|
// float ma = mv / 150.0;
|
|
|
|
// float ppm = (ma - 4) / (20 - 4) * 2000;
|
|
|
|
} |
|
|
|
#endif
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void Hardware::init() { |
|
|
|
m_miniPwmBlower_htim = &htim3; |
|
|
|
m_miniPwmBlower_channle = TIM_CHANNEL_3; |
|
|
|
m_miniPwmBlower_enGpio.initAsOutput(PC10, kxs_gpio_nopull, true, false); |
|
|
|
m_miniPwmBlower_fbGpio.initAsInput(PC9, kxs_gpio_nopull, kxs_gpio_rising_irq, false); |
|
|
|
/***********************************************************************************************************************
|
|
|
|
* 加热片 * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
m_Heater_ctrlGpio.initAsOutput(HEATER_CTRL_GPIO, kxs_gpio_nopull, true, false); |
|
|
|
m_Heater_safeCtrlGpio.initAsOutput(HEATER_SAFE_CTRL_GPIO, kxs_gpio_nopull, true, false); |
|
|
|
m_Heater_electricCurrentAdc.initialize(&hadc1, HEATER_ELECTRIC_CURRENT_ADC_CH); |
|
|
|
m_Heater_temperatureAdc.initialize(&hadc1, HEATER_TEMPERATURE_ADC_CH); |
|
|
|
/***********************************************************************************************************************
|
|
|
|
* 鼓风机 * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
|
|
|
|
m_Heater_ctrlGpio.initAsOutput(PC6, kxs_gpio_nopull, true, false); |
|
|
|
m_Heater_safeCtrlGpio.initAsOutput(PC7, kxs_gpio_nopull, true, false); |
|
|
|
// m_Heater_electricCurrentAdc.initialize(&hadc1, ADC_CHANNEL_0); //暂时注释掉,板子少了一个ADC,该ADC用于H2O2浓度
|
|
|
|
m_Heater_temperatureAdc.initialize(&hadc1, ADC_CHANNEL_1); // PA0
|
|
|
|
m_Blowser_ctrlGpio.initAsOutput(BLOWER_CTRL_GPIO, kxs_gpio_nopull, true, false); |
|
|
|
m_Blowser_safeCtrlGpio.initAsOutput(BLOWER_SAFE_CTRL_GPIO, kxs_gpio_nopull, true, false); |
|
|
|
m_Blowser_electricCurrentAdc.initialize(&hadc1, BLOWER_ELECTRIC_CURRENT_ADC_CH); |
|
|
|
|
|
|
|
ZASSERT(huart2.Init.BaudRate == 19200); |
|
|
|
m_H2o2Sensor_TempSensorModbusBlockHost.initialize(&huart2); |
|
|
|
m_H2o2Sensor_H2O2Adc.initialize(&hadc1, ADC_CHANNEL_0); // PA0
|
|
|
|
m_H2o2Sensor_HMP110.init(&m_H2o2Sensor_TempSensorModbusBlockHost); |
|
|
|
/***********************************************************************************************************************
|
|
|
|
* 空压机 * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
m_AirCompressor_ctrlGpio.initAsOutput(AIRCOMPRESSOR_CTRL_GPIO, kxs_gpio_nopull, true, false); |
|
|
|
m_AirCompressor_safeCtrlGpio.initAsOutput(AIRCOMPRESSOR_SAFE_CTRL_GPIO, kxs_gpio_nopull, true, false); |
|
|
|
m_AirCompressor_electricCurrentAdc.initialize(&hadc1, AIRCOMPRESSOR_ELECTRIC_CURRENT_ADC_CH); |
|
|
|
|
|
|
|
/***********************************************************************************************************************
|
|
|
|
* H2O2传感器 * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
/**
|
|
|
|
* @brief 探测HMP110 |
|
|
|
*/ |
|
|
|
osDelay(2000); // 等待传感器上电
|
|
|
|
|
|
|
|
#ifdef H2O2_SENSOR_TYPE_HMP110
|
|
|
|
|
|
|
|
ZASSERT(huart2.Init.BaudRate == 19200); |
|
|
|
m_H2o2Sensor_ModbusBlockHost.initialize(&huart2); |
|
|
|
m_H2o2Sensor_H2O2Adc.initialize(&hadc1, ADC_CHANNEL_0); // PA0
|
|
|
|
m_H2o2Sensor_HMP110.init(&m_H2o2Sensor_ModbusBlockHost); |
|
|
|
|
|
|
|
if (m_H2o2Sensor_HMP110.ping(1)) { |
|
|
|
m_hmp100_detectId = 1; |
|
|
|
m_h2o2sensor_detectId = 1; |
|
|
|
} |
|
|
|
if (m_H2o2Sensor_HMP110.ping(240)) { |
|
|
|
m_hmp100_detectId = 240; |
|
|
|
m_h2o2sensor_detectId = 240; |
|
|
|
} |
|
|
|
m_H2o2Sensor_HMP110.setid(m_hmp100_detectId); |
|
|
|
ZLOGI(TAG, "H2O2 Sensor detect id: %d", m_hmp100_detectId); |
|
|
|
m_H2o2Sensor_HMP110.setid(m_h2o2sensor_detectId); |
|
|
|
ZLOGI(TAG, "H2O2 HMP110 Sensor detect id: %d", m_h2o2sensor_detectId); |
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef H2O2_SENSOR_TYPE_HPP272
|
|
|
|
|
|
|
|
ZASSERT(huart3.Init.BaudRate == 19200); |
|
|
|
ZASSERT(huart3.Init.StopBits == UART_STOPBITS_2); |
|
|
|
m_H2o2Sensor_ModbusBlockHost.initialize(&huart3); |
|
|
|
m_H2o2Sensor_HPP272.init(&m_H2o2Sensor_ModbusBlockHost); |
|
|
|
|
|
|
|
if (m_H2o2Sensor_HPP272.ping(1)) { |
|
|
|
m_h2o2sensor_detectId = 1; |
|
|
|
} |
|
|
|
if (m_H2o2Sensor_HPP272.ping(240)) { |
|
|
|
m_h2o2sensor_detectId = 240; |
|
|
|
} |
|
|
|
|
|
|
|
m_H2o2Sensor_HPP272.setid(m_h2o2sensor_detectId); |
|
|
|
ZLOGI(TAG, "H2O2 HPP272 Sensor detect id: %d", m_h2o2sensor_detectId); |
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
osThreadDef(AdcCaptureThread, onAdcCaptureThreadId, osPriorityNormal, 0, 1024); |
|
|
|
AdcCaptureThreadId = osThreadCreate(osThread(AdcCaptureThread), NULL); |
|
|
@ -93,62 +150,62 @@ void Hardware::init() { |
|
|
|
/***********************************************************************************************************************
|
|
|
|
* FUMP_IMPL * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
void Hardware::mini_pwm_blower_ctrl(int32_t duty) { |
|
|
|
duty = 100 - duty; |
|
|
|
if (duty < 0) duty = 0; |
|
|
|
if (duty > 100) duty = 100; |
|
|
|
|
|
|
|
TIM_OC_InitTypeDef sConfigOC = {0}; |
|
|
|
sConfigOC.OCMode = TIM_OCMODE_PWM1; |
|
|
|
sConfigOC.Pulse = duty / 100.0 * __HAL_TIM_GET_AUTORELOAD(m_miniPwmBlower_htim); |
|
|
|
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; |
|
|
|
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; |
|
|
|
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; |
|
|
|
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; |
|
|
|
|
|
|
|
HAL_TIM_PWM_ConfigChannel(m_miniPwmBlower_htim, &sConfigOC, m_miniPwmBlower_channle); |
|
|
|
HAL_TIM_PWM_Stop(m_miniPwmBlower_htim, m_miniPwmBlower_channle); |
|
|
|
HAL_TIM_PWM_Start(m_miniPwmBlower_htim, m_miniPwmBlower_channle); |
|
|
|
|
|
|
|
m_miniPwmBlower_enGpio.write(duty != 0); |
|
|
|
} |
|
|
|
int32_t Hardware::mini_pwm_blower_read_fbcount() { //
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
void Hardware::heater_ctrl(int32_t val) { m_Heater_ctrlGpio.write(val); } |
|
|
|
void Hardware::heater_ctrl_safe_valve(int32_t val) { m_Heater_safeCtrlGpio.write(val); } |
|
|
|
int32_t Hardware::heater_read_electric_current() { |
|
|
|
// float mv = adcv / 4095.0 * 3.3 * 1000;
|
|
|
|
// float ma = mv / 150.0;
|
|
|
|
int32_t adcv = m_Heater_electricCurrentAdc.getCacheVal(); |
|
|
|
int32_t ma = (adcv / 4095.0 * 3.3 * 1000) / 150.0; |
|
|
|
return ma; |
|
|
|
} |
|
|
|
int32_t Hardware::heater_read_temperature_data() { |
|
|
|
// float mv = adcv / 4095.0 * 3.3 * 1000;
|
|
|
|
// float ma = mv / 150.0;
|
|
|
|
// float ppm = (ma - 4) / (20 - 4) * 2000;
|
|
|
|
int32_t adcv = m_Heater_temperatureAdc.getCacheVal(); |
|
|
|
int32_t ma = (adcv / 4095.0 * 3.3 * 1000) / 150.0; |
|
|
|
int32_t temp = (ma - 4) / (20 - 4) * (3000 - 0) + 0; |
|
|
|
return temp; // C*10
|
|
|
|
} |
|
|
|
|
|
|
|
/***********************************************************************************************************************
|
|
|
|
* H2O2 * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
|
|
|
|
bool Hardware::h2o2_sensor_is_online() { |
|
|
|
if (m_hmp100_detectId <= 0) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
#ifdef H2O2_SENSOR_TYPE_HMP110
|
|
|
|
if (m_h2o2sensor_detectId <= 0) return false; |
|
|
|
int32_t ecode = m_H2o2Sensor_HMP110.read_cache_errorcode(); |
|
|
|
if (ecode == -1) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
if (ecode == -1) return false; |
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef H2O2_SENSOR_TYPE_HPP272
|
|
|
|
if (m_h2o2sensor_detectId <= 0) return false; |
|
|
|
int32_t ecode = m_H2o2Sensor_HPP272.read_cache_errorcode(); |
|
|
|
if (ecode == -1) return false; |
|
|
|
#endif
|
|
|
|
|
|
|
|
return true; |
|
|
|
} |
|
|
|
int32_t Hardware::h2o2_sensor_read_calibration_date(int32_t* year, int32_t* month, int32_t* day) { return 0; } |
|
|
|
int32_t Hardware::h2o2_sensor_read_sub_ic_errorcode() { return m_H2o2Sensor_HMP110.read_cache_errorcode(); } |
|
|
|
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); } |
|
|
|
int32_t Hardware::h2o2_sensor_read_calibration_date(int32_t* year, int32_t* month, int32_t* day) { //
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
int32_t Hardware::h2o2_sensor_read_sub_ic_errorcode() { //
|
|
|
|
#ifdef H2O2_SENSOR_TYPE_HPP272
|
|
|
|
return m_H2o2Sensor_HPP272.read_cache_errorcode(); |
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef H2O2_SENSOR_TYPE_HMP110
|
|
|
|
return m_H2o2Sensor_HMP110.read_cache_errorcode(); |
|
|
|
#endif
|
|
|
|
} |
|
|
|
int32_t Hardware::h2o2_sensor_read_sub_ic_reg(int32_t add, uint16_t* val, size_t len) { //
|
|
|
|
#ifdef H2O2_SENSOR_TYPE_HPP272
|
|
|
|
return m_H2o2Sensor_HPP272.read_reg(add, val, len); |
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef H2O2_SENSOR_TYPE_HMP110
|
|
|
|
return m_H2o2Sensor_HMP110.read_reg(add, val, len); |
|
|
|
#endif
|
|
|
|
} |
|
|
|
int32_t Hardware::h2o2_sensor_data(report_h2o2_data_t* readdata) { |
|
|
|
#ifdef H2O2_SENSOR_TYPE_HMP110
|
|
|
|
int32_t ecode = m_H2o2Sensor_HMP110.read_cache_errorcode(); |
|
|
|
int32_t h2o2adcVal = m_H2o2Sensor_H2O2Adc.getCacheVal(); |
|
|
|
HMP110::hmp110_sensordata_t sensordata; |
|
|
@ -178,4 +235,26 @@ int32_t Hardware::h2o2_sensor_data(report_h2o2_data_t* readdata) { |
|
|
|
sensordata.enthalpy); |
|
|
|
|
|
|
|
return 0; |
|
|
|
#endif
|
|
|
|
#ifdef H2O2_SENSOR_TYPE_HPP272
|
|
|
|
|
|
|
|
int32_t ecode = m_H2o2Sensor_HPP272.read_cache_errorcode(); |
|
|
|
HPP272::hpp272_data_t sensordata; |
|
|
|
m_H2o2Sensor_HPP272.read_cache_sensor_data(&sensordata); |
|
|
|
|
|
|
|
readdata->subid = 0; |
|
|
|
readdata->sensor_error = ecode != 0; |
|
|
|
readdata->h2o2 = sensordata.hydrogen_peroxide_volume / 10.0; |
|
|
|
readdata->humid = sensordata.relative_humidity / 10.0; |
|
|
|
readdata->temp = sensordata.temperature1 / 10.0; |
|
|
|
readdata->saturation = sensordata.h2o_h2o2_rs / 10.0; |
|
|
|
|
|
|
|
ZLOGI(TAG, "h2o2 %d, humid %d, temp %d, sat %d", |
|
|
|
sensordata.hydrogen_peroxide_volume / 10, //
|
|
|
|
sensordata.relative_humidity / 10, //
|
|
|
|
sensordata.temperature1 / 10, //
|
|
|
|
sensordata.h2o_h2o2_rs / 10); |
|
|
|
|
|
|
|
return 0; |
|
|
|
#endif
|
|
|
|
} |