Skocz do zawartości

Problem częstszego sterowania SSR-ami przy użyciu czujnika temperatury DS18B20


MisiekD

Pomocna odpowiedź

1 godzinę temu, matsobdev napisał:

Generalnie rozchodzi się o to, że po resecie w brudnopisie DSa jest 85 stopni i wskutek błędu może taką raportować, jak coś nie będzie stykać.

@ethanak

No rozumiem, ale błąd pojawia się jak jest nieprawidłowy styk przewodem? Nie wiem czy o to chodzi, ale w internecie wspominali, że jest to błąd konwersji przy wyłączonym zasilaniu. Natomiast obiło mi się, że wystarczy użyć sensors.requestTemperatures() i wszystko wraca do normy 🙂 A z tego polecenia korzystam cały czas.

Ale ponadto, nawet gdyby tak się stało, to tak jak napisałem wcześniej - grzałki się nie włączą, nic się nie popali, nikogo przez ten błąd nie poparzy, najwyżej nie będzie działać i dostanę telefon, że nie działa i będę dziubał dalej 😉 

Link do komentarza
Share on other sites

Przy takiej mocy grzałek to bym nie kombinował tylko sobie kupił fabryczny regulator temperatury PID. Choćby głupiego REX c-100, choć akurat sam go nie kocham specjalnie, ale bezczelnie tani. Przy SSRach dobrze jest przewidzieć układ awaryjnego odcięcia ich zasilania na styczniku, gdyby któryś dostał zwarcia. Dobry regulator temperatury PID jest dosyć skomplikowany, bo ma zabezpieczenia LBA, HBA, CP (niedogrzanie i przegrzanie w czasie, monitorowanie prądu obciążenia) itp.

PS. REx C-100 to popularny regulator produkowany przez wielu dalekowschodnich producentów, różniący się wersjami oprogramowania, zależnie od wersji sprzętu. Są wersje z funkcjami LBA, HBA., które bardzo przydają się w takiej aplikacji, jako zabezpieczenie programowe, w przypadku uszkodzenia SSRów.

W uproszczeniu funkcje ochronne

LBA (Loop Break Alarm) - działa to tak że jeżeli w zadanym czasie LBA, temperatura obiektu nie wzrośnie o zadany gradient temperatury, to aktywowany jest alarm LBA, i trwa (jest utrzymywany) tak długo, aż reakcja obiektu regulacji, nie wróci do zadanych (spodziewanych) właściwości. Zastosowanie. Np. wykrywanie niesprawności grzałki (przerwa), brak lub nieodpowiednia ilość medium np. wody w bojlerze (grzałka grzeje, ale temperatura nie rośnie w oczekiwany sposób), lub zarządzanie w pewnym zakresie wydajnością jeżeli jest ich więcej.

HBA (High Break Alarm) - działa podobnie do funkcji wyżej tylko w druga stronę. Tzn. jeżeli temperatura obiektu rośnie szybciej niż założony gradient w czasie to aktywowany jest alarm. Zastosowanie, głównie wykrywanie zwarcia w SSRach i awaryjne odcinanie ich zasilania, stycznikiem, aby nie doprowadzić np. do wybuchu bojlera przez przegrzanie. Rzadziej spotykany w sterownikach PID, bo można takie zabezpieczenie osiągnąć odpowiednio konfigurując zwykłe alarmy.

 

Edytowano przez BlackJack
  • Lubię! 2
Link do komentarza
Share on other sites

Odczyt zajmuje Ci 30ms, bo czytasz temperaturę, a potem od razu zlecasz pomiar, to są połączone 2 transmisje 1Wire. 

Można zrobić tak, że dzielisz czas uC na jakiś sensowny interwał, np. 10ms, potem w pierwszym można zlecić odczyt, a np. w szesnastym zlecenie pomiaru.

Dla DS to nie ma za bardzo sensu, chyba że zrezygnujesz z 12 bitów, przy 12 można zlecać pomiar  w parzystych sekundach, odczytywać w nieparzystych, jedna komunikacja będzie zajmowała połowę dotychczasowego czasu.

// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);


uint32_t czasTeraz,czasPoprzedni,tik=10, czas1,czas2,czas3,czas4,roznica,maximum,srednia;
uint8_t n10,fn10,sekundy,minuty,godziny,dni,nic;
bool fsekundy,fminuty,fgodziny,fdni;

void setup() {
//  sysClock(INT_OSC32);
  // put your setup code here, to run once:
Serial.begin(115200);
  sensors.begin();
sensors.requestTemperatures(); 
sensors.setWaitForConversion(0);
}

void loop() {
  czas(); 
  // put your main code here, to run repeatedly:
 if(fsekundy)
 {
  if(sekundy%2==0)
  {
     sensors.requestTemperatures(); // Send the command to get temperatures
//     float odczyt=sensors.getTempCByIndex(0);
//     Serial.print("Odczyt temperatury zaraz po zleceniu konwersji: "); 
//     Serial.println(odczyt); 
  }
  else
  {
     float odczyt=sensors.getTempCByIndex(0);
     Serial.print("Odczyt temperatury w innej sekundzie: "); 
     Serial.println(odczyt); 
  }
 }
 

if(fn10) //co 10ms
{
    if (n10%16==0) //i gdy reszta z dzielenia jest rowna 0, co 160 ms, mozna to wrzucić w laczonego ifa poziom wyzej z and
    {
    digitalWrite(13, ! digitalRead(13)); //zmien stan led 13
    }

}


void czas()
{
  czasTeraz=millis();
 fn10=fsekundy=fminuty=fgodziny=fdni=0;
if((uint32_t)(czasTeraz-czasPoprzedni)>=tik)
{
  czasPoprzedni=czasTeraz;
  fn10=1;
  n10++;
  if(n10>=100)
  {
    n10=0;
    sekundy++;
    fsekundy=1;
     if (sekundy>=60)
    {
      sekundy=0;
      minuty++;
      fminuty=1;
      if (minuty>=60)
      {
        minuty=0;
        godziny++;
        fgodziny=1;
        if (godziny>=24)
        {
          godziny=0;
          fdni=1;
          dni++;
    
        }
      }
    }
  }
}
}

Poza tym w loop tylko raz pytam ile upłynęło ms od startu programu, to też trwa. Potem już tylko proste operacje porównania liczb 8-bitowych.

Jak Ci zależy na reakcji co 50ms, to lepiej użyć PT100 i modułu odczytu po SPI, MAX31865 i sonda w komplecie jest do znalezienia za 2 dyszki.

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

2 godziny temu, kaczakat napisał:

Odczyt zajmuje Ci 30ms, bo czytasz temperaturę, a potem od razu zlecasz pomiar, to są połączone 2 transmisje 1Wire. 

Można zrobić tak, że dzielisz czas uC na jakiś sensowny interwał, np. 10ms, potem w pierwszym można zlecić odczyt, a np. w szesnastym zlecenie pomiaru.

Dla DS to nie ma za bardzo sensu, chyba że zrezygnujesz z 12 bitów, przy 12 można zlecać pomiar  w parzystych sekundach, odczytywać w nieparzystych, jedna komunikacja będzie zajmowała połowę dotychczasowego czasu.

// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);


uint32_t czasTeraz,czasPoprzedni,tik=10, czas1,czas2,czas3,czas4,roznica,maximum,srednia;
uint8_t n10,fn10,sekundy,minuty,godziny,dni,nic;
bool fsekundy,fminuty,fgodziny,fdni;

void setup() {
//  sysClock(INT_OSC32);
  // put your setup code here, to run once:
Serial.begin(115200);
  sensors.begin();
sensors.requestTemperatures(); 
sensors.setWaitForConversion(0);
}

void loop() {
  czas(); 
  // put your main code here, to run repeatedly:
 if(fsekundy)
 {
  if(sekundy%2==0)
  {
     sensors.requestTemperatures(); // Send the command to get temperatures
//     float odczyt=sensors.getTempCByIndex(0);
//     Serial.print("Odczyt temperatury zaraz po zleceniu konwersji: "); 
//     Serial.println(odczyt); 
  }
  else
  {
     float odczyt=sensors.getTempCByIndex(0);
     Serial.print("Odczyt temperatury w innej sekundzie: "); 
     Serial.println(odczyt); 
  }
 }
 

if(fn10) //co 10ms
{
    if (n10%16==0) //i gdy reszta z dzielenia jest rowna 0, co 160 ms, mozna to wrzucić w laczonego ifa poziom wyzej z and
    {
    digitalWrite(13, ! digitalRead(13)); //zmien stan led 13
    }

}


void czas()
{
  czasTeraz=millis();
 fn10=fsekundy=fminuty=fgodziny=fdni=0;
if((uint32_t)(czasTeraz-czasPoprzedni)>=tik)
{
  czasPoprzedni=czasTeraz;
  fn10=1;
  n10++;
  if(n10>=100)
  {
    n10=0;
    sekundy++;
    fsekundy=1;
     if (sekundy>=60)
    {
      sekundy=0;
      minuty++;
      fminuty=1;
      if (minuty>=60)
      {
        minuty=0;
        godziny++;
        fgodziny=1;
        if (godziny>=24)
        {
          godziny=0;
          fdni=1;
          dni++;
    
        }
      }
    }
  }
}
}

Poza tym w loop tylko raz pytam ile upłynęło ms od startu programu, to też trwa. Potem już tylko proste operacje porównania liczb 8-bitowych.

Jak Ci zależy na reakcji co 50ms, to lepiej użyć PT100 i modułu odczytu po SPI, MAX31865 i sonda w komplecie jest do znalezienia za 2 dyszki.

Dzięki za rozwinięcie temaru i rozszerzenia informacji o DS18B20. Ja już natomiast poradziłem sobie zmieniając rozdzielczość i odczytując co 30ms, to mi wystarczy, jest aż za dobrze 😉

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.