Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 21 lut 2025, o 23:53


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 26 paź 2015, o 01:59 
Offline
Nowy

Dołączył(a): 02 paź 2015
Posty: 23
Pomógł: 0

Witam wszystkich forumowiczów. Mam następujące banalne pytanie a raczej prośba o pomoc.

Klient zlecił mi wykonanie miniaturowych termostatów sterowanych analogowo a czujnikiem jest DS18B20 w normalnej konfiguracji i tu zaczynają się moje schody. Przetwornik działa bez zarzutu pokazuje ładnie wartość ADC od 0-1023 tak samo ładnie działa czujnik temperatury ale mam problem ze ze skalowaniem żądanej a raczej ustawianej wartości na ADC w stosunku do pomiaru DS-a. Chodzi mi dokładnie oto, że minimalna temperatura ma wynosić 30*C przy ustawieniu ADC=0 a max 95*C przy ADC=1023. Prosił bym o pomoc w ze skalowaniu matematycznym lub jakimś wzorze bym mógł zaimplementować go w kodzie programu aby była możliwość porównywania wartości ADC z wartością temperatury. Chodzi mi bardziej oto w jaki sposób rozwiązać to matematycznie. Temperatura z czujnika jest odbierana z dokładnością co do 1*C wiec nie ma potrzeby w moim projekcie sterowania z dokładnością do 0.1*C. Wiadomo jest to zakres 65*C przy podziale przez 1023 i tak wychodzą części ułamkowe(0.063*C). Prośba moja polega na tym jak to wszystko ze skalować by np ADC=0 to temp wyłączenia termostatu 30*C; ADC=512 to termostat ma się wyłączyć przy np60*C itp.
Jak ze skalować taki zakres pomiarowy. Procesor to ATmega88 8MHz napięcie 1,1V napięcie odniesienia.

Za wszelką pomoc w rozwiązaniu mojego problemu jestem i będę wdzięczny. Może to dziwna prośba o pomoc ale pomóżcie jak ktoś potrafi.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2015, o 03:05 
Offline
Użytkownik

Dołączył(a): 04 lis 2014
Posty: 267
Lokalizacja: Krosno
Pomógł: 38

DS18B20 nie jest analogowym czujnikiem
https://datasheets.maximintegrated.com/ ... S18B20.pdf
czujnik analogowy np lm35,lm335 itp przez adc
http://www.ti.com/lit/ds/symlink/lm35.pdf



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2015, o 04:55 
Offline
Nowy

Dołączył(a): 02 paź 2015
Posty: 23
Pomógł: 0

jaman7 napisał(a):
DS18B20 nie jest analogowym czujnikiem
https://datasheets.maximintegrated.com/ ... S18B20.pdf
czujnik analogowy np lm35,lm335 itp przez adc
http://www.ti.com/lit/ds/symlink/lm35.pdf


Witam kolegę. Wiem że czujnik DS18B20 nie jest analogowy ale cyfrowy. Chodzi mi o skalowanie ADC z potencjometru przy którym termostat ma się wyłączyć z temperaturą odczytaną z DS18B20 inaczej mówiąc porównywanie wartości z ADC do wartości temperatury z czujnika. Obsługa czujnika temperatury a dokładnie biblioteka to biblioteka Mirka z jego książki a dokładnie płyty. W pomiarze wykorzystuje zmienną uint8_t cel; w której przetrzymuje dziesiętne części stopni Celcjusza i chce je porównywać z wartością ADC zadaną z potencjometru ale to nie ma być od 0*C ale od 30 bo od zera to bym zrobił skalowanie 1/10. Chciał bym za pomocą wartości ADC bym mógł w logiczny sposób i normalny regulować temperaturę a dokładnie przedział zadziałania termostatu. Chodzi mi bardziej o sposób przeliczenia a dokładnie skalowania bym mógł regulować temperaturę. Wiem jak zrobić porównywanie z wartością ADC i resztę programu ale chciałbym logicznie sterować tym urządzeniem a nie pisać obszerna tablice z ustawieniami ADC i porównywanie jej do tablicy cel;. Chodzi mi o jakieś makro które by przeliczało wartość ADC na stopnie Celcjusza np: wartość ADC=0=>temp_celc=30 ADC=1023=> temp_celc=95 by potem w warunku if porównywać wartość cel z wartością temp_cel np if (temp_celc => (celc+hist) )Pk1_ON; else Pk1_OFF; hist to histereza ustawiona programowo 2*C

Przepraszam jak coś jest zagmatwane i nie jasne pytajcie a postaram się bardziej szczegółowo wyjaśnić lub jakoś po polsku. Po prosu wartość ADC muszę zamienić na wartość od 30 do 95 aby móc porównywać ja z temperaturą z czujnika DS18B20. Potencjometrem zadaje wartość przy którym ma się załączyć przekaźnik np ADC=512 temp_celc=60*C to muszę jakoś przeliczyć to na wartość od 30 do 95 i potem tę wartość porównywać z temperaturą z czujnika DS.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2015, o 07:34 
Offline
Użytkownik

Dołączył(a): 04 cze 2013
Posty: 517
Pomógł: 26

Kolego ja bym zrobił to tak: różnica miedzy temperaturami to 65 stopni według założeń temp min 30 max 95 Następnie tą różnice podzielił bym przez 1024 wyjdzie ci że wartość jeden z przetwornika to 0,063476563 temperatury . a temperature wyliczył bym sobie tak temp= 30+(0,063476563* wartośc z przetwornika) Np Przy wartości przetwornika 500 temperatura wychodzi np 61,73828125 Oczywiście musisz ją odpowiednio sformatować


Autor postu otrzymał pochwałę

_________________
Przewodnik|Sterownik akwariowy



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2015, o 20:52 
Offline
Nowy

Dołączył(a): 02 paź 2015
Posty: 23
Pomógł: 0

matekogon napisał(a):
Kolego ja bym zrobił to tak: różnica miedzy temperaturami to 65 stopni według założeń temp min 30 max 95 Następnie tą różnice podzielił bym przez 1024 wyjdzie ci że wartość jeden z przetwornika to 0,063476563 temperatury . a temperature wyliczył bym sobie tak temp= 30+(0,063476563* wartośc z przetwornika) Np Przy wartości przetwornika 500 temperatura wychodzi np 61,73828125 Oczywiście musisz ją odpowiednio sformatować


Witam kolegę. Wpadłem na dość ciekawy pomysł rozwiązania mojego problemu ale widzę, że Twoje rozwiązanie jest dość proste i spełniające moje oczekiwania. Jak przeczytałem sposób jaki proponujesz to normalnie spaliłem się ze wstydu bo nie pomyślałem o takim właśnie sposobie i to na dodatek bardzo prostym i spełniającym moje założenia. Dziękuje za pomoc i mam nadzieję, że ja kiedyś też się odwdzięczę. Temat uznaje za zamknięty. A pro po sformatowania wyniku a dokładnie części po przecinku nie będzie takiej operacji bo będę operował na liczbach całkowitych a nie zmiennoprzecinkowych np:

void termostat (uint8_t x){

uint16_t adc = ADCW;
if (cel >=(30+(0.063476563*adc)+hist)) PK1_ON;
if (PK1_ON == 1){
if (cel <= (30+(0.063476563*adc)-hist)) PK1_OFF;
}
}

Chyba mniej więcej ma to tak działać prosta regulacja z histerezą. Jeśli coś nie tak proszę o korekte



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2015, o 21:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 mar 2015
Posty: 144
Pomógł: 2

Do tego, co mówi matekogon dodałbym tylko, że unikałbym liczb typu float.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2015, o 21:26 
Offline
Nowy

Dołączył(a): 02 paź 2015
Posty: 23
Pomógł: 0

Zgadzam się z kolega float nie może być i nie ma takiej opcji bo wartość (adc*0.063...) jako uint16_t i tak będzie skakać co 1*C bo to co jest po przecinku w systemie liczb całkowitych jest pomijane więc najniższą wartość jaką mode ustawić i z jakim będzie skok zadawanej temperatury to 1*C a z DS też będą pobierane wartości całkowite a po przecinku nie będą brane pod uwagę. Czyli jak na czujniku będzie temp 31* to na adc też będzie 31 i nic po przecinku bo tu mamy obcinanie wszystkiego po przecinku a pokazywanie tego co stoi przed nim. Dziękuje za wszelką pomoc i jak macie jakieś sugestie co d termostatu czy dobrze jest napisany warunek If z histerezami. Pozdrawiam i dziękuje raz jeszcze za pomoc i za zainteresowanie moim problemem. Niech pomysły będą z wami i z naszym Mirkiem.

------------------------ [ Dodano po: 14 minutach ]

Miał bym prośbę o sprawdzenie jeszcze kodu jak można oczywiście bo wolał bym się upewnić, że wszystko jest jak powinno być.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


------------------------ [ Dodano po: 16 minutach ]

A co do Timera0 to będzie użyty do zliczenia roboczogodzin urządzenia na razie jest w trakcie pisania kodu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO