PID+MAX6675+Fan pwm

Buongiorno a tutti,

dopo quasi 3 settimane di cornate col software provo a scrivere qui per cercare di capire se ho sviluppato tutto in maniera corretta.
Lo scopo principale di questo software è di comandare una ventola pwm che si aziona in base alla temperatura che sente e dalla temperatura che è stata impostata come temperatura target. Più è distante il divario, più la ventola gira veloce. Man mano che ci avviciniamo alla temperatura desiderata la ventola rallenta.

A livello di HW sto impiegando: Arduino Uno R3, LCD Keypadshield, MAX6675 e una ventola PWM da 8cm coi 4 pin (nero, giallo, verde, blu).
Non credo di avere problemi a livello Hardware dato che funziona praticamente tutto, probabilmente c’è un baco nel software che non trasferisce correttamente le informazioni. oppure non ho capito nulla e sono nello sconforto pieno. Comunque veniamo con Ordine.

MAX6675 che ha 5 pin è collegato:

  • GND con GND di Arduino
  • VCC con 5V
  • SKC con pin 13
  • CS con pin 12
  • SO con pin 11

il fan PWM è collegato:

  • Nero con GND di Arduino
  • Giallo con 12V
  • Verde non collegato
  • Blu con pin 3

Dato che il codice risultava troppo lungo ho preferito allegarlo

la configurazione, il max6675 funziona e legge, l’indicazione sul lcd del carico che dovrebbe avere il fan (variabile fan) è corretta. il ventilatore resta impostato al 100% e da li però non riesco a schiodarlo.

So disperato e son certo di essere vicinissimo alla soluzione finale…

Grazie per la collaborazione! :slight_smile:

Test.ino (12.3 KB)

Perché non metti un Serial.println() sul monitor seriale dei valori che mandi al PWM (analogWrite()) ? Così verifichi che veramente gli stai mandando il valore giusto.

Guglielmo

Ciao,
Grazie per la risposta.
invece di aggiungere un Serial.println() ho modificato il printout su lcd della velocità del fan, prima era dato in % ora da il valore. A quello che corrispondeva al 100% ora corrisponde un 255. a valori più bassi corrisponde un valore intermedio tra 0 e 255. se avviene un overshoot ottengo 0.
Il problema però nasce direttamente in void setup(). Se hai notato, ho richiesto che venisse imposto a 0 il pin del pwm.

pinMode(pwmPin, OUTPUT);
analogWrite(pwmPin,0);

Quindi mi aspetterei che una volta avviato il programma e avviato il setup, il fan si imposti in posizione ferma. Questo non accade anzi continua ad andare al 100%. Devo fare una foto dello schema che così magari risulta più semplice per vedere se tutto è collegato in maniera corretta?.
In teoria avendo visto applicazioni simili online, non dovrebbe dare errori.... invece non funziona :frowning:

Ma se scolleghi il filo dal pin del PWM e lo colleghi a GND, il ventilatore si ferma ? Ovvero, il filo di controllo del ventilatore funziona ?

Guglielmo

Markus_der_Killer:
Ciao,
Grazie per la risposta.
invece di aggiungere un Serial.println() ho modificato il printout su lcd della velocità del fan, prima era dato in % ora da il valore. A quello che corrispondeva al 100% ora corrisponde un 255. a valori più bassi corrisponde un valore intermedio tra 0 e 255. se avviene un overshoot ottengo 0.
Il problema però nasce direttamente in void setup(). Se hai notato, ho richiesto che venisse imposto a 0 il pin del pwm.

pinMode(pwmPin, OUTPUT);
analogWrite(pwmPin,0);

Quindi mi aspetterei che una volta avviato il programma e avviato il setup, il fan si imposti in posizione ferma. Questo non accade anzi continua ad andare al 100%. Devo fare una foto dello schema che così magari risulta più semplice per vedere se tutto è collegato in maniera corretta?.
In teoria avendo visto applicazioni simili online, non dovrebbe dare errori… invece non funziona :frowning:

Puó essere giusto perché é una protezione per il PC. A PWM 0 vuol dire che il segnale é a massa il ventillatore lo interpreta come interruzione o blocco del pilotaggio e per salvaguardare il processore del PC gira al massimo.

Cosa succede se al posto di 0 metti 1: analogWrite (pin,1)?

Ciao Uwe

Ciao,

ho effettuato entrambi i test.

Test 1: cortocircuitato il connettore di PWM del fan con GND. Risultato nullo. Il ventilatore continua a girare senza ridurre velocità.
Test 2: Modificato il codice in modo tale che come analogWrite fosse imposto il valore 1, invece di 0. Risultato nullo. Il ventilatore continua a girare senza ridurre velocità.

Qualche altra idea o suggerimento? :slight_smile:
Grazie,

Marco

Quando mi succedono problemi del genere, io riscrivo un programmino che cerchi di verificare il funzionamento di solo quello che non va.
Nel tuo caso, prova a scrivere un programma che comandi in PWM la ventola e basta. Gli passi dei valori in uscita e verifichi che risponda correttamente. Se tutto funziona, poi applichi la nuova conoscenza al tuo programma.

Nuovi 3 test effettuati.

Test 1. Cambiato ventola, ho impiegato una di un vecchio processore con 3 wiring invece di 4 ma non è cambiato niente.

Test 2. Ho impiegato il file “fading” già presente negli esempi di arduino. questo funziona in questa maniera. Partendo dal valore di 255 (ventola al 100%) pian piano la fa scendere di 5 valori per volta, con un delay di 30ms. Quello che ho notato è che la ventola, una volta che imposta la discesa, a livello sonoro riduce i giri e si arriva quasi a leggere la scritta sull’asse centrale. però non arriva a fermarsi, anzi riaccelera sceso sotto un certo valore. Non è che sono obbligato per motivi costruttivi di autoprotezione di queste ventole a modificare lo schema? Questo perché avere una ventola che funzioni in maniera parziale rispetto a quanto mi aspettassi non è corretto. dato che non ho bisogno (per l’impiego che voglio fare del sistema) che le ventole girino sempre al 100% (o al 60% al minimo).

Test 3. Sempre impiegando il file “fading” ho provato a vedere i livelli di funzionamento, con un semplice codice.

  analogWrite(ledPin, 255);
  delay(5000);
  analogWrite(ledPin, 191);
  delay(5000);
  analogWrite(ledPin, 127);
  delay(5000);
  analogWrite(ledPin, 64);
  delay(5000);
  analogWrite(ledPin, 0);
  delay(5000);

mi sono accorto che con 12V il carico a 0 non viene eseguito. al che sono andato a verificare sul sito della ventola e c’è un fantastico grafico che non avevo considerato.

Quindi non potrò scendere, con 12V a valori sotto i 400rpm se imposto un carico < di 10% di pwm. è anche vero che con 400 rpm la velocità è minima Quindi potrei anche dire al SW che se il valore di “output del PID” è < di 25 impostalo a 26. così evito che acceleri.

Ho inteso correttamente?

Si può chiudere il topic, ho risolto il problema come da ultimo post.