Browse Source

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 8 years ago
parent
commit
2aed66a955
1 changed files with 18 additions and 17 deletions
  1. 18
    17
      Marlin/temperature.cpp

+ 18
- 17
Marlin/temperature.cpp View File

1547
     /**
1547
     /**
1548
      * Standard PWM modulation
1548
      * Standard PWM modulation
1549
      */
1549
      */
1550
-    if (pwm_count == 0) {
1550
+    if (pwm_count >= 127) {
1551
+      pwm_count = 0;
1551
       soft_pwm_0 = soft_pwm[0];
1552
       soft_pwm_0 = soft_pwm[0];
1552
       WRITE_HEATER_0(soft_pwm_0 > 0 ? HIGH : LOW);
1553
       WRITE_HEATER_0(soft_pwm_0 > 0 ? HIGH : LOW);
1553
       #if HOTENDS > 1
1554
       #if HOTENDS > 1
1584
       #endif
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
     #if HOTENDS > 1
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
       #if HOTENDS > 2
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
         #if HOTENDS > 3
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
         #endif
1595
         #endif
1595
       #endif
1596
       #endif
1596
     #endif
1597
     #endif
1597
 
1598
 
1598
     #if HAS_HEATER_BED
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
     #endif
1601
     #endif
1601
 
1602
 
1602
     #if ENABLED(FAN_SOFT_PWM)
1603
     #if ENABLED(FAN_SOFT_PWM)
1603
       #if HAS_FAN0
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
       #endif
1606
       #endif
1606
       #if HAS_FAN1
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
       #endif
1609
       #endif
1609
       #if HAS_FAN2
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
       #endif
1612
       #endif
1612
     #endif
1613
     #endif
1613
 
1614
 
1620
     // 4:                /  8 = 122.0703 Hz
1621
     // 4:                /  8 = 122.0703 Hz
1621
     // 5:                /  4 = 244.1406 Hz
1622
     // 5:                /  4 = 244.1406 Hz
1622
     pwm_count += _BV(SOFT_PWM_SCALE);
1623
     pwm_count += _BV(SOFT_PWM_SCALE);
1623
-    pwm_count &= 0x7F;
1624
 
1624
 
1625
   #else // SLOW_PWM_HEATERS
1625
   #else // SLOW_PWM_HEATERS
1626
 
1626
 
1694
     #endif
1694
     #endif
1695
 
1695
 
1696
     #if ENABLED(FAN_SOFT_PWM)
1696
     #if ENABLED(FAN_SOFT_PWM)
1697
-      if (pwm_count == 0) {
1697
+      if (pwm_count >= 127) {
1698
+        pwm_count = 0;
1698
         #if HAS_FAN0
1699
         #if HAS_FAN0
1699
           soft_pwm_fan[0] = fanSpeedSoftPwm[0] >> 1;
1700
           soft_pwm_fan[0] = fanSpeedSoftPwm[0] >> 1;
1700
           WRITE_FAN(soft_pwm_fan[0] > 0 ? HIGH : LOW);
1701
           WRITE_FAN(soft_pwm_fan[0] > 0 ? HIGH : LOW);
1709
         #endif
1710
         #endif
1710
       }
1711
       }
1711
       #if HAS_FAN0
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
       #endif
1714
       #endif
1714
       #if HAS_FAN1
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
       #endif
1717
       #endif
1717
       #if HAS_FAN2
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
       #endif
1720
       #endif
1720
     #endif //FAN_SOFT_PWM
1721
     #endif //FAN_SOFT_PWM
1721
 
1722
 
1728
     // 4:                /  8 = 122.0703 Hz
1729
     // 4:                /  8 = 122.0703 Hz
1729
     // 5:                /  4 = 244.1406 Hz
1730
     // 5:                /  4 = 244.1406 Hz
1730
     pwm_count += _BV(SOFT_PWM_SCALE);
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
       slow_pwm_count++;
1736
       slow_pwm_count++;
1736
       slow_pwm_count &= 0x7f;
1737
       slow_pwm_count &= 0x7f;
1737
 
1738
 

Loading…
Cancel
Save