XOEE Napisano Lipiec 29, 2023 Udostępnij Napisano Lipiec 29, 2023 (edytowany) #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 Lipiec 29, 2023 przez XOEE Cytuj Link do komentarza Share on other sites More sharing options...
_LM_ Lipiec 29, 2023 Udostępnij Lipiec 29, 2023 Może się wahać napięcie referencyjne, no i też pokaż kawałek schematu w okolicach termistora, zasilania itd. Cytuj Link do komentarza Share on other sites More sharing options...
XOEE Lipiec 29, 2023 Autor tematu Udostępnij Lipiec 29, 2023 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. Cytuj Link do komentarza Share on other sites More sharing options...
_LM_ Lipiec 29, 2023 Udostępnij Lipiec 29, 2023 Bardzo niestabilne, jaki ref masz ustawiony w atmedze? Możesz dać o napięciu zasilania lub wewnętrzny 1.1V który jest o wiele stabilniejszy Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
_LM_ Lipiec 30, 2023 Udostępnij Lipiec 30, 2023 (edytowany) @XOEE http://mikrokontrolery.blogspot.com/2011/04/minimalne-podlaczanie-pinow.html?m=1 http://mikrokontrolery.blogspot.com/2011/03/avr-adc-podlaczenie.html?m=1 http://mikrokontrolery.blogspot.com/2011/04/zasilanie-mikrokontrolera.html?m=1 zapoznaj się z tym Edytowano Lipiec 30, 2023 przez _LM_ Cytuj Link do komentarza Share on other sites More sharing options...
XOEE Lipiec 30, 2023 Autor tematu Udostępnij Lipiec 30, 2023 39 minut temu, _LM_ napisał: @XOEE http://mikrokontrolery.blogspot.com/2011/04/minimalne-podlaczanie-pinow.html?m=1 http://mikrokontrolery.blogspot.com/2011/03/avr-adc-podlaczenie.html?m=1 http://mikrokontrolery.blogspot.com/2011/04/zasilanie-mikrokontrolera.html?m=1 zapoznaj się z tym 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? Cytuj Link do komentarza Share on other sites More sharing options...
_LM_ Lipiec 30, 2023 Udostępnij Lipiec 30, 2023 (edytowany) 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 Lipiec 30, 2023 przez _LM_ Cytuj Link do komentarza Share on other sites More sharing options...
_LM_ Lipiec 30, 2023 Udostępnij Lipiec 30, 2023 Na odczyt z pewnością ma wpływ wartość R1 ja dałbym tam coś stabilniejszego np: źródło prądowe. Cytuj Link do komentarza Share on other sites More sharing options...
XOEE Sierpień 1, 2023 Autor tematu Udostępnij Sierpień 1, 2023 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ę. Cytuj Link do komentarza Share on other sites More sharing options...
kostuch Sierpień 1, 2023 Udostępnij Sierpień 1, 2023 (edytowany) 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 Sierpień 1, 2023 przez kostuch 1 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!