Changes to laser module PWM config.
authorBob Clough <bob@clough.me>
Sun, 19 Jul 2015 00:43:16 +0000 (01:43 +0100)
committerBob Clough <bob@clough.me>
Sun, 19 Jul 2015 00:43:16 +0000 (01:43 +0100)
This changes the config to work as described in issue #685.  It makes
the laser_module_max_power work as expected / documented, introduces
a minimum power setting, and scales the output between the two.

src/modules/tools/laser/Laser.cpp
src/modules/tools/laser/Laser.h

index 6456374..74a89ec 100644 (file)
@@ -25,7 +25,9 @@
 #define laser_module_pin_checksum           CHECKSUM("laser_module_pin")
 #define laser_module_pwm_period_checksum    CHECKSUM("laser_module_pwm_period")
 #define laser_module_max_power_checksum     CHECKSUM("laser_module_max_power")
+#define laser_module_min_power_checksum     CHECKSUM("laser_module_min_power")
 #define laser_module_tickle_power_checksum  CHECKSUM("laser_module_tickle_power")
+#define laser_module_power_checksum         CHECKSUM("laser_module_power")
 
 Laser::Laser(){
 }
@@ -59,8 +61,14 @@ void Laser::on_module_loaded() {
     this->laser_pin->period_us(THEKERNEL->config->value(laser_module_pwm_period_checksum)->by_default(20)->as_number());
     this->laser_pin->write(this->laser_inverting ? 1 : 0);
 
-    this->laser_max_power =    THEKERNEL->config->value(laser_module_max_power_checksum   )->by_default(0.8f)->as_number() ;
-    this->laser_tickle_power = THEKERNEL->config->value(laser_module_tickle_power_checksum)->by_default(0   )->as_number() ;
+    this->laser_max_power = THEKERNEL->config->value(laser_module_max_power_checksum   )->by_default(1.0f)->as_number() ;
+    this->laser_min_power = THEKERNEL->config->value(laser_module_min_power_checksum)->by_default(0   )->as_number() ;
+    this->laser_power =     THEKERNEL->config->value(laser_module_power_checksum)->by_default(0.8f)->as_number() ;
+
+    // either the minimum value wasnt set, or it is 0.  Overwrite with old tickle value config.
+    if (this->laser_min_power == 0) {
+        this->laser_min_power = THEKERNEL->config->value(laser_module_tickle_power_checksum)->by_default(0   )->as_number() ;
+    }
 
     //register for events
     this->register_for_event(ON_GCODE_EXECUTE);
@@ -98,15 +106,14 @@ void Laser::on_gcode_execute(void* argument){
     if( gcode->has_g){
         int code = gcode->g;
         if( code == 0 ){                    // G0
-            this->laser_pin->write(this->laser_inverting ? 1 - this->laser_tickle_power : this->laser_tickle_power);
+            this->laser_pin->write(this->laser_inverting ? 1 - this->laser_min_power : this->laser_min_power);
             this->laser_on =  false;
         }else if( code >= 1 && code <= 3 ){ // G1, G2, G3
             this->laser_on =  true;
         }
     }
     if ( gcode->has_letter('S' )){
-        this->laser_max_power = gcode->get_value('S');
-//         THEKERNEL->streams->printf("Adjusted laser power to %d/100\r\n",(int)(this->laser_max_power*100.0+0.5));
+        this->laser_power = gcode->get_value('S');
     }
 
 }
@@ -121,7 +128,7 @@ void Laser::on_speed_change(void* argument){
 void Laser::set_proportional_power(){
     if( this->laser_on && THEKERNEL->stepper->get_current_block() ){
         // adjust power to maximum power and actual velocity
-        float proportional_power = float(float(this->laser_max_power) * float(THEKERNEL->stepper->get_trapezoid_adjusted_rate()) / float(THEKERNEL->stepper->get_current_block()->nominal_rate));
+        float proportional_power = (((this->laser_max_power-this->laser_min_power)*(this->laser_power * THEKERNEL->stepper->get_trapezoid_adjusted_rate() / THEKERNEL->stepper->get_current_block()->nominal_rate))+this->laser_min_power);
         this->laser_pin->write(this->laser_inverting ? 1 - proportional_power : proportional_power);
     }
 }
index 60f66e9..c97013d 100644 (file)
@@ -34,7 +34,8 @@ class Laser : public Module{
             bool laser_inverting:1; // stores whether the pwm period should be inverted
         };
         float            laser_max_power; // maximum allowed laser power to be output on the pwm pin
-        float            laser_tickle_power; // value used to tickle the laser on moves
+        float            laser_min_power; // value used to tickle the laser on moves.  Also minimum value for auto-scaling
+        float            laser_power;     // current laser power
 };
 
 #endif