|
|
@ -5,54 +5,76 @@ using namespace iflytop; |
|
|
|
|
|
|
|
void TemperatureSensor::initialize(ADC_HandleTypeDef* hadc1, int32_t channel) { //
|
|
|
|
m_adc.initialize(hadc1, channel); |
|
|
|
m_mutex.init(); |
|
|
|
} |
|
|
|
|
|
|
|
float TemperatureSensor::readCurrentVal() { |
|
|
|
int32_t TemperatureSensor::_readAdcVal() { |
|
|
|
int32_t adcval = 0; |
|
|
|
m_adc.get_adc_value(adcval); |
|
|
|
float v = adcval * 3.3 / 4096; |
|
|
|
float I = v / 150.0 * 1000; |
|
|
|
return adcval; |
|
|
|
} |
|
|
|
|
|
|
|
return I; |
|
|
|
int32_t TemperatureSensor::_readAdcValMuti() { |
|
|
|
int32_t ival[30] = {0}; |
|
|
|
for (int32_t i = 0; i < 30; i++) { |
|
|
|
ival[i] = _readAdcVal(); |
|
|
|
} |
|
|
|
// 排序
|
|
|
|
for (int32_t i = 0; i < 30; i++) { |
|
|
|
for (int32_t j = i + 1; j < 30; j++) { |
|
|
|
if (ival[i] > ival[j]) { |
|
|
|
int32_t temp = ival[i]; |
|
|
|
ival[i] = ival[j]; |
|
|
|
ival[j] = temp; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
// 去掉最大最小值
|
|
|
|
int32_t sum = 0; |
|
|
|
for (int32_t i = 5; i < 25; i++) { |
|
|
|
sum += ival[i]; |
|
|
|
} |
|
|
|
return sum / 20.0; |
|
|
|
} |
|
|
|
void TemperatureSensor::loop() { |
|
|
|
// currentI
|
|
|
|
int32_t adcVal = _readAdcValMuti(); |
|
|
|
{ |
|
|
|
zlock_guard l(m_mutex); |
|
|
|
m_advVal = adcVal; |
|
|
|
} |
|
|
|
osDelay(30); |
|
|
|
} |
|
|
|
|
|
|
|
int32_t TemperatureSensor::_getTemperature(int32_t& sensorval) { |
|
|
|
// 4000ma->20ma ==> 0->350
|
|
|
|
// V=150*I
|
|
|
|
// I=V/150
|
|
|
|
|
|
|
|
|
|
|
|
int32_t TemperatureSensor::getTemperature(int32_t& sensorval) { |
|
|
|
int32_t adcval = 0; |
|
|
|
|
|
|
|
m_adc.get_adc_value(adcval); |
|
|
|
{ |
|
|
|
zlock_guard l(m_mutex); |
|
|
|
adcval = m_advVal; |
|
|
|
} |
|
|
|
|
|
|
|
float v = adcval * 3.3 / 4096; |
|
|
|
float I = v / 150.0 * 1000; |
|
|
|
int32_t temperature001 = (I - 4) / (20 - 4) * 350 * 100; // 0.01度
|
|
|
|
if (temperature001 < 0) { |
|
|
|
temperature001 = 0; |
|
|
|
} |
|
|
|
|
|
|
|
sensorval = temperature001; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
int32_t TemperatureSensor::getTemperature(int32_t& sensorval) { //
|
|
|
|
int32_t adcval[10] = {0}; |
|
|
|
for (int32_t i = 0; i < 10; i++) { |
|
|
|
_getTemperature(adcval[i]); |
|
|
|
} |
|
|
|
// 排序
|
|
|
|
for (int32_t i = 0; i < 10; i++) { |
|
|
|
for (int32_t j = i + 1; j < 10; j++) { |
|
|
|
if (adcval[i] > adcval[j]) { |
|
|
|
int32_t temp = adcval[i]; |
|
|
|
adcval[i] = adcval[j]; |
|
|
|
adcval[j] = temp; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
// 去掉最大最小值
|
|
|
|
int32_t sum = 0; |
|
|
|
for (int32_t i = 1; i < 9; i++) { |
|
|
|
sum += adcval[i]; |
|
|
|
float TemperatureSensor::readCurrentVal() { |
|
|
|
int32_t adcval = 0; |
|
|
|
|
|
|
|
{ |
|
|
|
zlock_guard l(m_mutex); |
|
|
|
adcval = m_advVal; |
|
|
|
} |
|
|
|
sensorval = sum / 8.0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
float v = adcval * 3.3 / 4096; |
|
|
|
float I = v / 150.0 * 1000; |
|
|
|
|
|
|
|
return I; |
|
|
|
} |