Fix temperature readings, adjusting Ultimaker2+ settings, and make MAX31865 more fault tolerant.

This commit is contained in:
Rob Giseburt
2017-11-17 09:41:01 -06:00
parent 39035a1eec
commit d6ee30f5a8
3 changed files with 66 additions and 45 deletions
+28 -21
View File
@@ -94,7 +94,7 @@ struct MAX31865 final {
template <typename SPIBus_t, typename chipSelect_t>
MAX31865(const Motate::PinOptions_t options, // completely ignored, but for compatibility with ADCPin
std::function<void(void)> &&_interrupt,
std::function<void(bool)> &&_interrupt,
SPIBus_t &spi_bus,
const chipSelect_t &_cs,
float pullup_resistance = 430, // 430 is the value used on the Adafruit breakout
@@ -194,7 +194,7 @@ struct MAX31865 final {
_fault_status_needs_read = true;
}
if (_interrupt_handler) {
_interrupt_handler();
_interrupt_handler(fault_detected);
}
_state = NEEDS_SAMPLED;
};
@@ -235,7 +235,7 @@ struct MAX31865 final {
bool _fault_status_needs_read = false;
void _postReadFaultStatus() {
if (_interrupt_handler) {
_interrupt_handler();
_interrupt_handler(_fault_status.value != 0);
}
};
@@ -339,8 +339,7 @@ struct MAX31865 final {
// interface to make this a drop-in replacement (after init) for an ADCPin
float _vref = 3.3;
std::function<void(void)> _interrupt_handler;
std::function<void(bool)> _interrupt_handler;
void startSampling()
{
@@ -411,25 +410,25 @@ struct MAX31865 final {
int32_t getValue() {
return getRaw();
};
int32_t getBottom() {
return 0;
};
float getBottomVoltage() {
return 0;
};
int32_t getTop() {
return 32767;
};
float getTopVoltage() {
return _vref;
};
// int32_t getBottom() {
// return 0;
// };
// float getBottomVoltage() {
// return 0;
// };
// int32_t getTop() {
// return 32767;
// };
// float getTopVoltage() {
// return _vref;
// };
void setVoltageRange(const float vref,
const float min_expected = 0,
const float max_expected = -1,
const float ideal_steps = 1)
{
_vref = vref;
// _vref = vref;
// All of the rest are ignored, but here for compatibility of interface
};
@@ -438,19 +437,27 @@ struct MAX31865 final {
if (r < 0) {
return r*1000.0;
}
return ((r*_pullup_resistance)/32768.0) * _vref;
return ((r*_pullup_resistance)/32768.0);
};
operator float() { return getVoltage(); };
float getResistance() {
float r = getRaw();
if (r < 0) {
return r*1000.0;
}
return (r*_pullup_resistance)/32768.0;
}
void setInterrupts(const uint32_t interrupts) {
// ignore this -- it's too dangerous to accidentally change the SPI interrupts
};
// We can only support interrupt inferface option 2: a function with a closure or function pointer
void setInterruptHandler(std::function<void(void)> &&handler) {
void setInterruptHandler(std::function<void(bool)> &&handler) {
_interrupt_handler = std::move(handler);
};
void setInterruptHandler(const std::function<void(void)> &handler) {
void setInterruptHandler(const std::function<void(bool)> &handler) {
_interrupt_handler = handler;
};
+19 -18
View File
@@ -231,7 +231,7 @@
// *** axis settings **********************************************************************************
#define X_AXIS_MODE AXIS_STANDARD // xam see canonical_machine.h cmAxisMode for valid values
#define X_VELOCITY_MAX 8700 // xvm G0 max velocity in mm/min
#define X_VELOCITY_MAX 8700 // xvm G0 max velocity in mm/min
#define X_FEEDRATE_MAX X_VELOCITY_MAX // xfr G1 max feed rate in mm/min
#define X_TRAVEL_MIN 0 // xtn minimum travel - used by soft limits and homing
#define X_TRAVEL_MAX 230 // xtm travel between switches or crashes
@@ -377,15 +377,15 @@ M100.1 ({{ajh:144000.0}})
#define HAS_TEMPERATURE_SENSOR_1 true
#if HAS_TEMPERATURE_SENSOR_1
#define TEMPERATURE_SENSOR_1_CIRCUIT_TYPE ADCCircuitDifferentialPullup
#define TEMPERATURE_SENSOR_1_CIRCUIT_INIT { /*pullup_resistance:*/ 200 }
#define TEMPERATURE_SENSOR_1_TYPE PT100<ADCDifferentialPair<kADC1_Neg_PinNumber, kADC1_Pos_PinNumber>>
#define TEMPERATURE_SENSOR_1_INIT {&temperature_sensor_1_circuit}
// #define TEMPERATURE_SENSOR_1_CIRCUIT_TYPE ADCCircuitDifferentialPullup
// #define TEMPERATURE_SENSOR_1_CIRCUIT_INIT { /*pullup_resistance:*/ 200 }
// #define TEMPERATURE_SENSOR_1_TYPE PT100<ADCDifferentialPair<kADC1_Neg_PinNumber, kADC1_Pos_PinNumber>>
// #define TEMPERATURE_SENSOR_1_INIT {&temperature_sensor_1_circuit}
// #define TEMPERATURE_SENSOR_1_CIRCUIT_TYPE ADCCircuitRawResistance
// #define TEMPERATURE_SENSOR_1_CIRCUIT_INIT { }
// #define TEMPERATURE_SENSOR_1_TYPE PT100<MAX31865<SPIBus_used_t::SPIBusDevice>>
// #define TEMPERATURE_SENSOR_1_INIT {&temperature_sensor_1_circuit, spiBus, spiCSPinMux.getCS(5), /*pullup_resistance:*/ 430.0}
#define TEMPERATURE_SENSOR_1_CIRCUIT_TYPE ADCCircuitRawResistance
#define TEMPERATURE_SENSOR_1_CIRCUIT_INIT { }
#define TEMPERATURE_SENSOR_1_TYPE PT100<MAX31865<SPIBus_used_t::SPIBusDevice>>
#define TEMPERATURE_SENSOR_1_INIT {&temperature_sensor_1_circuit, spiBus, spiCSPinMux.getCS(5), /*pullup_resistance:*/ 430.0f}
#endif // HAS_TEMPERATURE_SENSOR_1
#define EXTRUDER_1_OUTPUT_PIN kHeaterOutput1_PinNumber
@@ -406,16 +406,17 @@ M100.1 ({{ajh:144000.0}})
#define EXTRUDER_2_OUTPUT_PIN kHeaterOutput2_PinNumber
#define HAS_TEMPERATURE_SENSOR_3 false
#define HAS_TEMPERATURE_SENSOR_3 true
#if HAS_TEMPERATURE_SENSOR_3
#define TEMPERATURE_SENSOR_3_CIRCUIT_TYPE ADCCircuitDifferentialPullup
#define TEMPERATURE_SENSOR_3_CIRCUIT_INIT { /*pullup_resistance:*/ 200 }
#define TEMPERATURE_SENSOR_3_TYPE PT100<ADCDifferentialPair<kADC3_Neg_PinNumber, kADC3_Pos_PinNumber>>
#define TEMPERATURE_SENSOR_3_INIT {&temperature_sensor_3_circuit}
// #define TEMPERATURE_SENSOR_3_CIRCUIT_TYPE ADCCircuitRawResistance
// #define TEMPERATURE_SENSOR_3_CIRCUIT_INIT { }
// #define TEMPERATURE_SENSOR_3_TYPE PT100<MAX31865<SPIBus_used_t::SPIBusDevice>>
// #define TEMPERATURE_SENSOR_3_INIT {&temperature_sensor_3_circuit, spiBus, spiCSPinMux.getCS(6), /*pullup_resistance:*/ 430.0}
// #define TEMPERATURE_SENSOR_3_CIRCUIT_TYPE ADCCircuitDifferentialPullup
// #define TEMPERATURE_SENSOR_3_CIRCUIT_INIT { /*pullup_resistance:*/ 200 }
// #define TEMPERATURE_SENSOR_3_TYPE PT100<ADCDifferentialPair<kADC3_Neg_PinNumber, kADC3_Pos_PinNumber>>
// #define TEMPERATURE_SENSOR_3_INIT {&temperature_sensor_3_circuit}
#define TEMPERATURE_SENSOR_3_CIRCUIT_TYPE ADCCircuitRawResistance
#define TEMPERATURE_SENSOR_3_CIRCUIT_INIT { }
#define TEMPERATURE_SENSOR_3_TYPE PT100<MAX31865<SPIBus_used_t::SPIBusDevice>>
#define TEMPERATURE_SENSOR_3_INIT {&temperature_sensor_3_circuit, spiBus, spiCSPinMux.getCS(6), /*pullup_resistance:*/ 430.0f}
#endif // HAS_TEMPERATURE_SENSOR_3
#define BED_OUTPUT_PIN kHeaterOutput11_PinNumber
+19 -6
View File
@@ -266,17 +266,16 @@ struct ADCCircuitDifferentialPullup : ADCCircuit
struct ADCCircuitRawResistance : ADCCircuit
{
const float _vref;
ADCCircuitRawResistance(const float vref = kSystemVoltage) : _vref{vref} {};
ADCCircuitRawResistance() {};
float get_resistance(float v) const override
{
return v/_vref;
return v;
};
float get_voltage(const float r) const override
{
return r*_vref;
return r;
};
};
@@ -413,6 +412,9 @@ struct PT100 {
float raw_adc_voltage = 0.0;
int32_t raw_adc_value = 0;
bool new_sample_since_read = false;
uint8_t reads_without_sample = 0;
const float variance_max = 1.1;
ValueHistory<20> history {variance_max};
@@ -432,7 +434,7 @@ struct PT100 {
template <typename... Ts>
PT100(const ADCCircuit *_circuit, Ts&&... additional_values)
: circuit{_circuit},
adc_pin{kNormal, [&]{this->adc_has_new_value();}, additional_values...}
adc_pin{kNormal, [&](bool e){this->adc_has_new_value(e);}, additional_values...}
{
adc_pin.setInterrupts(kPinInterruptOnChange|kInterruptPriorityLow);
adc_pin.setVoltageRange(kSystemVoltage,
@@ -453,6 +455,16 @@ struct PT100 {
};
float temperature_exact() {
if (!new_sample_since_read) {
reads_without_sample++;
if (reads_without_sample > 10) {
cm_alarm(STAT_TEMPERATURE_CONTROL_ERROR, "Sensor read failed 10 times.");
}
} else {
reads_without_sample = 0;
}
new_sample_since_read = false;
float r = get_resistance();
if (r < 0.0) { return -1; }
@@ -514,7 +526,7 @@ struct PT100 {
};
// Call back function from the ADC to tell it that the ADC has a new sample...
void adc_has_new_value() {
void adc_has_new_value(bool error = false) {
raw_adc_value = adc_pin.getRaw();
float v = fabs(adc_pin.getVoltage());
// if (v < 0) {
@@ -525,6 +537,7 @@ struct PT100 {
// return;
// }
history.add_sample(v);
new_sample_since_read = true;
};
};