Pārlūkot izejas kodu

temperature: Fix SOFT_PWM off by one

A 128 step PWM has 127 intervals (0/127 ... 127/127 duty). Currently, a
PWM setting of 1/127 is active for 2/128, i.e. double the expected time,
or, in general n+1/128 instead of n/127.
Fixes issue#6003.

Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de>
Stefan Brüns 7 gadus atpakaļ
vecāks
revīzija
2aed66a955
1 mainītis faili ar 18 papildinājumiem un 17 dzēšanām
  1. 18
    17
      Marlin/temperature.cpp

+ 18
- 17
Marlin/temperature.cpp Parādīt failu

@@ -1547,7 +1547,8 @@ void Temperature::isr() {
1547 1547
     /**
1548 1548
      * Standard PWM modulation
1549 1549
      */
1550
-    if (pwm_count == 0) {
1550
+    if (pwm_count >= 127) {
1551
+      pwm_count = 0;
1551 1552
       soft_pwm_0 = soft_pwm[0];
1552 1553
       WRITE_HEATER_0(soft_pwm_0 > 0 ? HIGH : LOW);
1553 1554
       #if HOTENDS > 1
@@ -1584,30 +1585,30 @@ void Temperature::isr() {
1584 1585
       #endif
1585 1586
     }
1586 1587
 
1587
-    if (soft_pwm_0 < pwm_count) WRITE_HEATER_0(0);
1588
+    if (soft_pwm_0 <= pwm_count) WRITE_HEATER_0(0);
1588 1589
     #if HOTENDS > 1
1589
-      if (soft_pwm_1 < pwm_count) WRITE_HEATER_1(0);
1590
+      if (soft_pwm_1 <= pwm_count) WRITE_HEATER_1(0);
1590 1591
       #if HOTENDS > 2
1591
-        if (soft_pwm_2 < pwm_count) WRITE_HEATER_2(0);
1592
+        if (soft_pwm_2 <= pwm_count) WRITE_HEATER_2(0);
1592 1593
         #if HOTENDS > 3
1593
-          if (soft_pwm_3 < pwm_count) WRITE_HEATER_3(0);
1594
+          if (soft_pwm_3 <= pwm_count) WRITE_HEATER_3(0);
1594 1595
         #endif
1595 1596
       #endif
1596 1597
     #endif
1597 1598
 
1598 1599
     #if HAS_HEATER_BED
1599
-      if (soft_pwm_BED < pwm_count) WRITE_HEATER_BED(0);
1600
+      if (soft_pwm_BED <= pwm_count) WRITE_HEATER_BED(0);
1600 1601
     #endif
1601 1602
 
1602 1603
     #if ENABLED(FAN_SOFT_PWM)
1603 1604
       #if HAS_FAN0
1604
-        if (soft_pwm_fan[0] < pwm_count) WRITE_FAN(0);
1605
+        if (soft_pwm_fan[0] <= pwm_count) WRITE_FAN(0);
1605 1606
       #endif
1606 1607
       #if HAS_FAN1
1607
-        if (soft_pwm_fan[1] < pwm_count) WRITE_FAN1(0);
1608
+        if (soft_pwm_fan[1] <= pwm_count) WRITE_FAN1(0);
1608 1609
       #endif
1609 1610
       #if HAS_FAN2
1610
-        if (soft_pwm_fan[2] < pwm_count) WRITE_FAN2(0);
1611
+        if (soft_pwm_fan[2] <= pwm_count) WRITE_FAN2(0);
1611 1612
       #endif
1612 1613
     #endif
1613 1614
 
@@ -1620,7 +1621,6 @@ void Temperature::isr() {
1620 1621
     // 4:                /  8 = 122.0703 Hz
1621 1622
     // 5:                /  4 = 244.1406 Hz
1622 1623
     pwm_count += _BV(SOFT_PWM_SCALE);
1623
-    pwm_count &= 0x7F;
1624 1624
 
1625 1625
   #else // SLOW_PWM_HEATERS
1626 1626
 
@@ -1694,7 +1694,8 @@ void Temperature::isr() {
1694 1694
     #endif
1695 1695
 
1696 1696
     #if ENABLED(FAN_SOFT_PWM)
1697
-      if (pwm_count == 0) {
1697
+      if (pwm_count >= 127) {
1698
+        pwm_count = 0;
1698 1699
         #if HAS_FAN0
1699 1700
           soft_pwm_fan[0] = fanSpeedSoftPwm[0] >> 1;
1700 1701
           WRITE_FAN(soft_pwm_fan[0] > 0 ? HIGH : LOW);
@@ -1709,13 +1710,13 @@ void Temperature::isr() {
1709 1710
         #endif
1710 1711
       }
1711 1712
       #if HAS_FAN0
1712
-        if (soft_pwm_fan[0] < pwm_count) WRITE_FAN(0);
1713
+        if (soft_pwm_fan[0] <= pwm_count) WRITE_FAN(0);
1713 1714
       #endif
1714 1715
       #if HAS_FAN1
1715
-        if (soft_pwm_fan[1] < pwm_count) WRITE_FAN1(0);
1716
+        if (soft_pwm_fan[1] <= pwm_count) WRITE_FAN1(0);
1716 1717
       #endif
1717 1718
       #if HAS_FAN2
1718
-        if (soft_pwm_fan[2] < pwm_count) WRITE_FAN2(0);
1719
+        if (soft_pwm_fan[2] <= pwm_count) WRITE_FAN2(0);
1719 1720
       #endif
1720 1721
     #endif //FAN_SOFT_PWM
1721 1722
 
@@ -1728,10 +1729,10 @@ void Temperature::isr() {
1728 1729
     // 4:                /  8 = 122.0703 Hz
1729 1730
     // 5:                /  4 = 244.1406 Hz
1730 1731
     pwm_count += _BV(SOFT_PWM_SCALE);
1731
-    pwm_count &= 0x7F;
1732 1732
 
1733
-    // increment slow_pwm_count only every 64 pwm_count (e.g., every 8s)
1734
-    if ((pwm_count % 64) == 0) {
1733
+    // increment slow_pwm_count only every 64th pwm_count,
1734
+    // i.e. yielding a PWM frequency of 16/128 Hz (8s).
1735
+    if (((pwm_count >> SOFT_PWM_SCALE) % 64) == 0) {
1735 1736
       slow_pwm_count++;
1736 1737
       slow_pwm_count &= 0x7f;
1737 1738
 

Notiek ielāde…
Atcelt
Saglabāt