Skocz do zawartości

Skoki odczytu z termistora


XOEE

Pomocna odpowiedź

#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CS_PIN 10
#define DATA_PIN 11
#define CLK_PIN 13

MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

int Vo;
float R1 = 10000;
float logR2, R2, T, Tc, Tf;
float c1 = 0.9096034675E-3, c2 = 2.149137558E-4, c3 =  1.063439787E-7;

void setup() {
  
  myDisplay.begin();
  myDisplay.setIntensity(5);
  myDisplay.displayClear();
  
}

void loop() {

  Vo = analogRead(A1);
  R2 = R1 * (1023.0 / (float)Vo - 1.0);
  logR2 = log(R2);
  T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
  Tc = T - 273.15;

  int hour = 21;
  int minute = 37;
  int day = 21;
  int month = 8;
  String timeString = String(hour) + ":" + String(minute);
  String dateString = String(day) + "/" + String(month);
  String tempString = String(Tc, 1) + "'C";
  
  myDisplay.setTextAlignment(PA_CENTER);
  myDisplay.setInvert(false);
  //myDisplay.print(timeString);
  //delay(5000);
  //myDisplay.print(dateString);
  //delay(5000);
  myDisplay.print(tempString);
  delay(5000);
}

Napisałem taki kod, wyniki ładnie się wyświetlają na wyświetlaczu lecz wahają się do 7 stopni w góre od faktycznej wartości temperatury, termistor to 47kOhm 5% NTC. Ktoś ma pomysł co robie źle?

Edytowano przez XOEE
Link do komentarza
Share on other sites

18 minut temu, _LM_ napisał:

Może się wahać napięcie referencyjne, no i też pokaż kawałek schematu w okolicach termistora, zasilania itd.

Napięcie idzie z komputera, schemat daje poniżej.image.thumb.png.35a9051aeef8b14a2d67a6be4a816fb9.png

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

39 minut temu, _LM_ napisał:

zastosowałem polecenia z tych linków, niektórych rozwiązań nie dałem rady bo mikrokontroler jest na gotowej płytce która nie wyprowadza wszytskich pinów. Zastosowałem zasilacz 5V, wachania spadły, teraz temperatura wacha się miedzy 28 a 29 C co już jest dobre ale problem jest taki że faktycznie termistor ma temperature 25C, nie wiem dlaczego  jest ta różnica 3 stopni. Może to coś z kodem jest nie tak?

Link do komentarza
Share on other sites

Pytałem jeszcze o źródło napięcia referencyjnego, nie byłeś łaskaw odpowiedzieć, zakładam że nadal lecisz na 5V. Mniejsza o to, zaś jeśli chodzi o kod, zastosowanie obliczeń na float mocno obciąża mikrokontroler, ja gdybym robił taki projekt to użyłbym tablicy wartości dyskretnych wcześniej obliczonych i ADC indeksowały tę tablicę. Dla każdej wartości ADC byłby przypisany odpowiedni wynik już w stopniach celsjusza 

Edytowano przez _LM_
Link do komentarza
Share on other sites

Dnia 30.07.2023 o 12:21, _LM_ napisał:

Pytałem jeszcze o źródło napięcia referencyjnego, nie byłeś łaskaw odpowiedzieć, zakładam że nadal lecisz na 5V. Mniejsza o to, zaś jeśli chodzi o kod, zastosowanie obliczeń na float mocno obciąża mikrokontroler, ja gdybym robił taki projekt to użyłbym tablicy wartości dyskretnych wcześniej obliczonych i ADC indeksowały tę tablicę. Dla każdej wartości ADC byłby przypisany odpowiedni wynik już w stopniach celsjusza 

Przepraszam że nie odpowiedziałem na pytanie odnośnie napięcia referencyjnego, tak używam 5V. Troche poszperałem i z racji iż zależy mi na dokładności pomiaru użyje DS18B20. Dzięki za pomoc i wiedzę.

Link do komentarza
Share on other sites

Microchip (kiedyś Atmel) zaleca na czas konwersji AD usypiać kontroler i wybudzać go po zakończeniu konwersji.

https://microchipdeveloper.com/8avr:adcnoisereduce

Mogę napisać z doświadczenia, że DRAMATYCZNIE ograniacza to błędy pomiarowe.

 

Nie wiem jak to zrobic "po arduinowemu". Na piechotę w C leci to tak:

Ustawiasz po swojemu ADC, np

ADCSRA = ((1 << ADEN) | (1 << ADIE) | (1 << ADPS2) | (1 << ADPS0));            // ADC enabled w trybie single, przerwanie, preskaler 32

Przy pomiarze wybierasz kanał przetwornika, wyrównanie i Uref, np

ADMUX = ((1 << REFS0) | (1 << ADLAR) | MUX_CHANNEL);                            // Ref:AVcc, wynik 8bit w ADCH, ADC6

No i wisienka na torcie, czyli uśpienie na czas pomiaru

set_sleep_mode(SLEEP_MODE_ADC);
cli();
sleep_enable();
sei();
sleep_cpu();
sleep_disable();

Jak się obudzi, to w rejestrze ADC masz gotową niezaszumioną nadmiernie wartość z przetwornika.

No i warto robić kilka pomiarów z uśrednianiem...

 

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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.