/ src / hal / components / spindle_monitor.comp
spindle_monitor.comp
 1  component spindle_monitor "spindle at-speed and underspeed detection";
 2  pin in bit spindle-is-on;
 3  pin in float spindle-command;
 4  pin in float spindle-feedback;
 5  
 6  pin out bit spindle-at-speed;
 7  pin out bit spindle-underspeed;
 8  
 9  param rw unsigned level "state machine state";
10  param rw float threshold;
11  
12  function _;
13  license "gpl v2 or higher";
14  
15  ;;
16  
17  #include <rtapi_math.h>
18  
19  FUNCTION(_) {
20  
21  switch (level){
22      case 0:  // idle
23          spindle_at_speed = 0;
24          spindle_underspeed = 0;
25          if (spindle_is_on) level = 1;
26          break;
27      case 1: // waiting for spindle-at-speed
28          if ( ! spindle_is_on ) {
29              level = 0;
30              return; }
31          if (fabs(spindle_command - spindle_feedback) < threshold) {
32              level = 2;
33              spindle_at_speed = 1;
34              return; }
35          break;
36      case 2: // monitoring speed
37          if ( ! spindle_is_on ) {
38              level = 0;
39              return; }
40          if  ((spindle_command - spindle_feedback) > threshold) {
41              spindle_underspeed = 1; }
42          break;
43      default:
44          // not sure how we got here, but fix the situation
45          level = 0;
46      }
47  }