From 58683da2fb971570cc56224c6277a99d5cacff82 Mon Sep 17 00:00:00 2001
From: Robert Pelnar <robert.pelnar@seznam.cz>
Date: Mon, 6 May 2019 18:07:42 +0200
Subject: [PATCH 1/2] Variable bed PWM resolution/frequency (adjusted to
 5bits/32Hz)

---
 Firmware/Configuration.h | 3 +++
 Firmware/temperature.cpp | 9 ++++++---
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h
index acdd2d6f..faf71f2d 100644
--- a/Firmware/Configuration.h
+++ b/Firmware/Configuration.h
@@ -480,6 +480,9 @@ your extruder heater takes 2 minutes to hit the target on heating.
 #define FAN_SOFT_PWM
 #define FAN_SOFT_PWM_BITS 4 //PWM bit resolution = 4bits, freq = 62.5Hz
 
+// Bed soft pwm
+#define HEATER_BED_SOFT_PWM_BITS 5 //PWM bit resolution = 5bits, freq = 32Hz
+
 // Incrementing this by 1 will double the software PWM frequency,
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
 // However, control resolution will be halved for each increment;
diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp
index 45256bf4..ca885f44 100644
--- a/Firmware/temperature.cpp
+++ b/Firmware/temperature.cpp
@@ -1693,13 +1693,16 @@ ISR(TIMER0_COMPB_vect)
     soft_pwm_2 = soft_pwm[2];
     if(soft_pwm_2 > 0) WRITE(HEATER_2_PIN,1); else WRITE(HEATER_2_PIN,0);
 #endif
+  }
 #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
-    soft_pwm_b = soft_pwm_bed;
+  if ((pwm_count & ((1 << HEATER_BED_SOFT_PWM_BITS) - 1)) == 0)
+  {
+    soft_pwm_b = soft_pwm_bed / (1 << (8 - HEATER_BED_SOFT_PWM_BITS));
 #ifndef SYSTEM_TIMER_2
 	if(soft_pwm_b > 0) WRITE(HEATER_BED_PIN,1); else WRITE(HEATER_BED_PIN,0);
 #endif //SYSTEM_TIMER_2
-#endif
   }
+#endif
 #ifdef FAN_SOFT_PWM
   if ((pwm_count & ((1 << FAN_SOFT_PWM_BITS) - 1)) == 0)
   {
@@ -1722,7 +1725,7 @@ ISR(TIMER0_COMPB_vect)
   if(soft_pwm_2 < pwm_count) WRITE(HEATER_2_PIN,0);
 #endif
 #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
-  if(soft_pwm_b < pwm_count) WRITE(HEATER_BED_PIN,0);
+  if (soft_pwm_b < (pwm_count & ((1 << HEATER_BED_SOFT_PWM_BITS) - 1))) WRITE(HEATER_BED_PIN,0);
 #endif
 #ifdef FAN_SOFT_PWM
   if (soft_pwm_fan < (pwm_count & ((1 << FAN_SOFT_PWM_BITS) - 1))) WRITE(FAN_PIN,0);

From 85806a0f38d266932ff885b96e55f8636f4190f4 Mon Sep 17 00:00:00 2001
From: Robert Pelnar <robert.pelnar@seznam.cz>
Date: Tue, 7 May 2019 15:35:34 +0200
Subject: [PATCH 2/2] variable bed pwm frequency fix (input value is 7bit, not
 8bit)

---
 Firmware/Configuration.h | 2 +-
 Firmware/temperature.cpp | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h
index faf71f2d..3cc7994a 100644
--- a/Firmware/Configuration.h
+++ b/Firmware/Configuration.h
@@ -481,7 +481,7 @@ your extruder heater takes 2 minutes to hit the target on heating.
 #define FAN_SOFT_PWM_BITS 4 //PWM bit resolution = 4bits, freq = 62.5Hz
 
 // Bed soft pwm
-#define HEATER_BED_SOFT_PWM_BITS 5 //PWM bit resolution = 5bits, freq = 32Hz
+#define HEATER_BED_SOFT_PWM_BITS 5 //PWM bit resolution = 5bits, freq = 31.25Hz
 
 // Incrementing this by 1 will double the software PWM frequency,
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp
index ca885f44..ef15c66b 100644
--- a/Firmware/temperature.cpp
+++ b/Firmware/temperature.cpp
@@ -1697,7 +1697,7 @@ ISR(TIMER0_COMPB_vect)
 #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
   if ((pwm_count & ((1 << HEATER_BED_SOFT_PWM_BITS) - 1)) == 0)
   {
-    soft_pwm_b = soft_pwm_bed / (1 << (8 - HEATER_BED_SOFT_PWM_BITS));
+    soft_pwm_b = soft_pwm_bed >> (7 - HEATER_BED_SOFT_PWM_BITS);
 #ifndef SYSTEM_TIMER_2
 	if(soft_pwm_b > 0) WRITE(HEATER_BED_PIN,1); else WRITE(HEATER_BED_PIN,0);
 #endif //SYSTEM_TIMER_2