• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Kontroler wentylatora PWM
#1
Witam wszystkich!
Od dłuższego czasu używałem Arduino jako kontrolera obrotów wentylatora karty graficznej (karta graficzna nie reagowała na zmianę obrotów wentylatora, który był bardzo głośny).
Znalazłem w internecie program, który sterował wentylatorem poprzez sygnał PWM względem temperatury odczytanej przez termistor. Niestety, po prawie roku poprawnej pracy układu termistor odmówił posłuszeństwa, uC nie mógł odczytać temperatury a tym samym kontrolować wentylatora. W efekcie karta graficzna przegrzała się a komputer wyłączył. Posiadam cyfrowy czujnik DS18B20, który umieściłem w radiatorze jak najbliżej rdzenia (nawierciłem otwór o odpowiedniej średnicy i wkleiłem go klejem termoprzewodzącym). Chciałbym jednak mieć podgląd na temperaturę, która będzie wyświetlana na LCD 16x2 I2C. Z archiwum projektów wygrzebałem kod, który był wgrany na uC, jednak pojawia się problem przy jego edycji, ponieważ strona źródłowa już nie istnieje (zależy mi na zmianie termistora na cyfrowy czujnik DS18B20). 

Ktoś byłby tak dobry i podpowiedział co muszę edytować w oryginalnym kodzie, żeby wentylator był sterowany sygnałem PWM, jednocześnie wyświetlając aktualną temperaturę na LCD?



Kod:
int low_min_temp = 40;
int low_max_temp = 55;
int mid_min_temp = 55;
int mid_max_temp = 65;
int hi_min_temp = 65;
int hi_max_temp = 75;

int slo_fan_speed = 50;
int fst_fan_speed = 100;
int max_fan_speed = 250;

int dly = 1000;
bool testing = false;
)
int fanSpeed = 0;
int temp = 1;
bool incrementing = true;
#define THERMISTOR A0 //pin termistora
#define FAN1 3 // pin dla sygnału PWM wentylatora

void setup() {
  Serial.begin(serial_baud);
  pinMode(FAN1, OUTPUT);
  delay(500);
}
void loop() {
  double temp = Thermister(analogRead(THERMISTOR));
  fanSpeed = actionCheck(temp, fanSpeed);
  Serial.print("["); Serial.print(temp); Serial.print("deg] ");
  executeAction(fanSpeed);
  delay(dly);
}

double Thermister(int RawADC) {
  if (testing) {
    if (temp >= (hi_max_temp + 9)) incrementing = false;
    if (temp <= 0) incrementing = true;
    if (incrementing) temp++;
    else temp--;
    return (temp % (hi_max_temp + 10));
  }
  double temp = log(((10240000/RawADC) - 10000));
temp = 1 / (0.001129148 + (0.000234125 * temp) + (0.0000000876741 * temp * temp * temp));
  temp = temp - 273.15;         
  return temp;
}
int actionCheck(int temp, int fanSpeed) {
  switch (fanSpeed) {
    case 1:
      if (temp < low_min_temp) return 0;
    case 2:
      if (temp < mid_min_temp) return 1;
    case 3:
      if (temp < hi_min_temp) return 2;
  }
  if (temp > hi_max_temp) return 3;
  if ((temp > mid_max_temp) && (fanSpeed == 1)) return 2;
  if ((temp > low_max_temp) && (fanSpeed == 0)) return 1;
  return fanSpeed;
}
void executeAction(int fanSpeed) {
  Serial.print("Fan speed set to: "); Serial.println(fanSpeed);
  int rpm;
  switch (fanSpeed) {
    case 1:
      rpm = slo_fan_speed;
      break;
    case 2:
      rpm = fst_fan_speed;
      break;
    case 3:
      rpm = max_fan_speed;
      break;
    default:
      rpm = 0;
  }
  analogWrite(FAN1, rpm);
}
 
Odpowiedź
  


Wiadomości w tym wątku
Kontroler wentylatora PWM - przez ArduinoNewbie - 09-09-2020, 18:21
RE: Kontroler wentylatora PWM - przez aj123 - 10-09-2020, 19:32
RE: Kontroler wentylatora PWM - przez ArduinoNewbie - 11-09-2020, 10:18
RE: Kontroler wentylatora PWM - przez sebxx4 - 11-09-2020, 20:09
RE: Kontroler wentylatora PWM - przez ArduinoNewbie - 12-09-2020, 09:53
RE: Kontroler wentylatora PWM - przez sebxx4 - 12-09-2020, 10:16
RE: Kontroler wentylatora PWM - przez ArduinoNewbie - 12-09-2020, 13:26
RE: Kontroler wentylatora PWM - przez sebxx4 - 12-09-2020, 14:15
RE: Kontroler wentylatora PWM - przez aj123 - 12-09-2020, 18:08
RE: Kontroler wentylatora PWM - przez ArduinoNewbie - 13-09-2020, 11:01

Skocz do:


Przeglądający: 1 gości