attempt to move heater PID to extruder controller board
This commit is contained in:
parent
773241399d
commit
95e7013dd6
|
|
@ -31,7 +31,7 @@
|
||||||
|
|
||||||
PROGRAM = extruder
|
PROGRAM = extruder
|
||||||
|
|
||||||
SOURCES = $(PROGRAM).c intercom.c delay.c analog.c watchdog.c
|
SOURCES = $(PROGRAM).c intercom.c delay.c analog.c watchdog.c heater.c temp.c
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# #
|
# #
|
||||||
|
|
|
||||||
|
|
@ -26,15 +26,49 @@
|
||||||
#define TRIM_POT AIO0
|
#define TRIM_POT AIO0
|
||||||
#define TRIM_POT_CHANNEL 0
|
#define TRIM_POT_CHANNEL 0
|
||||||
|
|
||||||
//Debug LED will blink on RS485 transmission
|
|
||||||
#define DEBUG_LED DIO13
|
|
||||||
|
|
||||||
//Read analog voltage from thermistor
|
//Read analog voltage from thermistor
|
||||||
#define TEMP_PIN AIO3
|
#define TEMP_PIN AIO3
|
||||||
#define TEMP_PIN_CHANNEL 3
|
#define TEMP_PIN_CHANNEL 3
|
||||||
|
|
||||||
#define REFERENCE REFERENCE_AVCC
|
#define REFERENCE REFERENCE_AVCC
|
||||||
|
|
||||||
|
#define ANALOG_MASK (MASK(TRIM_POT_CHANNEL) | MASK(TEMP_PIN_CHANNEL))
|
||||||
|
|
||||||
|
#define TEMP_THERMISTOR
|
||||||
|
|
||||||
|
// extruder settings
|
||||||
|
#define TEMP_HYSTERESIS 20
|
||||||
|
#define TEMP_RESIDENCY_TIME 60
|
||||||
|
|
||||||
|
#define NUM_TEMP_SENSORS 1
|
||||||
|
#ifdef TEMP_C
|
||||||
|
/***************************************************************************\
|
||||||
|
* *
|
||||||
|
* Fill in the following struct according to your hardware *
|
||||||
|
* *
|
||||||
|
* If your temperature sensor has no associated heater, enter '255' as the *
|
||||||
|
* heater index. *
|
||||||
|
* *
|
||||||
|
* for GEN3 set temp_type to TT_INTERCOM, temp_pin to 0 and heater index to *
|
||||||
|
* 255 *
|
||||||
|
* *
|
||||||
|
\***************************************************************************/
|
||||||
|
|
||||||
|
struct {
|
||||||
|
uint8_t temp_type;
|
||||||
|
uint8_t temp_pin;
|
||||||
|
|
||||||
|
uint8_t heater_index;
|
||||||
|
} temp_sensors[NUM_TEMP_SENSORS] =
|
||||||
|
{
|
||||||
|
{
|
||||||
|
TT_THERMISTOR,
|
||||||
|
PINC3,
|
||||||
|
0
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
// list of PWM-able pins and corresponding timers
|
// list of PWM-able pins and corresponding timers
|
||||||
// timer1 is used for step timing so don't use OC1A/OC1B (DIO9/DIO10)
|
// timer1 is used for step timing so don't use OC1A/OC1B (DIO9/DIO10)
|
||||||
// OC0A DIO6
|
// OC0A DIO6
|
||||||
|
|
@ -44,12 +78,46 @@
|
||||||
// OC2A DIO11
|
// OC2A DIO11
|
||||||
// OC2B DIO3
|
// OC2B DIO3
|
||||||
|
|
||||||
#define HEATER_PIN DIO11
|
#define TH_COUNT 8
|
||||||
#define HEATER_PWM OCR2A
|
#define PID_SCALE 1024L
|
||||||
|
|
||||||
#define BED_PIN DIO12
|
#define NUM_HEATERS 2
|
||||||
|
#ifdef HEATER_C
|
||||||
|
/***************************************************************************\
|
||||||
|
* *
|
||||||
|
* Fill in the following struct according to your hardware *
|
||||||
|
* *
|
||||||
|
* For the atmega168/328, timer/pin mappings are as follows *
|
||||||
|
* *
|
||||||
|
* OCR0A - PD6 *
|
||||||
|
* OCR0B - PD5 *
|
||||||
|
* OCR2A - PB3 *
|
||||||
|
* OCR2B - PD3 *
|
||||||
|
* *
|
||||||
|
\***************************************************************************/
|
||||||
|
struct {
|
||||||
|
volatile uint8_t *heater_port;
|
||||||
|
uint8_t heater_pin;
|
||||||
|
volatile uint8_t *heater_pwm;
|
||||||
|
} heaters[NUM_HEATERS] =
|
||||||
|
{
|
||||||
|
{
|
||||||
|
&PORTD,
|
||||||
|
PIND6,
|
||||||
|
&OCR0A
|
||||||
|
},
|
||||||
|
{
|
||||||
|
&PORTB,
|
||||||
|
PINB4,
|
||||||
|
0
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
#define ANALOG_MASK (MASK(TRIM_POT_CHANNEL) | MASK(TEMP_PIN_CHANNEL))
|
// #define HEATER_PIN DIO11
|
||||||
|
// #define HEATER_PWM OCR2A
|
||||||
|
//
|
||||||
|
// #define BED_PIN DIO12
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Intercom
|
Intercom
|
||||||
|
|
@ -68,12 +136,12 @@
|
||||||
Heater
|
Heater
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef HEATER_PWM
|
// #ifdef HEATER_PWM
|
||||||
#define enable_heater() do { TCCR2A |= MASK(COM2A1); } while (0)
|
// #define enable_heater() do { TCCR2A |= MASK(COM2A1); } while (0)
|
||||||
#define disable_heater() do { TCCR2A &= ~MASK(COM2A1); } while (0)
|
// #define disable_heater() do { TCCR2A &= ~MASK(COM2A1); } while (0)
|
||||||
#else
|
// #else
|
||||||
#define enable_heater() WRITE(HEATER_PIN, 1)
|
// #define enable_heater() WRITE(HEATER_PIN, 1)
|
||||||
#define disable_heater() WRITE(HEATER_PIN, 0)
|
// #define disable_heater() WRITE(HEATER_PIN, 0)
|
||||||
#endif
|
// #endif
|
||||||
|
|
||||||
#endif /* _CONFIG_H */
|
#endif /* _CONFIG_H */
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
../debug.h
|
||||||
|
|
@ -7,33 +7,11 @@
|
||||||
#include "analog.h"
|
#include "analog.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "watchdog.h"
|
#include "watchdog.h"
|
||||||
|
#include "heater.h"
|
||||||
|
#include "temp.h"
|
||||||
|
|
||||||
static uint8_t motor_pwm;
|
static uint8_t motor_pwm;
|
||||||
|
|
||||||
#define NUMTEMPS 20
|
|
||||||
short temptable[NUMTEMPS][2] = {
|
|
||||||
{1, 841},
|
|
||||||
{54, 255},
|
|
||||||
{107, 209},
|
|
||||||
{160, 184},
|
|
||||||
{213, 166},
|
|
||||||
{266, 153},
|
|
||||||
{319, 142},
|
|
||||||
{372, 132},
|
|
||||||
{425, 124},
|
|
||||||
{478, 116},
|
|
||||||
{531, 108},
|
|
||||||
{584, 101},
|
|
||||||
{637, 93},
|
|
||||||
{690, 86},
|
|
||||||
{743, 78},
|
|
||||||
{796, 70},
|
|
||||||
{849, 61},
|
|
||||||
{902, 50},
|
|
||||||
{955, 34},
|
|
||||||
{1008, 3}
|
|
||||||
};
|
|
||||||
|
|
||||||
void io_init(void) {
|
void io_init(void) {
|
||||||
// setup I/O pins
|
// setup I/O pins
|
||||||
WRITE(DEBUG_LED, 0); SET_OUTPUT(DEBUG_LED);
|
WRITE(DEBUG_LED, 0); SET_OUTPUT(DEBUG_LED);
|
||||||
|
|
@ -60,14 +38,14 @@ void io_init(void) {
|
||||||
WRITE(BED_PIN, 0); SET_OUTPUT(BED_PIN);
|
WRITE(BED_PIN, 0); SET_OUTPUT(BED_PIN);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(HEATER_PWM) || defined(FAN_PWM) || defined(BED_PWM)
|
// #if defined(HEATER_PWM) || defined(FAN_PWM) || defined(BED_PWM)
|
||||||
// setup PWM timer: fast PWM, no prescaler
|
// setup PWM timer: fast PWM, no prescaler
|
||||||
TCCR2A = MASK(WGM21) | MASK(WGM20);
|
TCCR2A = MASK(WGM21) | MASK(WGM20);
|
||||||
TCCR2B = MASK(CS22);
|
TCCR2B = MASK(CS22);
|
||||||
TIMSK2 = 0;
|
TIMSK2 = 0;
|
||||||
OCR2A = 0;
|
OCR2A = 0;
|
||||||
OCR2B = 0;
|
OCR2B = 0;
|
||||||
#endif
|
// #endif
|
||||||
|
|
||||||
#if defined(H1E_PWM) && defined(H2E_PWM)
|
#if defined(H1E_PWM) && defined(H2E_PWM)
|
||||||
TCCR0A = MASK(WGM01) | MASK(WGM00);
|
TCCR0A = MASK(WGM01) | MASK(WGM00);
|
||||||
|
|
@ -174,6 +152,12 @@ void init(void) {
|
||||||
// set up inputs and outputs
|
// set up inputs and outputs
|
||||||
io_init();
|
io_init();
|
||||||
|
|
||||||
|
// temp sensor
|
||||||
|
temp_init();
|
||||||
|
|
||||||
|
// heater
|
||||||
|
heater_init();
|
||||||
|
|
||||||
// set up extruder motor driver
|
// set up extruder motor driver
|
||||||
motor_init();
|
motor_init();
|
||||||
|
|
||||||
|
|
@ -187,9 +171,6 @@ void init(void) {
|
||||||
|
|
||||||
int main (void)
|
int main (void)
|
||||||
{
|
{
|
||||||
static uint8_t i;
|
|
||||||
static uint16_t raw_temp;
|
|
||||||
|
|
||||||
init();
|
init();
|
||||||
|
|
||||||
enable_heater();
|
enable_heater();
|
||||||
|
|
@ -204,26 +185,9 @@ int main (void)
|
||||||
//Read motor PWM
|
//Read motor PWM
|
||||||
motor_pwm = analog_read(TRIM_POT_CHANNEL) >> 2;
|
motor_pwm = analog_read(TRIM_POT_CHANNEL) >> 2;
|
||||||
|
|
||||||
//Read current temperature
|
temp_sensor_tick();
|
||||||
raw_temp = analog_read(TEMP_PIN_CHANNEL);
|
|
||||||
|
|
||||||
//Calculate real temperature based on lookup table
|
update_send_cmd(temp_get(0) >> 2);
|
||||||
for (i = 1; i < NUMTEMPS; i++) {
|
temp_set(0, get_read_cmd());
|
||||||
if (temptable[i][0] > raw_temp) {
|
|
||||||
raw_temp = temptable[i][1] +
|
|
||||||
(temptable[i][0] - raw_temp) * (temptable[i-1][1] - temptable[i][1]) / (temptable[i][0] - temptable[i-1][0]);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Clamp for overflows
|
|
||||||
if (i == NUMTEMPS) raw_temp = temptable[NUMTEMPS-1][1];
|
|
||||||
if (raw_temp > 255) raw_temp = 255;
|
|
||||||
|
|
||||||
//Update the intercom values
|
|
||||||
update_send_cmd(raw_temp);
|
|
||||||
|
|
||||||
HEATER_PWM = get_read_cmd();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
../heater.c
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
../heater.h
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
../temp.c
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
../temp.h
|
||||||
12
heater.c
12
heater.c
|
|
@ -4,9 +4,11 @@
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
#include "arduino.h"
|
#include "arduino.h"
|
||||||
#include "timer.h"
|
// #include "timer.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "sersendf.h"
|
#ifdef DEBUG
|
||||||
|
#include "sersendf.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define HEATER_C
|
#define HEATER_C
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
@ -124,10 +126,12 @@ void heater_tick(uint8_t h, uint16_t current_temp, uint16_t target_temp) {
|
||||||
heaters_runtime[h].pid_output = 0;
|
heaters_runtime[h].pid_output = 0;
|
||||||
else
|
else
|
||||||
heaters_runtime[h].pid_output = pid_output_intermed & 0xFF;
|
heaters_runtime[h].pid_output = pid_output_intermed & 0xFF;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
if (debug_flags & DEBUG_PID)
|
if (debug_flags & DEBUG_PID)
|
||||||
sersendf_P(PSTR("T{E:%d, P:%d * %ld = %ld / I:%d * %ld = %ld / D:%d * %ld = %ld # O: %ld = %u}\n"), t_error, heaters_runtime[h].heater_p, heaters_pid[h].p_factor, (int32_t) heaters_runtime[h].heater_p * heaters_pid[h].p_factor / PID_SCALE, heaters_runtime[h].heater_i, heaters_pid[h].i_factor, (int32_t) heaters_runtime[h].heater_i * heaters_pid[h].i_factor / PID_SCALE, heaters_runtime[h].heater_d, heaters_pid[h].d_factor, (int32_t) heaters_runtime[h].heater_d * heaters_pid[h].d_factor / PID_SCALE, pid_output_intermed, heaters_runtime[h].pid_output);
|
sersendf_P(PSTR("T{E:%d, P:%d * %ld = %ld / I:%d * %ld = %ld / D:%d * %ld = %ld # O: %ld = %u}\n"), t_error, heaters_runtime[h].heater_p, heaters_pid[h].p_factor, (int32_t) heaters_runtime[h].heater_p * heaters_pid[h].p_factor / PID_SCALE, heaters_runtime[h].heater_i, heaters_pid[h].i_factor, (int32_t) heaters_runtime[h].heater_i * heaters_pid[h].i_factor / PID_SCALE, heaters_runtime[h].heater_d, heaters_pid[h].d_factor, (int32_t) heaters_runtime[h].heater_d * heaters_pid[h].d_factor / PID_SCALE, pid_output_intermed, heaters_runtime[h].pid_output);
|
||||||
|
#endif
|
||||||
|
|
||||||
heater_set(h, heaters_runtime[h].pid_output);
|
heater_set(h, heaters_runtime[h].pid_output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
22
mendel.c
22
mendel.c
|
|
@ -35,15 +35,33 @@ void io_init(void) {
|
||||||
WRITE(X_STEP_PIN, 0); SET_OUTPUT(X_STEP_PIN);
|
WRITE(X_STEP_PIN, 0); SET_OUTPUT(X_STEP_PIN);
|
||||||
WRITE(X_DIR_PIN, 0); SET_OUTPUT(X_DIR_PIN);
|
WRITE(X_DIR_PIN, 0); SET_OUTPUT(X_DIR_PIN);
|
||||||
WRITE(X_MIN_PIN, 1); SET_INPUT(X_MIN_PIN);
|
WRITE(X_MIN_PIN, 1); SET_INPUT(X_MIN_PIN);
|
||||||
|
#ifdef X_MAX_PIN
|
||||||
|
WRITE(X_MAX_PIN, 1); SET_INPUT(X_MAX_PIN);
|
||||||
|
#endif
|
||||||
|
#ifdef X_ENABLE_PIN
|
||||||
|
WRITE(X_ENABLE_PIN, 1); SET_OUTPUT(X_ENABLE_PIN);
|
||||||
|
#endif
|
||||||
|
|
||||||
WRITE(Y_STEP_PIN, 0); SET_OUTPUT(Y_STEP_PIN);
|
WRITE(Y_STEP_PIN, 0); SET_OUTPUT(Y_STEP_PIN);
|
||||||
WRITE(Y_DIR_PIN, 0); SET_OUTPUT(Y_DIR_PIN);
|
WRITE(Y_DIR_PIN, 0); SET_OUTPUT(Y_DIR_PIN);
|
||||||
WRITE(Y_MIN_PIN, 1); SET_INPUT(Y_MIN_PIN);
|
WRITE(Y_MIN_PIN, 1); SET_INPUT(Y_MIN_PIN);
|
||||||
|
#ifdef Y_MAX_PIN
|
||||||
|
WRITE(Y_MAX_PIN, 1); SET_INPUT(Y_MAX_PIN);
|
||||||
|
#endif
|
||||||
|
#ifdef Y_ENABLE_PIN
|
||||||
|
WRITE(Y_ENABLE_PIN, 1); SET_OUTPUT(Y_ENABLE_PIN);
|
||||||
|
#endif
|
||||||
|
|
||||||
WRITE(Z_STEP_PIN, 0); SET_OUTPUT(Z_STEP_PIN);
|
WRITE(Z_STEP_PIN, 0); SET_OUTPUT(Z_STEP_PIN);
|
||||||
WRITE(Z_DIR_PIN, 0); SET_OUTPUT(Z_DIR_PIN);
|
WRITE(Z_DIR_PIN, 0); SET_OUTPUT(Z_DIR_PIN);
|
||||||
WRITE(Z_MIN_PIN, 1); SET_INPUT(Z_MIN_PIN);
|
WRITE(Z_MIN_PIN, 1); SET_INPUT(Z_MIN_PIN);
|
||||||
|
#ifdef Z_MAX_PIN
|
||||||
|
WRITE(Z_MAX_PIN, 1); SET_INPUT(Z_MAX_PIN);
|
||||||
|
#endif
|
||||||
|
#ifdef Z_ENABLE_PIN
|
||||||
|
WRITE(Z_ENABLE_PIN, 1); SET_OUTPUT(Z_ENABLE_PIN);
|
||||||
|
#endif
|
||||||
|
|
||||||
WRITE(E_STEP_PIN, 0); SET_OUTPUT(E_STEP_PIN);
|
WRITE(E_STEP_PIN, 0); SET_OUTPUT(E_STEP_PIN);
|
||||||
WRITE(E_DIR_PIN, 0); SET_OUTPUT(E_DIR_PIN);
|
WRITE(E_DIR_PIN, 0); SET_OUTPUT(E_DIR_PIN);
|
||||||
|
|
||||||
|
|
|
||||||
14
temp.c
14
temp.c
|
|
@ -5,9 +5,11 @@
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
#include "arduino.h"
|
#include "arduino.h"
|
||||||
#include "timer.h"
|
// #include "timer.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "sersendf.h"
|
#ifndef EXTRUDER
|
||||||
|
#include "sersendf.h"
|
||||||
|
#endif
|
||||||
#include "heater.h"
|
#include "heater.h"
|
||||||
#ifdef GEN3
|
#ifdef GEN3
|
||||||
#include "intercom.h"
|
#include "intercom.h"
|
||||||
|
|
@ -189,7 +191,7 @@ void temp_sensor_tick() {
|
||||||
temp = temptable[NUMTEMPS-1][1] * 4;
|
temp = temptable[NUMTEMPS-1][1] * 4;
|
||||||
|
|
||||||
temp_sensors_runtime[i].next_read_time = 0;
|
temp_sensors_runtime[i].next_read_time = 0;
|
||||||
}
|
} while (0);
|
||||||
break;
|
break;
|
||||||
#endif /* TEMP_THERMISTOR */
|
#endif /* TEMP_THERMISTOR */
|
||||||
|
|
||||||
|
|
@ -253,6 +255,11 @@ void temp_set(uint8_t index, uint16_t temperature) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t temp_get(uint8_t index) {
|
||||||
|
return temp_sensors_runtime[index].last_read_temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef EXTRUDER
|
||||||
void temp_print(uint8_t index) {
|
void temp_print(uint8_t index) {
|
||||||
uint8_t c = 0;
|
uint8_t c = 0;
|
||||||
|
|
||||||
|
|
@ -260,3 +267,4 @@ void temp_print(uint8_t index) {
|
||||||
|
|
||||||
sersendf_P(PSTR("T: %u.%u\n"), temp_sensors_runtime[index].last_read_temp >> 2, c);
|
sersendf_P(PSTR("T: %u.%u\n"), temp_sensors_runtime[index].last_read_temp >> 2, c);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
|
||||||
2
temp.h
2
temp.h
|
|
@ -20,6 +20,8 @@ void temp_sensor_tick(void);
|
||||||
uint8_t temp_achieved(void);
|
uint8_t temp_achieved(void);
|
||||||
|
|
||||||
void temp_set(uint8_t index, uint16_t temperature);
|
void temp_set(uint8_t index, uint16_t temperature);
|
||||||
|
uint16_t temp_get(uint8_t index);
|
||||||
|
|
||||||
void temp_print(uint8_t index);
|
void temp_print(uint8_t index);
|
||||||
|
|
||||||
uint16_t temp_read(uint8_t index);
|
uint16_t temp_read(uint8_t index);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue