Add support for multiple thermistor tables.

DEFINE_TEMP_SENSOR takes one additional argument. For TT_THERMISOR you can specify there which thermistor table to use.
This commit is contained in:
Markus Amsler 2011-04-12 20:00:18 +02:00
parent 8856dd9908
commit e937b052af
13 changed files with 84 additions and 60 deletions

View File

@ -1,4 +1,11 @@
// default thermistor lookup table // default thermistor lookup table
// How many thermistor tables we have
#define NUMTABLES 1
#define THERMISTOR_EXTRUDER 0
// #define THERMISTOR_BED 1
// Thermistor lookup table, generated with --num-temps=50 and trimmed in lower temperature ranges. // Thermistor lookup table, generated with --num-temps=50 and trimmed in lower temperature ranges.
// You may be able to improve the accuracy of this table in various ways. // You may be able to improve the accuracy of this table in various ways.
// 1. Measure the actual resistance of the resistor. It's "nominally" 4.7K, but that's ± 5%. // 1. Measure the actual resistance of the resistor. It's "nominally" 4.7K, but that's ± 5%.
@ -17,7 +24,8 @@
// max adc: 1023 // max adc: 1023
#define NUMTEMPS 20 #define NUMTEMPS 20
// {ADC, temp*4 }, // temp // {ADC, temp*4 }, // temp
uint16_t temptable[NUMTEMPS][2] PROGMEM = { uint16_t temptable[NUMTABLES][NUMTEMPS][2] PROGMEM = {
{
{1, 3364}, // 841.027617469 C {1, 3364}, // 841.027617469 C
{21, 1329}, // 332.486789769 C {21, 1329}, // 332.486789769 C
{41, 1104}, // 276.102666373 C {41, 1104}, // 276.102666373 C
@ -38,4 +46,5 @@ uint16_t temptable[NUMTEMPS][2] PROGMEM = {
{881, 219}, // 54.8051659223 C {881, 219}, // 54.8051659223 C
{981, 93}, // 23.4825243529 C {981, 93}, // 23.4825243529 C
{1010, 1} // 0.498606463441 C {1010, 1} // 0.498606463441 C
}
}; };

View File

@ -11,7 +11,7 @@
/* OR-combined mask of all channels */ /* OR-combined mask of all channels */
#undef DEFINE_TEMP_SENSOR #undef DEFINE_TEMP_SENSOR
//! automagically generate analog_mask from DEFINE_TEMP_SENSOR entries in config.h //! automagically generate analog_mask from DEFINE_TEMP_SENSOR entries in config.h
#define DEFINE_TEMP_SENSOR(name, type, pin) | (((type == TT_THERMISTOR) || (type == TT_AD595)) ? 1 << (pin) : 0) #define DEFINE_TEMP_SENSOR(name, type, pin, additional) | (((type == TT_THERMISTOR) || (type == TT_AD595)) ? 1 << (pin) : 0)
static const uint8_t analog_mask = 0 static const uint8_t analog_mask = 0
#include "config.h" #include "config.h"
; ;

View File

@ -254,9 +254,9 @@
#define DEFINE_TEMP_SENSOR(...) #define DEFINE_TEMP_SENSOR(...)
#endif #endif
// name type pin // name type pin additional
DEFINE_TEMP_SENSOR(noheater, TT_INTERCOM, 0) DEFINE_TEMP_SENSOR(noheater, TT_INTERCOM, 0, 0)
// DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, 1) // DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, 1, 0)

View File

@ -247,8 +247,8 @@
#define DEFINE_TEMP_SENSOR(...) #define DEFINE_TEMP_SENSOR(...)
#endif #endif
// name type pin // name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, PINA5) DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, PINA5, THERMISTOR_EXTRUDER)

View File

@ -247,12 +247,12 @@
#define DEFINE_TEMP_SENSOR(...) #define DEFINE_TEMP_SENSOR(...)
#endif #endif
// name type pin // name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, 0) DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, 0, THERMISTOR_EXTRUDER)
// DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, 1) // DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, 1, THERMISTOR_EXTRUDER)
// "noheater" is a special name for a sensor which doesn't have a heater. // "noheater" is a special name for a sensor which doesn't have a heater.
// Use "M105 P#" to read it, where # is a zero-based index into this list. // Use "M105 P#" to read it, where # is a zero-based index into this list.
// DEFINE_TEMP_SENSOR(noheater, TT_THERMISTOR, 1) // DEFINE_TEMP_SENSOR(noheater, TT_THERMISTOR, 1, 0)

View File

@ -256,9 +256,9 @@ temperature is "achieved" for purposes of M109 and friends when actual temperatu
#define DEFINE_TEMP_SENSOR(...) #define DEFINE_TEMP_SENSOR(...)
#endif #endif
// name type pin // name type pin additional
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO2_PIN) DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO2_PIN, THERMISTOR_EXTRUDER)
DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO1_PIN) DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO1_PIN, THERMISTOR_EXTRUDER)

View File

@ -1,4 +1,11 @@
// default thermistor lookup table // default thermistor lookup table
// How many thermistor tables we have
#define NUMTABLES 1
#define THERMISTOR_EXTRUDER 0
// #define THERMISTOR_BED 1
// Thermistor lookup table, generated with --num-temps=50 and trimmed in lower temperature ranges. // Thermistor lookup table, generated with --num-temps=50 and trimmed in lower temperature ranges.
// You may be able to improve the accuracy of this table in various ways. // You may be able to improve the accuracy of this table in various ways.
// 1. Measure the actual resistance of the resistor. It's "nominally" 4.7K, but that's ± 5%. // 1. Measure the actual resistance of the resistor. It's "nominally" 4.7K, but that's ± 5%.
@ -17,7 +24,8 @@
// max adc: 1023 // max adc: 1023
#define NUMTEMPS 20 #define NUMTEMPS 20
// {ADC, temp*4 }, // temp // {ADC, temp*4 }, // temp
uint16_t temptable[NUMTEMPS][2] PROGMEM = { uint16_t temptable[NUMTABLES][NUMTEMPS][2] PROGMEM = {
{
{1, 3364}, // 841.027617469 C {1, 3364}, // 841.027617469 C
{21, 1329}, // 332.486789769 C {21, 1329}, // 332.486789769 C
{41, 1104}, // 276.102666373 C {41, 1104}, // 276.102666373 C
@ -38,4 +46,5 @@ uint16_t temptable[NUMTEMPS][2] PROGMEM = {
{881, 219}, // 54.8051659223 C {881, 219}, // 54.8051659223 C
{981, 93}, // 23.4825243529 C {981, 93}, // 23.4825243529 C
{1010, 1} // 0.498606463441 C {1010, 1} // 0.498606463441 C
}
}; };

View File

@ -11,7 +11,7 @@
/* OR-combined mask of all channels */ /* OR-combined mask of all channels */
#undef DEFINE_TEMP_SENSOR #undef DEFINE_TEMP_SENSOR
//! automagically generate analog_mask from DEFINE_TEMP_SENSOR entries in config.h //! automagically generate analog_mask from DEFINE_TEMP_SENSOR entries in config.h
#define DEFINE_TEMP_SENSOR(name, type, pin) | (((type == TT_THERMISTOR) || (type == TT_AD595)) ? 1 << (pin) : 0) #define DEFINE_TEMP_SENSOR(name, type, pin, additional) | (((type == TT_THERMISTOR) || (type == TT_AD595)) ? 1 << (pin) : 0)
static const uint8_t analog_mask = 0 static const uint8_t analog_mask = 0
#include "config.h" #include "config.h"
; ;

View File

@ -65,8 +65,8 @@
#define TEMP_RESIDENCY_TIME 60 #define TEMP_RESIDENCY_TIME 60
#ifdef DEFINE_TEMP_SENSOR #ifdef DEFINE_TEMP_SENSOR
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, TEMP_PIN_CHANNEL) DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, TEMP_PIN_CHANNEL, THERMISTOR_EXTRUDER)
DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, TEMP_BED_PIN_CHANNEL) DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, TEMP_BED_PIN_CHANNEL, THERMISTOR_EXTRUDER)
#endif #endif
#ifdef DEFINE_HEATER #ifdef DEFINE_HEATER

View File

@ -21,6 +21,18 @@
#include "intercom.h" #include "intercom.h"
#endif #endif
#ifdef TEMP_MAX6675
#endif
#ifdef TEMP_THERMISTOR
#include "analog.h"
#include "ThermistorTable.h"
#endif
#ifdef TEMP_AD595
#include "analog.h"
#endif
typedef enum { typedef enum {
PRESENT, PRESENT,
TCOPEN TCOPEN
@ -31,11 +43,12 @@ typedef struct {
temp_type_t temp_type; ///< type of sensor temp_type_t temp_type; ///< type of sensor
uint8_t temp_pin; ///< pin that sensor is on uint8_t temp_pin; ///< pin that sensor is on
heater_t heater; ///< associated heater if any heater_t heater; ///< associated heater if any
uint8_t additional; ///< additional, sensor type specifc config
} temp_sensor_definition_t; } temp_sensor_definition_t;
#undef DEFINE_TEMP_SENSOR #undef DEFINE_TEMP_SENSOR
/// help build list of sensors from entries in config.h /// help build list of sensors from entries in config.h
#define DEFINE_TEMP_SENSOR(name, type, pin) { (type), (pin), (HEATER_ ## name) }, #define DEFINE_TEMP_SENSOR(name, type, pin, additional) { (type), (pin), (HEATER_ ## name), (additional) },
static const temp_sensor_definition_t temp_sensors[NUM_TEMP_SENSORS] = static const temp_sensor_definition_t temp_sensors[NUM_TEMP_SENSORS] =
{ {
#include "config.h" #include "config.h"
@ -54,18 +67,6 @@ struct {
uint16_t next_read_time; ///< how long until we can read this sensor again? uint16_t next_read_time; ///< how long until we can read this sensor again?
} temp_sensors_runtime[NUM_TEMP_SENSORS]; } temp_sensors_runtime[NUM_TEMP_SENSORS];
#ifdef TEMP_MAX6675
#endif
#ifdef TEMP_THERMISTOR
#include "analog.h"
#include "ThermistorTable.h"
#endif
#ifdef TEMP_AD595
#include "analog.h"
#endif
/// set up temp sensors. Currently only the 'intercom' sensor needs initialisation. /// set up temp sensors. Currently only the 'intercom' sensor needs initialisation.
void temp_init() { void temp_init() {
temp_sensor_t i; temp_sensor_t i;
@ -165,13 +166,15 @@ void temp_sensor_tick() {
#ifdef TEMP_THERMISTOR #ifdef TEMP_THERMISTOR
case TT_THERMISTOR: case TT_THERMISTOR:
do { do {
uint8_t j; uint8_t j, table_num;
//Read current temperature //Read current temperature
temp = analog_read(temp_sensors[i].temp_pin); temp = analog_read(temp_sensors[i].temp_pin);
// for thermistors the thermistor table number is in the additional field
table_num = temp_sensors[i].additional;
//Calculate real temperature based on lookup table //Calculate real temperature based on lookup table
for (j = 1; j < NUMTEMPS; j++) { for (j = 1; j < NUMTEMPS; j++) {
if (pgm_read_word(&(temptable[j][0])) > temp) { if (pgm_read_word(&(temptable[table_num][j][0])) > temp) {
// Thermistor table is already in 14.2 fixed point // Thermistor table is already in 14.2 fixed point
#ifndef EXTRUDER #ifndef EXTRUDER
if (debug_flags & DEBUG_PID) if (debug_flags & DEBUG_PID)
@ -189,17 +192,17 @@ void temp_sensor_tick() {
// Wikipedia's example linear interpolation formula. // Wikipedia's example linear interpolation formula.
temp = ( temp = (
// ((x - x₀)y₁ // ((x - x₀)y₁
((uint32_t)temp - pgm_read_word(&(temptable[j-1][0]))) * pgm_read_word(&(temptable[j][1])) ((uint32_t)temp - pgm_read_word(&(temptable[table_num][j-1][0]))) * pgm_read_word(&(temptable[table_num][j][1]))
// + // +
+ +
// (x₁-x) // (x₁-x)
(pgm_read_word(&(temptable[j][0])) - (uint32_t)temp) (pgm_read_word(&(temptable[table_num][j][0])) - (uint32_t)temp)
// y₀ ) // y₀ )
* pgm_read_word(&(temptable[j-1][1]))) * pgm_read_word(&(temptable[table_num][j-1][1])))
// / // /
/ /
// (x₁ - x₀) // (x₁ - x₀)
(pgm_read_word(&(temptable[j][0])) - pgm_read_word(&(temptable[j-1][0]))); (pgm_read_word(&(temptable[table_num][j][0])) - pgm_read_word(&(temptable[table_num][j-1][0])));
#ifndef EXTRUDER #ifndef EXTRUDER
if (debug_flags & DEBUG_PID) if (debug_flags & DEBUG_PID)
sersendf_P(PSTR(" temp:%d.%d"),temp/4,(temp%4)*25); sersendf_P(PSTR(" temp:%d.%d"),temp/4,(temp%4)*25);
@ -215,7 +218,7 @@ void temp_sensor_tick() {
//Clamp for overflows //Clamp for overflows
if (j == NUMTEMPS) if (j == NUMTEMPS)
temp = temptable[NUMTEMPS-1][1]; temp = temptable[table_num][NUMTEMPS-1][1];
temp_sensors_runtime[i].next_read_time = 0; temp_sensors_runtime[i].next_read_time = 0;
} while (0); } while (0);

View File

@ -13,7 +13,7 @@ we still need to specify which analog pins we use in machine.h for the analog se
*/ */
#undef DEFINE_TEMP_SENSOR #undef DEFINE_TEMP_SENSOR
#define DEFINE_TEMP_SENSOR(name, type, pin) TEMP_SENSOR_ ## name, #define DEFINE_TEMP_SENSOR(name, type, pin, additional) TEMP_SENSOR_ ## name,
typedef enum { typedef enum {
#include "config.h" #include "config.h"
NUM_TEMP_SENSORS, NUM_TEMP_SENSORS,

43
temp.c
View File

@ -21,6 +21,18 @@
#include "intercom.h" #include "intercom.h"
#endif #endif
#ifdef TEMP_MAX6675
#endif
#ifdef TEMP_THERMISTOR
#include "analog.h"
#include "ThermistorTable.h"
#endif
#ifdef TEMP_AD595
#include "analog.h"
#endif
typedef enum { typedef enum {
PRESENT, PRESENT,
TCOPEN TCOPEN
@ -31,11 +43,12 @@ typedef struct {
temp_type_t temp_type; ///< type of sensor temp_type_t temp_type; ///< type of sensor
uint8_t temp_pin; ///< pin that sensor is on uint8_t temp_pin; ///< pin that sensor is on
heater_t heater; ///< associated heater if any heater_t heater; ///< associated heater if any
uint8_t additional; ///< additional, sensor type specifc config
} temp_sensor_definition_t; } temp_sensor_definition_t;
#undef DEFINE_TEMP_SENSOR #undef DEFINE_TEMP_SENSOR
/// help build list of sensors from entries in config.h /// help build list of sensors from entries in config.h
#define DEFINE_TEMP_SENSOR(name, type, pin) { (type), (pin), (HEATER_ ## name) }, #define DEFINE_TEMP_SENSOR(name, type, pin, additional) { (type), (pin), (HEATER_ ## name), (additional) },
static const temp_sensor_definition_t temp_sensors[NUM_TEMP_SENSORS] = static const temp_sensor_definition_t temp_sensors[NUM_TEMP_SENSORS] =
{ {
#include "config.h" #include "config.h"
@ -54,18 +67,6 @@ struct {
uint16_t next_read_time; ///< how long until we can read this sensor again? uint16_t next_read_time; ///< how long until we can read this sensor again?
} temp_sensors_runtime[NUM_TEMP_SENSORS]; } temp_sensors_runtime[NUM_TEMP_SENSORS];
#ifdef TEMP_MAX6675
#endif
#ifdef TEMP_THERMISTOR
#include "analog.h"
#include "ThermistorTable.h"
#endif
#ifdef TEMP_AD595
#include "analog.h"
#endif
/// set up temp sensors. Currently only the 'intercom' sensor needs initialisation. /// set up temp sensors. Currently only the 'intercom' sensor needs initialisation.
void temp_init() { void temp_init() {
temp_sensor_t i; temp_sensor_t i;
@ -165,13 +166,15 @@ void temp_sensor_tick() {
#ifdef TEMP_THERMISTOR #ifdef TEMP_THERMISTOR
case TT_THERMISTOR: case TT_THERMISTOR:
do { do {
uint8_t j; uint8_t j, table_num;
//Read current temperature //Read current temperature
temp = analog_read(temp_sensors[i].temp_pin); temp = analog_read(temp_sensors[i].temp_pin);
// for thermistors the thermistor table number is in the additional field
table_num = temp_sensors[i].additional;
//Calculate real temperature based on lookup table //Calculate real temperature based on lookup table
for (j = 1; j < NUMTEMPS; j++) { for (j = 1; j < NUMTEMPS; j++) {
if (pgm_read_word(&(temptable[j][0])) > temp) { if (pgm_read_word(&(temptable[table_num][j][0])) > temp) {
// Thermistor table is already in 14.2 fixed point // Thermistor table is already in 14.2 fixed point
#ifndef EXTRUDER #ifndef EXTRUDER
if (debug_flags & DEBUG_PID) if (debug_flags & DEBUG_PID)
@ -189,17 +192,17 @@ void temp_sensor_tick() {
// Wikipedia's example linear interpolation formula. // Wikipedia's example linear interpolation formula.
temp = ( temp = (
// ((x - x₀)y₁ // ((x - x₀)y₁
((uint32_t)temp - pgm_read_word(&(temptable[j-1][0]))) * pgm_read_word(&(temptable[j][1])) ((uint32_t)temp - pgm_read_word(&(temptable[table_num][j-1][0]))) * pgm_read_word(&(temptable[table_num][j][1]))
// + // +
+ +
// (x₁-x) // (x₁-x)
(pgm_read_word(&(temptable[j][0])) - (uint32_t)temp) (pgm_read_word(&(temptable[table_num][j][0])) - (uint32_t)temp)
// y₀ ) // y₀ )
* pgm_read_word(&(temptable[j-1][1]))) * pgm_read_word(&(temptable[table_num][j-1][1])))
// / // /
/ /
// (x₁ - x₀) // (x₁ - x₀)
(pgm_read_word(&(temptable[j][0])) - pgm_read_word(&(temptable[j-1][0]))); (pgm_read_word(&(temptable[table_num][j][0])) - pgm_read_word(&(temptable[table_num][j-1][0])));
#ifndef EXTRUDER #ifndef EXTRUDER
if (debug_flags & DEBUG_PID) if (debug_flags & DEBUG_PID)
sersendf_P(PSTR(" temp:%d.%d"),temp/4,(temp%4)*25); sersendf_P(PSTR(" temp:%d.%d"),temp/4,(temp%4)*25);
@ -215,7 +218,7 @@ void temp_sensor_tick() {
//Clamp for overflows //Clamp for overflows
if (j == NUMTEMPS) if (j == NUMTEMPS)
temp = temptable[NUMTEMPS-1][1]; temp = temptable[table_num][NUMTEMPS-1][1];
temp_sensors_runtime[i].next_read_time = 0; temp_sensors_runtime[i].next_read_time = 0;
} while (0); } while (0);

2
temp.h
View File

@ -13,7 +13,7 @@ we still need to specify which analog pins we use in machine.h for the analog se
*/ */
#undef DEFINE_TEMP_SENSOR #undef DEFINE_TEMP_SENSOR
#define DEFINE_TEMP_SENSOR(name, type, pin) TEMP_SENSOR_ ## name, #define DEFINE_TEMP_SENSOR(name, type, pin, additional) TEMP_SENSOR_ ## name,
typedef enum { typedef enum {
#include "config.h" #include "config.h"
NUM_TEMP_SENSORS, NUM_TEMP_SENSORS,