Willkommen! Anmelden Ein neues Profil erzeugen

Erweiterte Suche

Marlin 2 bugfix & Filament Durchmesser

geschrieben von DocYester 
Re: Marlin 2 bugfix & Filament Durchmesser
06. April 2020 12:05
Nicht ganz , glaube ich ...

Für das Pin-Debugging vielleicht , aber nicht für die Werte die dann dargestellt werden im Display - die Schwanken ja leider auch.
Schaue ich dann im Pin-Debugging ~20 Zeilen weiter oben, in das Auslesen bei bekannten Analogen Pin's wird auch direkt AnalogRead genutzt.
Die Werte an den anderen beiden aktiven Pins (BED_TEMP,HEATER_TEMP) bleiben aber im Debug stabil.
Wenn die Hardware eintrifft, werde ich auch mal schauen was ein Entkopplungskondensator direkt am Board für den Pin29 bringt.

[temprature.cpp]
void Temperature::tick() {

...

/**
   * One sensor is sampled on every other call of the ISR.
   * Each sensor is read 16 (OVERSAMPLENR) times, taking the average.
   *
   * On each Prepare pass, ADC is started for a sensor pin.
   * On the next pass, the ADC value is read and accumulated.
   *
   * This gives each ADC 0.9765ms to charge up.
   */
  #define ACCUMULATE_ADC(obj) do{ \
    if (!HAL_ADC_READY()) next_sensor_state = adc_sensor_state; \
    else obj.sample(HAL_READ_ADC()); \
  }while(0)

  ADCSensorState next_sensor_state = adc_sensor_state < SensorsReady ? (ADCSensorState)(int(adc_sensor_state) + 1) : StartSampling;

  switch (adc_sensor_state) {

    case SensorsReady: {
      // All sensors have been read. Stay in this state for a few
      // ISRs to save on calls to temp update/checking code below.
      constexpr int8_t extra_loops = MIN_ADC_ISR_LOOPS - (int8_t)SensorsReady;
      static uint8_t delay_count = 0;
      if (extra_loops > 0) {
        if (delay_count == 0) delay_count = extra_loops;  // Init this delay
        if (--delay_count)                                // While delaying...
          next_sensor_state = SensorsReady;               // retain this state (else, next state will be 0)
        break;
      }
      else {
        adc_sensor_state = StartSampling;                 // Fall-through to start sampling
        next_sensor_state = (ADCSensorState)(int(StartSampling) + 1);
      }
    }

    case StartSampling:                                   // Start of sampling loops. Do updates/checks.
      if (++temp_count >= OVERSAMPLENR) {                 // 10 * 16 * 1/(16000000/64/256)  = 164ms.
        temp_count = 0;
        readings_ready();
      }
      break;

......

#if ENABLED(FILAMENT_WIDTH_SENSOR)
      case Prepare_FILWIDTH: HAL_START_ADC(FILWIDTH_PIN); break;
      case Measure_FILWIDTH:
        if (!HAL_ADC_READY())
          next_sensor_state = adc_sensor_state; // redo this state
        else
          filwidth.accumulate(HAL_READ_ADC());
      break;
    #endif


......

void Temperature::readings_ready() {

  // Update the raw values if they've been read. Else we could be updating them during reading.
  if (!raw_temps_ready) update_raw_temperatures();

  // Filament Sensor - can be read any time since IIR filtering is used
  #if ENABLED(FILAMENT_WIDTH_SENSOR)
    filwidth.reading_ready();
  #endif

... oder bin ich jetzt am letzten include falsch abgebogen ? smiling bouncing smiley


Nach einigem Weiterlesen in der Materie traf ich auf :
[https://www.arduino.cc/en/Tutorial/AnalogInputPins]
The ATmega datasheet also cautions against switching analog pins in close temporal proximity to making A/D readings (analogRead) on other analog pins. 
This can cause electrical noise and introduce jitter in the analog system. 
It may be desirable, after manipulating analog pins (in digital mode), to add a short delay before using analogRead() to read other analog pins.

Glaube aber nicht das es störend ist, da durch das oversampling je ADC-Kanal zum einen genug zeitlicher Abstand vorhanden sein sollte, aber auch ein belastbarer Mittelwert.
Das wiederum lässt die Schwankungen aber in einem noch schlechteren Licht stehen ...
Re: Marlin 2 bugfix & Filament Durchmesser
06. April 2020 14:52
Noch ein Gedanke:
Ich weiß nicht, wieso Werte unter 0.5 V ausgeschlossen werden,
aber bei 3.3V wäre der entsprechende Wert 1024/6.6 = 155
// Apply a single ADC reading to the raw value
  static void accumulate(const uint16_t adc) {
    if (adc > 102)  // Ignore ADC under 0.5 volts
      accum += (uint32_t(adc) << 7) - (accum >> 7);

Herzl. Grüße
Re: Marlin 2 bugfix & Filament Durchmesser
07. April 2020 15:26
AlterBastler ...

wieder den richtigen Weg erwähnt, aber in die falsche Richtung gezeigt (bildlich)
Der Glättungskondensator war unterdimensioniert, nicht überdimensioniert.
Ich habe den 10nF erst mit einem 0.1uF ersetzt (weil vergriffen), es wurde besser ... da kamen die fast verblassten Erinnerungen aus der Lehre wieder hoch ...
10uF eingelötet (nach 10 Minuten Kampf mit einem Kurzschluss zwischen den SMD-Anschlüssen) - Bingo - stabiles Signal, stabiles richtiges Signal - stabile richtige Anzeige (nachdem ich in der filwidth wieder auf 5 umgestellt hab - es ist ein 5V toleranter Port)

Jetzt heisst es noch mit dem Sensor zurechtkommen, dann kann ich endlich weiter an den Housing-Erweiterungen drucken.
Ein zu schönes grün, aus deutscher Produktion , mit Durchmessern zwischen 1,65mm und 1,92mm smiling bouncing smiley

Also in kurz für alle die es probieren wollen :
Schaltung paßt (der Glättungskondensator sollte ruhig etwas dicker sein wenn das Signal instabil sein sollte -> 10uF) ; Pin29 ist der Pin 2 in der Config (weil analog Port 2)

1-mal bearbeitet. Zuletzt am 07.04.20 15:38.
Re: Marlin 2 bugfix & Filament Durchmesser
07. April 2020 17:07
Ja, ich hatte in der anderen Richtung gedacht.
Dein Board ist zu langsam! smiling smiley

Herzl. Grüße
In diesem Forum dürfen leider nur registrierte Teilnehmer schreiben.

Klicke hier, um Dich einzuloggen