From 0963c889f065b60c9e42b524483dc94d260ba549 Mon Sep 17 00:00:00 2001 From: Robert Pelnar Date: Mon, 21 Jan 2019 17:57:07 +0100 Subject: [PATCH 1/3] Fast PWM for bed - timer2 used as system timer --- Firmware/temperature.cpp | 17 +++++-- Firmware/temperature.h | 4 +- Firmware/timer02.c | 103 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 117 insertions(+), 7 deletions(-) create mode 100644 Firmware/timer02.c diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index cae3fada7..973009559 100644 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -42,6 +42,12 @@ #include "ConfigurationStore.h" +extern "C" { +extern void timer02_init(void); +extern void timer02_set_pwm0(uint8_t pwm0); +} + + //=========================================================================== //=============================public variables============================ //=========================================================================== @@ -983,7 +989,6 @@ static void updateTemperaturesFromRawValues() CRITICAL_SECTION_END; } - void tp_init() { #if MB(RUMBA) && ((TEMP_SENSOR_0==-1)||(TEMP_SENSOR_1==-1)||(TEMP_SENSOR_2==-1)||(TEMP_SENSOR_BED==-1)) @@ -1050,10 +1055,12 @@ void tp_init() adc_init(); + timer02_init(); + // Use timer0 for temperature measurement // Interleave temperature interrupt with millies interrupt - OCR0B = 128; - TIMSK0 |= (1< +#include +#include + + +uint8_t timer02_pwm0 = 0; + +void timer02_set_pwm0(uint8_t pwm0) +{ + if (timer02_pwm0 == pwm0) return; + if (pwm0) + { + TCCR0A |= (2 << COM0B0); + OCR0B = pwm0 - 1; + } + else + { + TCCR0A &= ~(2 << COM0B0); + OCR0B = 0; + } +} + +void timer02_init(void) +{ + //save sreg + uint8_t _sreg = SREG; + //disable interrupts for sure + cli(); + //mask timer0 interrupts - disable all + TIMSK0 &= ~(1<> 3) +#define FRACT_MAX (1000 >> 3) + +extern volatile unsigned long timer0_overflow_count; +extern volatile unsigned long timer0_millis; +unsigned char timer0_fract = 0; + +ISR(TIMER2_OVF_vect) +{ + // copy these to local variables so they can be stored in registers + // (volatile variables must be read from memory on every access) + unsigned long m = timer0_millis; + unsigned char f = timer0_fract; + + m += MILLIS_INC; + f += FRACT_INC; + if (f >= FRACT_MAX) + { + f -= FRACT_MAX; + m += 1; + } + + timer0_fract = f; + timer0_millis = m; + timer0_overflow_count++; +} + From e612eb2a172c7911e484337c380f96702e53907c Mon Sep 17 00:00:00 2001 From: Robert Pelnar Date: Mon, 21 Jan 2019 18:14:19 +0100 Subject: [PATCH 2/3] Fast PWM for bed - set pwm value from soft_pwm_bed variable. --- Firmware/temperature.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index 973009559..b8181b206 100644 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -258,6 +258,7 @@ static void temp_runaway_stop(bool isPreheat, bool isBed); if (extruder<0) { soft_pwm_bed = (MAX_BED_POWER)/2; + timer02_set_pwm0(soft_pwm_bed << 1); bias = d = (MAX_BED_POWER)/2; } else @@ -294,7 +295,10 @@ static void temp_runaway_stop(bool isPreheat, bool isBed); if(millis() - t2 > 5000) { heating=false; if (extruder<0) + { soft_pwm_bed = (bias - d) >> 1; + timer02_set_pwm0(soft_pwm_bed << 1); + } else soft_pwm[extruder] = (bias - d) >> 1; t1=millis(); @@ -348,7 +352,10 @@ static void temp_runaway_stop(bool isPreheat, bool isBed); } } if (extruder<0) + { soft_pwm_bed = (bias + d) >> 1; + timer02_set_pwm0(soft_pwm_bed << 1); + } else soft_pwm[extruder] = (bias + d) >> 1; pid_cycle++; @@ -776,9 +783,11 @@ void manage_heater() #endif //AMBIENT_THERMISTOR { soft_pwm_bed = (int)pid_output >> 1; + timer02_set_pwm0(soft_pwm_bed << 1); } else { soft_pwm_bed = 0; + timer02_set_pwm0(soft_pwm_bed << 1); } #elif !defined(BED_LIMIT_SWITCHING) @@ -788,15 +797,18 @@ void manage_heater() if(current_temperature_bed >= target_temperature_bed) { soft_pwm_bed = 0; + timer02_set_pwm0(soft_pwm_bed << 1); } else { soft_pwm_bed = MAX_BED_POWER>>1; + timer02_set_pwm0(soft_pwm_bed << 1); } } else { soft_pwm_bed = 0; + timer02_set_pwm0(soft_pwm_bed << 1); WRITE(HEATER_BED_PIN,LOW); } #else //#ifdef BED_LIMIT_SWITCHING @@ -806,15 +818,18 @@ void manage_heater() if(current_temperature_bed > target_temperature_bed + BED_HYSTERESIS) { soft_pwm_bed = 0; + timer02_set_pwm0(soft_pwm_bed << 1); } else if(current_temperature_bed <= target_temperature_bed - BED_HYSTERESIS) { soft_pwm_bed = MAX_BED_POWER>>1; + timer02_set_pwm0(soft_pwm_bed << 1); } } else { soft_pwm_bed = 0; + timer02_set_pwm0(soft_pwm_bed << 1); WRITE(HEATER_BED_PIN,LOW); } #endif @@ -1368,6 +1383,7 @@ void disable_heater() #if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1 target_temperature_bed=0; soft_pwm_bed=0; + timer02_set_pwm0(soft_pwm_bed << 1); #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 WRITE(HEATER_BED_PIN,LOW); #endif From 50bcfae1838e94ba570440342a3637ab5e49d9b7 Mon Sep 17 00:00:00 2001 From: Robert Pelnar Date: Mon, 21 Jan 2019 18:21:17 +0100 Subject: [PATCH 3/3] Fast PWM for bed - newer set HEATER_BED_PIN to 1 --- Firmware/temperature.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index b8181b206..a50d75e42 100644 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -1621,7 +1621,7 @@ ISR(TIMER2_COMPB_vect) #endif #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 soft_pwm_b = soft_pwm_bed; - if(soft_pwm_b > 0) WRITE(HEATER_BED_PIN,1); else WRITE(HEATER_BED_PIN,0); + //if(soft_pwm_b > 0) WRITE(HEATER_BED_PIN,1); else WRITE(HEATER_BED_PIN,0); #endif #ifdef FAN_SOFT_PWM soft_pwm_fan = fanSpeedSoftPwm / 2; @@ -1755,7 +1755,7 @@ ISR(TIMER2_COMPB_vect) state_timer_heater_b = MIN_STATE_TIME; } state_heater_b = 1; - WRITE(HEATER_BED_PIN, 1); + //WRITE(HEATER_BED_PIN, 1); } } else { // turn OFF heather only if the minimum time is up