<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=30&amp;t=13354&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-10-26T21:26:32+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=30&amp;t=13354&amp;mode</id>
<entry>
<author><name><![CDATA[Dawid.R]]></name></author>
<updated>2015-10-26T21:26:32+01:00</updated>
<published>2015-10-26T21:26:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13354&amp;p=143438#p143438</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13354&amp;p=143438#p143438"/>
<title type="html"><![CDATA[Re: Pomoc ze skalowaniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13354&amp;p=143438#p143438"><![CDATA[
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.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 14 minutach ]</span></strong><br /><br />Miał bym prośbę o sprawdzenie jeszcze kodu jak można oczywiście bo wolał bym się upewnić, że wszystko jest jak powinno być.<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 25 paź 2015<br /> *      Author: Dawid Rybak<br /> */<br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;1Wire/ds18x20.h&quot;<br /><br />#define LED1 (1&lt;&lt;PB0)// LED działania przetwornika<br />#define LED2 (1&lt;&lt;PB1)// LED działania termostat gdy temp ustawimy za wysoką<br />#define LED3 (1&lt;&lt;PB2)// LED działanie poprawne termostatu<br />#define PK1 (1&lt;&lt;PB3)<br /><br />#define LED1_ON PORTB &amp;= ~LED1<br />#define LED1_OFF PORTB |= LED1<br />#define LED1_TOG PORTB ^= LED1<br />#define LED2_ON PORTB |= LED2<br />#define LED2_OFF PORTB &amp;= ~LED2<br />#define LED2_TOG PORTB ^= LED2<br /><br />#define LED1_DDR DDRB<br />#define LED2_DDR DDRB<br />#define LED3_DDR DDRB<br />#define PK1_DDR DDRB<br /><br />#define LED3_ON PORTC &amp;= ~LED3<br />#define LED3_OFF PORTC |= LED3<br />#define LED3_TOG PORTC ^= LED3<br />#define PK1_ON PORTC |= PK1<br />#define PK1_OFF PORTC &amp;= ~PK1<br />#define PK1_TOG PORTC ^= PK1<br /><br /><br /><br />uint8_t czujniki_cnt;/* ilość czujników na magistrali */<br />uint8_t subzero, cel, cel_fract_bits;<br />volatile uint8_t s1_flag;/* flaga tyknięcia timera co 1 sekundę */<br />volatile uint8_t sekundy;/* licznik sekund 0-59 */<br />volatile uint16_t Timer1, Timer2, Timer3, Timer4, Timer5;<br />uint8_t hist=2;<br /><br /><br />uint16_t pomiar_ADC (uint8_t kanal);<br />void termostat (uint8_t x);<br /><br />int main (void){<br /><br />ADMUX |=  (1 &lt;&lt; REFS0) | (1 &lt;&lt; REFS1);<br />ADCSRA |= (1 &lt;&lt; ADPS2) | (1 &lt;&lt; ADPS1);// preskaler przetwornika ADC 64.<br /><br /><br />TCCR0A |= (1 &lt;&lt; WGM01);// tryb CTC<br />TCCR0B |= (1 &lt;&lt; CS00) | (1 &lt;&lt; CS01);//preskaler 64<br />OCR0A |= 124;//przerwanie porównania co 1ms (1000Hz)<br />TIMSK0 |= (1 &lt;&lt; OCIE0A);//odblokowanie przerwania CompareMatch<br /><br />TCCR2A |= (1&lt;&lt;WGM21);// tryb pracy CTC<br />TCCR2A |= (1&lt;&lt;CS22);//|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);// preskaler = 64<br />OCR2A = 124;// przerwanie porównania co 1ms (1000Hz)<br />TIMSK2 |= (1&lt;&lt;OCIE2A);// Odblokowanie przerwania CompareMatch<br /><br />czujniki_cnt = search_sensors();<br /><br />sei();<br /><br />while(1){<br /><br />if(!Timer1){<br />Timer1=10;<br />pomiar_ADC(0);<br />if (!Timer2){<br />Timer2=200;<br />LED1_TOG;<br />}<br />}<br />if(!Timer3){<br />Timer3=1000;<br />if (Timer3 % 1) DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />if (!Timer3 % 2) if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;0&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) termostat (0);<br />}<br />if (!Timer4){<br />Timer4 = 100;<br />void termostat (uint8_t x);<br />}<br />}<br /><br />}<br /><br /><br />uint16_t pomiar_ADC (uint8_t kanal){<br /><br /><br />ADMUX = (ADMUX &amp; 0xF8) | kanal;<br />ADCSRA |= (1 &lt;&lt; ADSC);<br />while (ADCSRA &amp; (1 &lt;&lt; ADSC));<br />return ADCW;<br /><br /><br />}<br /><br /><br />void termostat (uint8_t x){<br /><br />         uint16_t adc = ADCW;<br />         if (cel &gt;=(30+(0.063476563*adc)+hist)) PK1_ON;<br />         if (PK1_ON == 1){<br />         if (cel &lt;= (30+(0.063476563*adc)-hist)) PK1_OFF;<br />         }<br />}<br /><br /><br />ISR(TIMER2_COMPA_vect)<br />{<br />uint16_t n;<br /><br />n = Timer1;/* 1000Hz Timer1 */<br />if (n) Timer1 = --n;<br />n = Timer2;/* 1000Hz Timer2 */<br />if (n) Timer2 = --n;<br />n = Timer3;/* 1000Hz Timer3 */<br />if (n) Timer3 = --n;<br />n = Timer4;/* 1000Hz Timer4 */<br />if (n) Timer4 = --n;<br />n = Timer5;/* 1000Hz Timer4 */<br />if (n) Timer5 = --n;<br />}[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 16 minutach ]</span></strong><br /><br />A co do Timera0 to będzie użyty do zliczenia roboczogodzin urządzenia na razie jest w trakcie pisania kodu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11226">Dawid.R</a> — 26 paź 2015, o 21:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[lutekT]]></name></author>
<updated>2015-10-26T21:09:26+01:00</updated>
<published>2015-10-26T21:09:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13354&amp;p=143433#p143433</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13354&amp;p=143433#p143433"/>
<title type="html"><![CDATA[Re: Pomoc ze skalowaniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13354&amp;p=143433#p143433"><![CDATA[
Do tego, co mówi matekogon dodałbym tylko, że unikałbym liczb typu float.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9279">lutekT</a> — 26 paź 2015, o 21:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Dawid.R]]></name></author>
<updated>2015-10-26T20:52:01+01:00</updated>
<published>2015-10-26T20:52:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13354&amp;p=143428#p143428</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13354&amp;p=143428#p143428"/>
<title type="html"><![CDATA[Re: Pomoc ze skalowaniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13354&amp;p=143428#p143428"><![CDATA[
<div class="quotetitle">matekogon napisał(a):</div><div class="quotecontent"><br />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ć<br /></div><br /><br />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:<br /><br />void termostat (uint8_t x){<br /><br />         uint16_t adc = ADCW;<br />         if (cel &gt;=(30+(0.063476563*adc)+hist)) PK1_ON;<br />         if (PK1_ON == 1){<br />         if (cel &lt;= (30+(0.063476563*adc)-hist)) PK1_OFF;<br />         }<br />}<br /><br />Chyba mniej więcej ma to tak działać prosta regulacja z histerezą. Jeśli coś nie tak proszę o korekte<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11226">Dawid.R</a> — 26 paź 2015, o 20:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matekogon]]></name></author>
<updated>2015-10-26T07:34:05+01:00</updated>
<published>2015-10-26T07:34:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13354&amp;p=143380#p143380</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13354&amp;p=143380#p143380"/>
<title type="html"><![CDATA[Re: Pomoc ze skalowaniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13354&amp;p=143380#p143380"><![CDATA[
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ć<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1380">matekogon</a> — 26 paź 2015, o 07:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Dawid.R]]></name></author>
<updated>2015-10-26T04:55:56+01:00</updated>
<published>2015-10-26T04:55:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13354&amp;p=143378#p143378</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13354&amp;p=143378#p143378"/>
<title type="html"><![CDATA[Re: Pomoc ze skalowaniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13354&amp;p=143378#p143378"><![CDATA[
<div class="quotetitle">jaman7 napisał(a):</div><div class="quotecontent"><br />DS18B20 nie jest analogowym czujnikiem<br /><!-- m --><a class="postlink" href="https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf" >https://datasheets.maximintegrated.com/ ... S18B20.pdf</a><!-- m --><br />czujnik analogowy np lm35,lm335 itp przez adc<br /><!-- m --><a class="postlink" href="http://www.ti.com/lit/ds/symlink/lm35.pdf" >http://www.ti.com/lit/ds/symlink/lm35.pdf</a><!-- m --><br /></div><br /><br />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=&gt;temp_celc=30 ADC=1023=&gt; temp_celc=95 by potem w warunku if porównywać wartość cel z wartością temp_cel np if (temp_celc =&gt; (celc+hist) )Pk1_ON; else Pk1_OFF; hist to histereza ustawiona programowo 2*C<br /><br />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.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11226">Dawid.R</a> — 26 paź 2015, o 04:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jaman7]]></name></author>
<updated>2015-10-26T03:05:28+01:00</updated>
<published>2015-10-26T03:05:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13354&amp;p=143377#p143377</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13354&amp;p=143377#p143377"/>
<title type="html"><![CDATA[Re: Pomoc ze skalowaniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13354&amp;p=143377#p143377"><![CDATA[
DS18B20 nie jest analogowym czujnikiem<br /><!-- m --><a class="postlink" href="https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf" >https://datasheets.maximintegrated.com/ ... S18B20.pdf</a><!-- m --><br />czujnik analogowy np lm35,lm335 itp przez adc<br /><!-- m --><a class="postlink" href="http://www.ti.com/lit/ds/symlink/lm35.pdf" >http://www.ti.com/lit/ds/symlink/lm35.pdf</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6459">jaman7</a> — 26 paź 2015, o 03:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Dawid.R]]></name></author>
<updated>2015-10-26T01:59:22+01:00</updated>
<published>2015-10-26T01:59:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13354&amp;p=143376#p143376</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13354&amp;p=143376#p143376"/>
<title type="html"><![CDATA[Pomoc ze skalowaniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13354&amp;p=143376#p143376"><![CDATA[
Witam wszystkich forumowiczów. Mam następujące banalne pytanie a raczej prośba o pomoc.<br /><br />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. <br />Jak ze skalować taki zakres pomiarowy. Procesor to ATmega88 8MHz napięcie 1,1V napięcie odniesienia.<br /><br />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.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11226">Dawid.R</a> — 26 paź 2015, o 01:59</p><hr />
]]></content>
</entry>
</feed>