Velocità motore secondo Temp NTC lo Stepper si muove a intermittenza

Buongiorno a tutti!
Dal titolo potrebbe non essere molto chiaro, sto lavorando su un progetto composto da un motore passo passo che gestisce una pompa peristaltica la cui velocità varia in base alla temperatura.
Utilizzo un Arduino Micro Pro + Driver A4988 + 2 termoresistori 10K (temperatura IN e temperatura OUT) il tutto visualizzato su un display OLED I2C 128x64.
La lettura delle due temperature e visualizzazione su display sembrerebbe funzionare tutto in maniera corretta(a parte alcune piccole tarature da effettuare), il mio problema è sul motore passo-passo.

Di seguito vi metto l'intero codice:

#include <U8glib.h>
#include <Arduino.h>
#include <Wire.h>
#include <AccelStepper.h>

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0);

//-------------------------------------------------------Variabili NTC---------------------------------------------------------//
int PrecisioneDecimale = 1;             // Posizioni decimali ES:(0.00) per tutti i valori mostrati nel monitor seriale

int PinTermoIN = A0;                    // Il pin di ingresso analogico per temp INGRESSO
int PinTermoOUT = A1;                // Il pin di ingresso analogico per temp USCITA

float PartitoreTensioneR_IN = 10000;    // Valore del resistore R2 del partitore di tensione
float PartitoreTensioneR_OUT = 10000;   // Valore del resistore R2 del partitore di tensione

float BValue = 3470;                    // Il "BValue" del termistore per l'intervallo di misurazione della temperatura

float R_IN = 10000;                     // Valore nominale del resistore del termistore (NTC) alla temperatura di base (25 gradi centigradi)
float R_OUT = 10000;

float T1 = 298.15;                      // Temperatura base "T1" in Kelvin (l'impostazione predefinita dovrebbe essere di 25 gradi )
float R2 ;                              // Resistenza del termistore (in ohm) alla temperatura di misurazione
float R3 ;
float T2 ;                              // Temperatura misurata
float T3 ;

float a ;                               /* Utilizzare per il calcolo in temperatura */
float b ;                               /* Utilizzare per il calcolo in temperatura */
float c ;                               /* Utilizzare per il calcolo in temperatura */
float d ;                               /* Utilizzare per il calcolo in temperatura */
float e = 2.718281828 ;                 // Il valore "e" utilizzare per il calcolo in Temperatura

float tempSampleRead_IN  = 0;              // Per leggere il valore di un campione incluso il valore tempSampleSum
float tempSampleSum_IN   = 0;              // Accumulo di letture di campioni
float tempMean_IN ;                        // Per calcolare il valore medio di tutti i campioni, in valori analogici

float tempSampleRead_OUT  = 0;              // Per leggere il valore di un campione incluso il valore tempSampleSum
float tempSampleSum_OUT   = 0;              // Accumulo di letture di campioni
float tempMean_OUT ;                        // Per calcolare il valore medio di tutti i campioni, in valori analogici

//-----------------------------------------------------Delay non Bloccante-----------------------------------------------------//
float tempLastSample_IN  = 0;
float tempSampleCount_IN = 0;

float tempLastSample_OUT  = 0;
float tempSampleCount_OUT = 0;

//----------------------------------------------------Variabili stepper--------------------------------------------------------//
int step = 9;
int dir = 8;
int en = 7;
int vel;

AccelStepper stepper(AccelStepper::DRIVER, step, dir);

void setup() {
  Serial.begin(9600);
  u8g.begin();

  pinMode(step, OUTPUT);
  pinMode(dir, OUTPUT);
  pinMode(en, OUTPUT);

  stepper.setMaxSpeed(5000);
  //stepper.setSpeed(5000);

}

void loop() {
  if (T2 > 298) {
    tempIN();
    tempOUT();
    vel = T2*15;
    stepper.setSpeed(vel);
    stepper.runSpeed();
    Serial.println(T2);
  } else {
    tempIN();
    tempOUT();
    vel = T2*15;
    stepper.setSpeed(vel);
    stepper.runSpeed();
    Serial.println(T2);
  }
}

void tempIN() {
  if (millis() >= tempLastSample_IN + 1) {                                    /* Funzione Delay non Bloccante */
    tempSampleRead_IN = analogRead(PinTermoIN);                               // legge il valore analogico dal sensore
    tempSampleSum_IN = tempSampleSum_IN + tempSampleRead_IN;                  // Aggiunge tutto il valore analogico per calcolare la media in seguito
    tempSampleCount_IN = tempSampleCount_IN + 1;                              /* Funzione Delay non Bloccante*/
    tempLastSample_IN = millis();                                             /* Funzione Delay non Bloccante*/
  }

  if (tempSampleCount_IN == 1000) {                                           /* Funzione Delay non Bloccante*/
    tempMean_IN = tempSampleSum_IN / tempSampleCount_IN;                      // Trova il valore analogico medio da questi dati
    R2 = (PartitoreTensioneR_IN * tempMean_IN) / (1023 - tempMean_IN);        // Convertire il valore analogico medio in valore di resistenza

    a = 1 / T1;                                                               /* Utilizzare per il calcolo in temperatura */
    b = log10(R_IN / R2);                                                     /* Utilizzare per il calcolo in temperatura */
    c = b / log10(e);                                                         /* Utilizzare per il calcolo in temperatura */
    d = c / BValue ;                                                          /* Utilizzare per il calcolo in temperatura */
    T2 = 1 / (a - d);                                                         // Il valore di temperatura misurato in base al calcolo (in Kelvin)

    u8g.firstPage();
    do {
      u8g.setFont(u8g_font_profont22);
      u8g.setPrintPos(10, 15);
      u8g.print("HEAT-PUMP");
      u8g.setPrintPos(0, 35);
      u8g.print("T in:");
      u8g.setPrintPos(75, 35);
      u8g.print(T2 - 274.15, PrecisioneDecimale);
      u8g.setPrintPos(0, 59);
      u8g.print("T out:");
      u8g.setPrintPos(75, 59);
      u8g.print(T3 - 274.15, PrecisioneDecimale);
    } while ( u8g.nextPage() );

    tempSampleSum_IN = 0;                                                     // Resettare tutto il valore analogico totale a 0 per il conteggio successivo
    tempSampleCount_IN = 0;                                                   // Reimpostare il numero totale di campioni prelevati a 0 per il conteggio successivo
  }
}

void tempOUT() {
  if (millis() >= tempLastSample_OUT + 1) {                                   /* Funzione Delay non Bloccante */
    tempSampleRead_OUT = analogRead(PinTermoOUT);                             // legge il valore analogico dal sensore
    tempSampleSum_OUT = tempSampleSum_OUT + tempSampleRead_OUT;               // Aggiunge tutto il valore analogico per calcolare la media in seguito
    tempSampleCount_OUT = tempSampleCount_OUT + 1;                            /* Funzione Delay non Bloccante*/
    tempLastSample_OUT = millis();                                            /* Funzione Delay non Bloccante*/
  }

  if (tempSampleCount_OUT == 1000) {                                          /* Funzione Delay non Bloccante*/
    tempMean_OUT = tempSampleSum_OUT / tempSampleCount_OUT;                   // Trova il valore analogico medio da questi dati
    R3 = (PartitoreTensioneR_IN * tempMean_OUT) / (1023 - tempMean_OUT);      // Convertire il valore analogico medio in valore di resistenza

    a = 1 / T1;                                                               /* Utilizzare per il calcolo in temperatura */
    b = log10(R_OUT / R3);                                                    /* Utilizzare per il calcolo in temperatura */
    c = b / log10(e);                                                         /* Utilizzare per il calcolo in temperatura */
    d = c / BValue ;                                                          /* Utilizzare per il calcolo in temperatura */
    T3 = 1 / (a - d);                                                         // Il valore di temperatura misurato in base al calcolo (in Kelvin)

    u8g.firstPage();
    do {
      u8g.setFont(u8g_font_profont22);
      u8g.setPrintPos(10, 15);
      u8g.print("HEAT-PUMP");
      u8g.setPrintPos(0, 35);
      u8g.print("T in:");
      u8g.setPrintPos(75, 35);
      u8g.print(T2 - 274.15, PrecisioneDecimale);
      u8g.setPrintPos(0, 59);
      u8g.print("T out:");
      u8g.setPrintPos(75, 59);
      u8g.print(T3 - 274.15, PrecisioneDecimale);
    } while ( u8g.nextPage() );

    tempSampleSum_OUT = 0;                                                    // Resettare tutto il valore analogico totale a 0 per il conteggio successivo
    tempSampleCount_OUT = 0;                                                  // Reimpostare il numero totale di campioni prelevati a 0 per il conteggio successivo
  }
}

Vorrei che il motore continuasse a girare e regolare la velocità in base alla temperatura in modo da tenere un liquido ad una temperatura costante(decisa da me via software) il problema è che noto che il motore fa una rivoluzione intera (200step) o comunque si muove per un breve periodo, si ferma e poi riprende.
Un'altra cosa che ho notato, o forse sono allucinato io, che in questo sketch il motore come velocità è diversa (sembra girare molto più piano) rispetto a uno sketch (tipo quelli di esempio per gestire un motore) dove faccio girare il motore e basta.

vorrei capire da cosa è dovuto questo effetto, la variazione di velocità e rotazione a intermittenza del motore? (quindi in cosa sbaglio nello scrivere il SW)
Consigli o linee guida su come risolvere migliorare il SW.

Grazie a tutti in anticipo!
Spero di essermi spiegato abbastanza bene e di aver azzeccato la sezione (ho fatto qualche ricerca sia sul forum che su google ma con scarsi risultati).

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.