Temperature A to D readings now done using a moving average, like the Z probe.
This commit is contained in:
parent
33cf94e0cf
commit
00d236c5ba
2 changed files with 36 additions and 19 deletions
23
Platform.cpp
23
Platform.cpp
|
@ -204,6 +204,7 @@ void Platform::Init()
|
||||||
if(heatOnPins[i] >= 0)
|
if(heatOnPins[i] >= 0)
|
||||||
pinModeNonDue(heatOnPins[i], OUTPUT);
|
pinModeNonDue(heatOnPins[i], OUTPUT);
|
||||||
thermistorInfRs[i] = ( thermistorInfRs[i]*exp(-thermistorBetas[i]/(25.0 - ABS_ZERO)) );
|
thermistorInfRs[i] = ( thermistorInfRs[i]*exp(-thermistorBetas[i]/(25.0 - ABS_ZERO)) );
|
||||||
|
tempSum[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(coolingFanPin >= 0)
|
if(coolingFanPin >= 0)
|
||||||
|
@ -212,6 +213,8 @@ void Platform::Init()
|
||||||
analogWrite(coolingFanPin, 0);
|
analogWrite(coolingFanPin, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NumAtoDReadingsAveraged = 8; // must be an even number, preferably a power of 2 for performance, and no greater than 64
|
||||||
|
|
||||||
InitialiseInterrupts();
|
InitialiseInterrupts();
|
||||||
|
|
||||||
addToTime = 0.0;
|
addToTime = 0.0;
|
||||||
|
@ -251,6 +254,7 @@ void Platform::Spin()
|
||||||
if(Time() - lastTime < 0.006)
|
if(Time() - lastTime < 0.006)
|
||||||
return;
|
return;
|
||||||
PollZHeight();
|
PollZHeight();
|
||||||
|
PollTemperatures();
|
||||||
lastTime = Time();
|
lastTime = Time();
|
||||||
ClassReport("Platform", longWait);
|
ClassReport("Platform", longWait);
|
||||||
|
|
||||||
|
@ -359,15 +363,18 @@ void Platform::ClassReport(char* className, float &lastTime)
|
||||||
float Platform::GetTemperature(int8_t heater)
|
float Platform::GetTemperature(int8_t heater)
|
||||||
{
|
{
|
||||||
// If the ADC reading is N then for an ideal ADC, the input voltage is at least N/(AD_RANGE + 1) and less than (N + 1)/(AD_RANGE + 1), times the analog reference.
|
// If the ADC reading is N then for an ideal ADC, the input voltage is at least N/(AD_RANGE + 1) and less than (N + 1)/(AD_RANGE + 1), times the analog reference.
|
||||||
// So we add 0.5 to to the reading to get a better estimate of the input. But first, recognise the special case of thermistor disconnected.
|
// So we add 0.5 to to the reading to get a better estimate of the input.
|
||||||
int rawTemp = GetRawTemperature(heater);
|
int rawTemp = tempSum[heater]/NumAtoDReadingsAveraged; //GetRawTemperature(heater);
|
||||||
if (rawTemp == AD_RANGE)
|
|
||||||
{
|
// First, recognise the special case of thermistor disconnected.
|
||||||
// Thermistor is disconnected
|
// if (rawTemp == AD_RANGE)
|
||||||
return ABS_ZERO;
|
// {
|
||||||
}
|
// // Thermistor is disconnected
|
||||||
|
// return ABS_ZERO;
|
||||||
|
// }
|
||||||
float r = (float)rawTemp + 0.5;
|
float r = (float)rawTemp + 0.5;
|
||||||
return ABS_ZERO + thermistorBetas[heater]/log( (r*thermistorSeriesRs[heater]/((AD_RANGE + 1) - r))/thermistorInfRs[heater] );
|
r = ABS_ZERO + thermistorBetas[heater]/log( (r*thermistorSeriesRs[heater]/((AD_RANGE + 1) - r))/thermistorInfRs[heater] );
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
32
Platform.h
32
Platform.h
|
@ -189,7 +189,6 @@ const unsigned int httpOutputBufferSize = 2 * 1432;
|
||||||
#define BAUD_RATE 115200 // Communication speed of the USB if needed.
|
#define BAUD_RATE 115200 // Communication speed of the USB if needed.
|
||||||
|
|
||||||
const uint16_t lineBufsize = 256; // use a power of 2 for good performance
|
const uint16_t lineBufsize = 256; // use a power of 2 for good performance
|
||||||
const uint16_t NumZProbeReadingsAveraged = 8; // must be an even number, preferably a power of 2 for performance, and no greater than 64
|
|
||||||
|
|
||||||
/****************************************************************************************************/
|
/****************************************************************************************************/
|
||||||
|
|
||||||
|
@ -549,6 +548,7 @@ class Platform
|
||||||
int zProbeADValue;
|
int zProbeADValue;
|
||||||
float zProbeStopHeight;
|
float zProbeStopHeight;
|
||||||
bool zProbeEnable;
|
bool zProbeEnable;
|
||||||
|
|
||||||
// AXES
|
// AXES
|
||||||
|
|
||||||
void InitZProbe();
|
void InitZProbe();
|
||||||
|
@ -557,14 +557,13 @@ class Platform
|
||||||
float axisLengths[AXES];
|
float axisLengths[AXES];
|
||||||
float homeFeedrates[AXES];
|
float homeFeedrates[AXES];
|
||||||
float headOffsets[AXES]; // FIXME - needs a 2D array
|
float headOffsets[AXES]; // FIXME - needs a 2D array
|
||||||
// bool zProbeStarting;
|
|
||||||
// float zProbeHigh;
|
|
||||||
// float zProbeLow;
|
|
||||||
|
|
||||||
// HEATERS - Bed is assumed to be the first
|
// HEATERS - Bed is assumed to be the first
|
||||||
|
|
||||||
int GetRawTemperature(byte heater) const;
|
int GetRawTemperature(byte heater) const;
|
||||||
|
void PollTemperatures();
|
||||||
|
|
||||||
|
long tempSum[HEATERS];
|
||||||
int8_t tempSensePins[HEATERS];
|
int8_t tempSensePins[HEATERS];
|
||||||
int8_t heatOnPins[HEATERS];
|
int8_t heatOnPins[HEATERS];
|
||||||
float thermistorBetas[HEATERS];
|
float thermistorBetas[HEATERS];
|
||||||
|
@ -582,7 +581,8 @@ class Platform
|
||||||
float standbyTemperatures[HEATERS];
|
float standbyTemperatures[HEATERS];
|
||||||
float activeTemperatures[HEATERS];
|
float activeTemperatures[HEATERS];
|
||||||
int8_t coolingFanPin;
|
int8_t coolingFanPin;
|
||||||
//int8_t turnHeatOn;
|
|
||||||
|
uint16_t NumAtoDReadingsAveraged; // Smoothing filter on A to D readings
|
||||||
|
|
||||||
// Serial/USB
|
// Serial/USB
|
||||||
|
|
||||||
|
@ -815,10 +815,12 @@ inline void Platform::PollZHeight()
|
||||||
{
|
{
|
||||||
uint16_t currentReading = GetRawZHeight();
|
uint16_t currentReading = GetRawZHeight();
|
||||||
|
|
||||||
|
// We do a moving average of the probe's A to D readings to smooth out noise
|
||||||
|
|
||||||
if (zModOnThisTime)
|
if (zModOnThisTime)
|
||||||
zProbeOnSum = zProbeOnSum + currentReading - zProbeOnSum/NumZProbeReadingsAveraged;
|
zProbeOnSum = zProbeOnSum + currentReading - zProbeOnSum/NumAtoDReadingsAveraged;
|
||||||
else
|
else
|
||||||
zProbeOffSum = zProbeOffSum + currentReading - zProbeOffSum/NumZProbeReadingsAveraged;
|
zProbeOffSum = zProbeOffSum + currentReading - zProbeOffSum/NumAtoDReadingsAveraged;
|
||||||
|
|
||||||
zModOnThisTime = !zModOnThisTime;
|
zModOnThisTime = !zModOnThisTime;
|
||||||
|
|
||||||
|
@ -832,18 +834,18 @@ inline void Platform::PollZHeight()
|
||||||
inline int Platform::ZProbe() const
|
inline int Platform::ZProbe() const
|
||||||
{
|
{
|
||||||
return (zProbeType == 1)
|
return (zProbeType == 1)
|
||||||
? (zProbeOnSum + zProbeOffSum)/NumZProbeReadingsAveraged // non-modulated mode
|
? (zProbeOnSum + zProbeOffSum)/NumAtoDReadingsAveraged // non-modulated mode
|
||||||
: (zProbeType == 2)
|
: (zProbeType == 2)
|
||||||
? (zProbeOnSum - zProbeOffSum)/(NumZProbeReadingsAveraged/2) // modulated mode
|
? (zProbeOnSum - zProbeOffSum)/(NumAtoDReadingsAveraged/2) // modulated mode
|
||||||
: 0; // z-probe disabled
|
: 0; // z-probe disabled
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int Platform::ZProbeOnVal() const
|
inline int Platform::ZProbeOnVal() const
|
||||||
{
|
{
|
||||||
return (zProbeType == 1)
|
return (zProbeType == 1)
|
||||||
? (zProbeOnSum + zProbeOffSum)/NumZProbeReadingsAveraged
|
? (zProbeOnSum + zProbeOffSum)/NumAtoDReadingsAveraged
|
||||||
: (zProbeType == 2)
|
: (zProbeType == 2)
|
||||||
? zProbeOnSum/(NumZProbeReadingsAveraged/2)
|
? zProbeOnSum/(NumAtoDReadingsAveraged/2)
|
||||||
: 0;
|
: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -887,6 +889,14 @@ inline int Platform::GetRawTemperature(byte heater) const
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void Platform::PollTemperatures()
|
||||||
|
{
|
||||||
|
// We do a moving average of each thermometer's A to D readings to smooth out noise
|
||||||
|
|
||||||
|
for(int8_t heater = 0; heater < HEATERS; heater++)
|
||||||
|
tempSum[heater] = tempSum[heater] + GetRawTemperature(heater) - tempSum[heater]/NumAtoDReadingsAveraged;
|
||||||
|
}
|
||||||
|
|
||||||
inline float Platform::HeatSampleTime() const
|
inline float Platform::HeatSampleTime() const
|
||||||
{
|
{
|
||||||
return heatSampleTime;
|
return heatSampleTime;
|
||||||
|
|
Reference in a new issue