Browse Source

Defer updated ADC

Scott Lahteine 4 years ago
parent
commit
4360142bd1
1 changed files with 89 additions and 143 deletions
  1. 89
    143
      Marlin/src/module/temperature.cpp

+ 89
- 143
Marlin/src/module/temperature.cpp View File

@@ -2798,133 +2798,23 @@ void Temperature::tick() {
2798 2798
   if ((do_buttons ^= true)) ui.update_buttons();
2799 2799
 
2800 2800
   /**
2801
-   * On each call to the ISR one sensor is Sampled and
2802
-   * the next sensor is Prepared.
2801
+   * One sensor is sampled on every other call of the ISR.
2802
+   * Each sensor is read 16 (OVERSAMPLENR) times, taking the average.
2803 2803
    *
2804
-   * Sensors are read 16 (OVERSAMPLENR) times and the
2805
-   * final reading takes the average.
2804
+   * On each Prepare pass, ADC is started for a sensor pin.
2805
+   * On the next pass, the ADC value is read and accumulated.
2806 2806
    *
2807
-   * Extra do-nothing passes may exist when there are
2808
-   * only a few sensors. This is set by MIN_ADC_ISR_LOOPS.
2809
-   *
2810
-   * The timing of this ISR gives ADCs 0.9765ms to charge up.
2807
+   * This gives each ADC 0.9765ms to charge up.
2811 2808
    */
2812
-  #define ACCUMULATE_ADC(obj) do{           \
2813
-    if (HAL_ADC_READY())                    \
2814
-      obj.sample(HAL_READ_ADC());           \
2815
-    else                                    \
2816
-      next_sensor_state = adc_sensor_state; \
2809
+  #define ACCUMULATE_ADC(obj) do{ \
2810
+    if (!HAL_ADC_READY()) next_sensor_state = adc_sensor_state; \
2811
+    else obj.sample(HAL_READ_ADC()); \
2817 2812
   }while(0)
2818 2813
 
2819
-  #define NEXT_ENUM(A) (typeof(A))(int(A) + 1)
2820
-  #define NEXT_ADC_STATE(N) ((N) >= SensorsReady ? StartSampling : NEXT_ENUM(N))
2821
-
2822
-  // Assume the machine will go on to the next state
2823
-  ADCSensorState next_sensor_state = NEXT_ADC_STATE(adc_sensor_state);
2824
-
2825
-  switch (adc_sensor_state) {
2826
-
2827
-    default: break;
2828
-
2829
-    #if HAS_TEMP_ADC_0
2830
-      case MeasureTemp_0:       ACCUMULATE_ADC(temp_hotend[0]); break;
2831
-    #endif
2832
-    #if HAS_HEATED_BED
2833
-      case MeasureTemp_BED:     ACCUMULATE_ADC(temp_bed); break;
2834
-    #endif
2835
-    #if HAS_TEMP_CHAMBER
2836
-      case MeasureTemp_CHAMBER: ACCUMULATE_ADC(temp_chamber); break;
2837
-    #endif
2838
-    #if HAS_TEMP_PROBE
2839
-      case MeasureTemp_PROBE:   ACCUMULATE_ADC(temp_probe); break;
2840
-    #endif
2841
-    #if HAS_TEMP_ADC_1
2842
-      case MeasureTemp_1:       ACCUMULATE_ADC(temp_hotend[1]); break;
2843
-    #endif
2844
-    #if HAS_TEMP_ADC_2
2845
-      case MeasureTemp_2:       ACCUMULATE_ADC(temp_hotend[2]); break;
2846
-    #endif
2847
-    #if HAS_TEMP_ADC_3
2848
-      case MeasureTemp_3:       ACCUMULATE_ADC(temp_hotend[3]); break;
2849
-    #endif
2850
-    #if HAS_TEMP_ADC_4
2851
-      case MeasureTemp_4:       ACCUMULATE_ADC(temp_hotend[4]); break;
2852
-    #endif
2853
-    #if HAS_TEMP_ADC_5
2854
-      case MeasureTemp_5:       ACCUMULATE_ADC(temp_hotend[5]); break;
2855
-    #endif
2856
-    #if HAS_TEMP_ADC_6
2857
-      case MeasureTemp_6:       ACCUMULATE_ADC(temp_hotend[6]); break;
2858
-    #endif
2859
-    #if HAS_TEMP_ADC_7
2860
-      case MeasureTemp_7:       ACCUMULATE_ADC(temp_hotend[7]); break;
2861
-    #endif
2862
-
2863
-    #if ENABLED(FILAMENT_WIDTH_SENSOR)
2864
-      case Measure_FILWIDTH:
2865
-        if (HAL_ADC_READY())
2866
-          filwidth.accumulate(HAL_READ_ADC());
2867
-        else
2868
-          next_sensor_state = adc_sensor_state; // redo this state
2869
-      break;
2870
-    #endif
2871
-
2872
-    #if HAS_JOY_ADC_X
2873
-      case MeasureJoy_X:        ACCUMULATE_ADC(joystick.x); break;
2874
-    #endif
2875
-    #if HAS_JOY_ADC_Y
2876
-      case MeasureJoy_Y:        ACCUMULATE_ADC(joystick.y); break;
2877
-    #endif
2878
-    #if HAS_JOY_ADC_Z
2879
-      case MeasureJoy_Z:        ACCUMULATE_ADC(joystick.z); break;
2880
-    #endif
2881
-
2882
-    #if HAS_ADC_BUTTONS
2883
-      #ifndef ADC_BUTTON_DEBOUNCE_DELAY
2884
-        #define ADC_BUTTON_DEBOUNCE_DELAY 16
2885
-      #endif
2886
-      case Measure_ADC_KEY: {
2887
-        if (HAL_ADC_READY()) {
2888
-          if (ADCKey_count < ADC_BUTTON_DEBOUNCE_DELAY) {
2889
-            raw_ADCKey_value = HAL_READ_ADC();
2890
-            if (raw_ADCKey_value <= (HAL_ADC_RANGE) * 900UL / 1024UL) {
2891
-              NOMORE(current_ADCKey_raw, raw_ADCKey_value);
2892
-              ADCKey_count++;
2893
-            }
2894
-            else { // ADC Key release
2895
-              if (ADCKey_count > 0) {
2896
-                if (ADCKey_pressed) {
2897
-                  ADCKey_count = 0;
2898
-                  current_ADCKey_raw = HAL_ADC_RANGE;
2899
-                }
2900
-                else
2901
-                  ADCKey_count++;
2902
-              }
2903
-              else
2904
-                ADCKey_pressed = false;
2905
-            }
2906
-            if (ADCKey_count == ADC_BUTTON_DEBOUNCE_DELAY) ADCKey_pressed = true;
2907
-          }
2908
-        }
2909
-        else
2910
-          next_sensor_state = adc_sensor_state; // redo this state
2911
-
2912
-      } break;
2913
-
2914
-    #endif // HAS_ADC_BUTTONS
2915
-
2916
-  } // switch(adc_sensor_state)
2917
-
2918
-  // Go to the next state (may be unchanged)
2919
-  adc_sensor_state = next_sensor_state;
2920
-
2921
-  // Assume that the state advances
2922
-  next_sensor_state = NEXT_ADC_STATE(adc_sensor_state);
2814
+  ADCSensorState next_sensor_state = adc_sensor_state < SensorsReady ? (ADCSensorState)(int(adc_sensor_state) + 1) : StartSampling;
2923 2815
 
2924 2816
   switch (adc_sensor_state) {
2925 2817
 
2926
-    default: break;
2927
-
2928 2818
     case SensorsReady: {
2929 2819
       // All sensors have been read. Stay in this state for a few
2930 2820
       // ISRs to save on calls to temp update/checking code below.
@@ -2934,72 +2824,128 @@ void Temperature::tick() {
2934 2824
         if (delay_count == 0) delay_count = extra_loops;  // Init this delay
2935 2825
         if (--delay_count)                                // While delaying...
2936 2826
           next_sensor_state = SensorsReady;               // retain this state (else, next state will be 0)
2937
-        break;                                            // No fallthru
2827
+        break;
2938 2828
       }
2939 2829
       else {
2940
-        adc_sensor_state = StartSampling;                 // Fall through to count up oversamples
2941
-        next_sensor_state = NEXT_ENUM(StartSampling);     // and possibly send the final readings.
2830
+        adc_sensor_state = StartSampling;                 // Fall-through to start sampling
2831
+        next_sensor_state = (ADCSensorState)(int(StartSampling) + 1);
2942 2832
       }
2943 2833
     }
2944
-    // fallthru
2945 2834
 
2946 2835
     case StartSampling:                                   // Start of sampling loops. Do updates/checks.
2947
-      if (++temp_count >= OVERSAMPLENR) {                 // 10 * 16 * 1 / (16000000 / 64 / 256) = 164ms.
2836
+      if (++temp_count >= OVERSAMPLENR) {                 // 10 * 16 * 1/(16000000/64/256)  = 164ms.
2948 2837
         temp_count = 0;
2949 2838
         readings_ready();
2950 2839
       }
2951
-      adc_sensor_state = NEXT_ENUM(StartSampling);        // Do one Prepare phase before exiting
2952
-      next_sensor_state = NEXT_ENUM(adc_sensor_state);    // Also update the next state
2953
-      // fallthru
2840
+      break;
2954 2841
 
2955 2842
     #if HAS_TEMP_ADC_0
2956
-      case PrepareTemp_0:       HAL_START_ADC(TEMP_0_PIN); break;
2843
+      case PrepareTemp_0: HAL_START_ADC(TEMP_0_PIN); break;
2844
+      case MeasureTemp_0: ACCUMULATE_ADC(temp_hotend[0]); break;
2957 2845
     #endif
2846
+
2958 2847
     #if HAS_HEATED_BED
2959
-      case PrepareTemp_BED:     HAL_START_ADC(TEMP_BED_PIN); break;
2848
+      case PrepareTemp_BED: HAL_START_ADC(TEMP_BED_PIN); break;
2849
+      case MeasureTemp_BED: ACCUMULATE_ADC(temp_bed); break;
2960 2850
     #endif
2851
+
2961 2852
     #if HAS_TEMP_CHAMBER
2962 2853
       case PrepareTemp_CHAMBER: HAL_START_ADC(TEMP_CHAMBER_PIN); break;
2854
+      case MeasureTemp_CHAMBER: ACCUMULATE_ADC(temp_chamber); break;
2963 2855
     #endif
2856
+
2964 2857
     #if HAS_TEMP_PROBE
2965
-      case PrepareTemp_PROBE:   HAL_START_ADC(TEMP_PROBE_PIN); break;
2858
+      case PrepareTemp_PROBE: HAL_START_ADC(TEMP_PROBE_PIN); break;
2859
+      case MeasureTemp_PROBE: ACCUMULATE_ADC(temp_probe); break;
2966 2860
     #endif
2861
+
2967 2862
     #if HAS_TEMP_ADC_1
2968
-      case PrepareTemp_1:       HAL_START_ADC(TEMP_1_PIN); break;
2863
+      case PrepareTemp_1: HAL_START_ADC(TEMP_1_PIN); break;
2864
+      case MeasureTemp_1: ACCUMULATE_ADC(temp_hotend[1]); break;
2969 2865
     #endif
2866
+
2970 2867
     #if HAS_TEMP_ADC_2
2971
-      case PrepareTemp_2:       HAL_START_ADC(TEMP_2_PIN); break;
2868
+      case PrepareTemp_2: HAL_START_ADC(TEMP_2_PIN); break;
2869
+      case MeasureTemp_2: ACCUMULATE_ADC(temp_hotend[2]); break;
2972 2870
     #endif
2871
+
2973 2872
     #if HAS_TEMP_ADC_3
2974
-      case PrepareTemp_3:       HAL_START_ADC(TEMP_3_PIN); break;
2873
+      case PrepareTemp_3: HAL_START_ADC(TEMP_3_PIN); break;
2874
+      case MeasureTemp_3: ACCUMULATE_ADC(temp_hotend[3]); break;
2975 2875
     #endif
2876
+
2976 2877
     #if HAS_TEMP_ADC_4
2977
-      case PrepareTemp_4:       HAL_START_ADC(TEMP_4_PIN); break;
2878
+      case PrepareTemp_4: HAL_START_ADC(TEMP_4_PIN); break;
2879
+      case MeasureTemp_4: ACCUMULATE_ADC(temp_hotend[4]); break;
2978 2880
     #endif
2881
+
2979 2882
     #if HAS_TEMP_ADC_5
2980
-      case PrepareTemp_5:       HAL_START_ADC(TEMP_5_PIN); break;
2883
+      case PrepareTemp_5: HAL_START_ADC(TEMP_5_PIN); break;
2884
+      case MeasureTemp_5: ACCUMULATE_ADC(temp_hotend[5]); break;
2981 2885
     #endif
2886
+
2982 2887
     #if HAS_TEMP_ADC_6
2983
-      case PrepareTemp_6:       HAL_START_ADC(TEMP_6_PIN); break;
2888
+      case PrepareTemp_6: HAL_START_ADC(TEMP_6_PIN); break;
2889
+      case MeasureTemp_6: ACCUMULATE_ADC(temp_hotend[6]); break;
2984 2890
     #endif
2891
+
2985 2892
     #if HAS_TEMP_ADC_7
2986
-      case PrepareTemp_7:       HAL_START_ADC(TEMP_7_PIN); break;
2893
+      case PrepareTemp_7: HAL_START_ADC(TEMP_7_PIN); break;
2894
+      case MeasureTemp_7: ACCUMULATE_ADC(temp_hotend[7]); break;
2987 2895
     #endif
2896
+
2988 2897
     #if ENABLED(FILAMENT_WIDTH_SENSOR)
2989
-      case Prepare_FILWIDTH:    HAL_START_ADC(FILWIDTH_PIN); break;
2898
+      case Prepare_FILWIDTH: HAL_START_ADC(FILWIDTH_PIN); break;
2899
+      case Measure_FILWIDTH:
2900
+        if (!HAL_ADC_READY())
2901
+          next_sensor_state = adc_sensor_state; // redo this state
2902
+        else
2903
+          filwidth.accumulate(HAL_READ_ADC());
2904
+      break;
2990 2905
     #endif
2906
+
2991 2907
     #if HAS_JOY_ADC_X
2992
-      case PrepareJoy_X:        HAL_START_ADC(JOY_X_PIN); break;
2908
+      case PrepareJoy_X: HAL_START_ADC(JOY_X_PIN); break;
2909
+      case MeasureJoy_X: ACCUMULATE_ADC(joystick.x); break;
2993 2910
     #endif
2911
+
2994 2912
     #if HAS_JOY_ADC_Y
2995
-      case PrepareJoy_Y:        HAL_START_ADC(JOY_Y_PIN); break;
2913
+      case PrepareJoy_Y: HAL_START_ADC(JOY_Y_PIN); break;
2914
+      case MeasureJoy_Y: ACCUMULATE_ADC(joystick.y); break;
2996 2915
     #endif
2916
+
2997 2917
     #if HAS_JOY_ADC_Z
2998
-      case PrepareJoy_Z:        HAL_START_ADC(JOY_Z_PIN); break;
2918
+      case PrepareJoy_Z: HAL_START_ADC(JOY_Z_PIN); break;
2919
+      case MeasureJoy_Z: ACCUMULATE_ADC(joystick.z); break;
2999 2920
     #endif
2921
+
3000 2922
     #if HAS_ADC_BUTTONS
3001
-      case Prepare_ADC_KEY:     HAL_START_ADC(ADC_KEYPAD_PIN); break;
3002
-    #endif
2923
+      #ifndef ADC_BUTTON_DEBOUNCE_DELAY
2924
+        #define ADC_BUTTON_DEBOUNCE_DELAY 16
2925
+      #endif
2926
+      case Prepare_ADC_KEY: HAL_START_ADC(ADC_KEYPAD_PIN); break;
2927
+      case Measure_ADC_KEY:
2928
+        if (!HAL_ADC_READY())
2929
+          next_sensor_state = adc_sensor_state; // redo this state
2930
+        else if (ADCKey_count < ADC_BUTTON_DEBOUNCE_DELAY) {
2931
+          raw_ADCKey_value = HAL_READ_ADC();
2932
+          if (raw_ADCKey_value <= 900UL * HAL_ADC_RANGE / 1024UL) {
2933
+            NOMORE(current_ADCKey_raw, raw_ADCKey_value);
2934
+            ADCKey_count++;
2935
+          }
2936
+          else { //ADC Key release
2937
+            if (ADCKey_count > 0) ADCKey_count++; else ADCKey_pressed = false;
2938
+            if (ADCKey_pressed) {
2939
+              ADCKey_count = 0;
2940
+              current_ADCKey_raw = HAL_ADC_RANGE;
2941
+            }
2942
+          }
2943
+        }
2944
+        if (ADCKey_count == ADC_BUTTON_DEBOUNCE_DELAY) ADCKey_pressed = true;
2945
+        break;
2946
+    #endif // HAS_ADC_BUTTONS
2947
+
2948
+    case StartupDelay: break;
3003 2949
 
3004 2950
   } // switch(adc_sensor_state)
3005 2951
 

Loading…
Cancel
Save