<?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=8&amp;t=23542&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2021-01-17T21:55:44+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=23542&amp;mode</id>
<entry>
<author><name><![CDATA[antosV10]]></name></author>
<updated>2021-01-17T21:55:44+01:00</updated>
<published>2021-01-17T21:55:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230637#p230637</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230637#p230637"/>
<title type="html"><![CDATA[Re: Uśrednianie wyniku ADC [średnia arytmetyczna]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230637#p230637"><![CDATA[
No więc temperatury zgadzają się u mnie z napięciem i wyglądają podobnie tak jak napisałeś. Dlaczego tylko te liczby po przecinku to tylko 0, 2, 5, 7, 9.<br />Chciałbym po prostu, żeby pojawiały się też inne wartości, np. 6, 3, 1 itd... Próbowałem też napisać program od nowa, ale znowu się zatrzymałem na mierzeniu średniej innym sposobem, który przedstawiał Pan Kardaś w jednym swoich odcinków dotyczących ADC. Średnia krocząca też mi nie działa.<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;HD44780.h&quot;<br /><br />uint16_t adc_value;<br />char adc_buffer&#91;33&#93;;<br />char average_buffer&#91;33&#93;;<br /><br />void ADC_init(void);<br /><br />int main(void)<br />{<br />uint32_t average = 0;<br />uint8_t dt = 4;<br /><br />// Inits<br />LCD_Initalize();<br />ADC_init();<br /><br />DDRA &amp;= ~(1 &lt;&lt; PA5) | ~(1 &lt;&lt; PA6) | ~(1 &lt;&lt; PA4);<br /><br />    while (1) <br />    {<br />ADCSRA |= (1 &lt;&lt; ADSC);<br />while(ADCSRA &amp; (1 &lt;&lt; ADSC));<br /><br />_delay_us(250);<br /><br />adc_value = ADC;<br /><br />average = average * dt;<br />average = average + adc_value;<br />average = average / (dt+1);<br /><br />itoa(adc_value, adc_buffer, 10);<br />itoa(average, average_buffer, 10);<br /><br />LCD_Clear();<br />LCD_GoTo(4, 0);<br />LCD_WriteText(adc_buffer);<br />LCD_WriteText(&quot;/&quot;);<br />LCD_WriteText(average_buffer);<br />_delay_ms(500);<br />    }<br />}<br /><br />void ADC_init(void)<br />{<br />ADMUX |= (1 &lt;&lt; REFS1) | (1 &lt;&lt; REFS0); // Vref = 2.56V<br />ADMUX |= (1 &lt;&lt; MUX0) | (1 &lt;&lt; MUX2); // Pomiar na ADC5<br />ADCSRA |= (1 &lt;&lt; ADEN) | (1 &lt;&lt; ADPS0) | (1 &lt;&lt; ADPS1); // Włączenie ADC i preskaler = 64<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21647">antosV10</a> — 17 sty 2021, o 21:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Draxter32]]></name></author>
<updated>2021-01-17T16:10:17+01:00</updated>
<published>2021-01-17T16:10:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230629#p230629</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230629#p230629"/>
<title type="html"><![CDATA[Re: Uśrednianie wyniku ADC [średnia arytmetyczna]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230629#p230629"><![CDATA[
<div class="quotetitle">antosV10 napisał(a):</div><div class="quotecontent"><br />bo na LCD pokazują się bardzo duże i dodatkowo ujemne wartości.<br /></div><br />Konkretnie jakie to wartości?<br /><br />Przetestowałem algorytm &quot;na szybko&quot; u siebie. Poniżej wynik pomiarów i kod testujący:<br /><br /><strong>U[V]</strong>| <strong>T[°C]</strong><br />0.0000-50.000<br />0.2050-29.500<br />0.4045-9.250<br />0.7010+21.750<br />1.0000<strong>+52.250</strong><br />1.4002+93.750<br /><br /><a href="https://obrazkiforum.atnel.pl/8185/9805c24764cae72b6a7491df988c0f29.PNG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/8185/9805c24764cae72b6a7491df988c0f29.PNG" alt="Obrazek" /></a><br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 17 Jan 2021<br /> *      Author: <br /> */<br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;LCD/lcd44780.h&quot;<br /><br />#define VREF_DIVIDED 25<br /><br />uint16_t adc_value;<br />uint16_t voltage_value;<br />int16_t cz_d, cz_u;<br />int16_t temp;<br />int16_t values&#91;6&#93;;<br />int16_t counter = 0;<br />char decimal_buffer&#91;33&#93;;<br />char fraction_buffer&#91;33&#93;;<br />char buff&#91;8&#93;;<br /><br />float _voltage;<br />float _tempC;<br /><br />void ADC_init(void);<br />void ADC_test(void);<br /><br />int16_t average_adc(void);<br /><br />int main(void)<br />{<br />        // LCD init<br />lcd_init();// inicjalizacja LCD<br />lcd_cls();// wyczysc pole LCD<br /><br />        // ADC init<br />        ADC_init();<br /><br />        while (1)<br />        {<br />        ADC_test();<br />//                adc_value = average_adc();<br />//                _delay_ms(40);<br />//                voltage_value = ADC * VREF_DIVIDED;<br />//                temp = voltage_value / 10 - 500;<br />//                cz_d = temp/10;<br />//                cz_u = temp%10;<br />//<br />//                itoa(cz_d, decimal_buffer, 10);<br />//                itoa(cz_u, fraction_buffer, 10);<br />//                lcd_locate(0, 0);<br />//                lcd_str(&quot;Temperatura:&quot;);<br />//                lcd_locate(1, 0);<br />//                lcd_str(decimal_buffer);<br />//                lcd_str(&quot;.&quot;);<br />//                lcd_str(fraction_buffer);<br />                _delay_ms(500);<br />        }<br />}<br /><br />void ADC_init(void)<br />{<br />        DDRA &amp;= ~(1 &lt;&lt; PA5) | ~(1 &lt;&lt; PA6) | ~(1 &lt;&lt; PA4);<br />        ADMUX |= (1 &lt;&lt; REFS1) | (1 &lt;&lt; REFS0); // Vref = 2.56V<br />        ADMUX |= (1 &lt;&lt; MUX0) | (1 &lt;&lt; MUX2); // Pomiar na ADC5<br />        ADCSRA |= (1 &lt;&lt; ADEN) | (1 &lt;&lt; ADPS0) | (1 &lt;&lt; ADPS1); // Włączenie ADC i preskaler = 64<br />}<br /><br /><br />int16_t average_adc(void)<br />{<br />        ADCSRA |= (1 &lt;&lt; ADSC);<br />        while(ADCSRA &amp; (1 &lt;&lt; ADSC));<br /><br />        int16_t average = 0;<br />        values&#91;counter&#93; = ADC;<br />        if (counter &gt; 6)<br />        {<br />                counter = 0;<br />                for(int i = 0; i&lt;6; i++)<br />                {<br />                        average += values&#91;i&#93;;<br />                }<br /><br />                return average /= 6;<br />        }<br />        counter++;<br />}<br /><br />void ADC_test(void) {<br />ADCSRA |= (1 &lt;&lt; ADSC);<br />    while(ADCSRA &amp; (1 &lt;&lt; ADSC));<br /><br />    lcd_cls();<br />    lcd_locate(1, 0);<br /><br />    _voltage = (ADC/1024.0) * 2.56;<br />    _tempC = (_voltage - .5) * 100;<br />    char buffer&#91;10&#93;;<br />    dtostrf(_tempC, 5,3,buffer);<br />    lcd_str(buffer);<br />}[/syntax]<br /><br />Błąd pomiaru TMP36 jest na poziomie około ±2°C. Wynika z tego, że przy napięciu z czujnika Vout = 1.0000V, wartość temperatury powinna mieścić się w przedziale od +48.000 do +52.000°C<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8185">Draxter32</a> — 17 sty 2021, o 16:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[antosV10]]></name></author>
<updated>2021-01-17T14:16:06+01:00</updated>
<published>2021-01-17T14:16:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230627#p230627</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230627#p230627"/>
<title type="html"><![CDATA[Re: Uśrednianie wyniku ADC [średnia arytmetyczna]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230627#p230627"><![CDATA[
<div class="quotetitle">DarkMajster napisał(a):</div><div class="quotecontent"><br />Proponuję zacząć od początku. Czy adc w ogóle mierzy co powinien (wystarczy dotknąć raz do masy raz do vcc i odpowiedź powinna przyjść sama <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />)<br /></div><br /><br />Tak, ADC na pewno liczy to co powinno liczyć (sprawdzałem). Co do funkcji &quot;LCD_WriteText()&quot; to nie może ona wyświetlać liczb dlatego używam tutaj funkcji &quot;itoa()&quot;. Próbowałem też użyć &quot;średniej ciągniętej&quot; tak jak <a href="https://www.youtube.com/watch?v=LtLdMRGHa7A&amp;list=PLtXXWLsA5QNi_R9uDXpHRpo5hRnig_f23&amp;index=11&amp;t=2956s&amp;ab_channel=Atnel-mirekk36"  class="postlink">tutaj</a>. Zrobiłem dokładnie tak samo jak autor i dalej wyświetla mi się zaniżona wartość temperatury. Zerknie ktoś gdzie tu jest błąd? To rozwiązanie musi być dobre. Nie wiem dlaczego, ale jak chcę wyświetlić wartość ADC obliczoną ze średniej to nic się nie pokazuje.<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;HD44780.h&quot;<br /><br />#define VREF_DIVIDED 25<br />#define SIZE 16<br /><br />uint16_t adc_value;<br />uint16_t voltage_value;<br />int16_t cz_d, cz_u;<br />int16_t temp;<br />char decimal_buffer&#91;33&#93;;<br />char fraction_buffer&#91;33&#93;;<br /><br />void ADC_init(void);<br /><br />uint16_t measurement(uint8_t adc_channel);<br /><br />int main(void)<br />{<br />uint32_t average = 0;<br />uint8_t dt = 4;<br /><br />// LCD init<br />LCD_Initalize();<br /><br />// ADC init<br />ADC_init();<br /><br />while (1)<br />{<br />adc_value = measurement(PA5);<br />average *= dt;<br />average += adc_value;<br />average /= (dt+1); <br /><br />voltage_value = average * VREF_DIVIDED;<br />temp = voltage_value / 10 - 500;<br />cz_d = temp/10;<br />cz_u = temp%10;<br /><br />itoa(ADC, decimal_buffer, 10);<br />itoa(average, fraction_buffer, 10);<br />LCD_Clear();<br />LCD_GoTo(2, 0);<br />LCD_WriteText(&quot;Temperatura:&quot;);<br />LCD_GoTo(6, 1);<br />LCD_WriteText(decimal_buffer);<br />LCD_WriteText(&quot;.&quot;);<br />LCD_WriteText(fraction_buffer);<br />_delay_ms(500);<br />}<br />}<br /><br />void ADC_init(void)<br />{<br />DDRA &amp;= ~(1 &lt;&lt; PA5) | ~(1 &lt;&lt; PA6) | ~(1 &lt;&lt; PA4);<br />ADMUX |= (1 &lt;&lt; REFS1) | (1 &lt;&lt; REFS0); // Vref = 2.56V<br />ADCSRA |= (1 &lt;&lt; ADEN) | (1 &lt;&lt; ADPS0) | (1 &lt;&lt; ADPS1); // Włączenie ADC i preskaler = 64<br />}<br /><br />uint16_t measurement(uint8_t adc_channel)<br />{<br />ADMUX |= (ADMUX &amp; 0xF8) | adc_channel;<br /><br />ADCSRA |= (1 &lt;&lt; ADSC);<br />while(ADCSRA &amp; (1 &lt;&lt; ADSC));<br /><br />return ADC;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21647">antosV10</a> — 17 sty 2021, o 14:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[DarkMajster]]></name></author>
<updated>2021-01-17T12:47:30+01:00</updated>
<published>2021-01-17T12:47:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230624#p230624</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230624#p230624"/>
<title type="html"><![CDATA[Re: Uśrednianie wyniku ADC [średnia arytmetyczna]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230624#p230624"><![CDATA[
Proponuję zacząć od początku. Czy adc w ogóle mierzy co powinien (wystarczy dotknąć raz do masy raz do vcc i odpowiedź powinna przyjść sama <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />) oraz czy funkcją LCD_WriteText w ogóle możesz wyświetlać liczby <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17494">DarkMajster</a> — 17 sty 2021, o 12:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Draxter32]]></name></author>
<updated>2021-01-17T11:44:11+01:00</updated>
<published>2021-01-17T11:44:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230621#p230621</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230621#p230621"/>
<title type="html"><![CDATA[Re: Uśrednianie wyniku ADC [średnia arytmetyczna]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230621#p230621"><![CDATA[
<div class="quotetitle">jony15 napisał(a):</div><div class="quotecontent"><br />zamiast   values[counter] = ADC; nie powinno być  values[counter] = ADCW;<br /></div><br />ADC i ADCW dają tę samą funkcjonalność, łączą rejestry ADCL i ADCH. Odrębne nazwy powstały na potrzeby wykorzystania w asemblerze. Bowiem asembler obsługuje tylko ADCW.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8185">Draxter32</a> — 17 sty 2021, o 11:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jony15]]></name></author>
<updated>2021-01-17T10:16:49+01:00</updated>
<published>2021-01-17T10:16:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230619#p230619</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230619#p230619"/>
<title type="html"><![CDATA[Re: Uśrednianie wyniku ADC [średnia arytmetyczna]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230619#p230619"><![CDATA[
zamiast   values[counter] = ADC; nie powinno być  values[counter] = ADCW;<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2183">jony15</a> — 17 sty 2021, o 10:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[antosV10]]></name></author>
<updated>2021-01-16T16:31:18+01:00</updated>
<published>2021-01-16T16:31:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230615#p230615</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230615#p230615"/>
<title type="html"><![CDATA[Re: Uśrednianie wyniku ADC [średnia arytmetyczna]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230615#p230615"><![CDATA[
Hmm, nie działa <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21647">antosV10</a> — 16 sty 2021, o 16:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Draxter32]]></name></author>
<updated>2021-01-16T15:22:34+01:00</updated>
<published>2021-01-16T15:22:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230614#p230614</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230614#p230614"/>
<title type="html"><![CDATA[Re: Uśrednianie wyniku ADC [średnia arytmetyczna]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230614#p230614"><![CDATA[
Spróbuj wyczyścić buffor <em>values[]</em> po uśrednianiu. Np. funkcja <em>memset(values, '0', 6);</em><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8185">Draxter32</a> — 16 sty 2021, o 15:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[antosV10]]></name></author>
<updated>2021-01-16T11:52:32+01:00</updated>
<published>2021-01-16T11:52:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230611#p230611</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230611#p230611"/>
<title type="html"><![CDATA[Uśrednianie wyniku ADC [średnia arytmetyczna]]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23542&amp;p=230611#p230611"><![CDATA[
Witam, próbuję zrobić termometr z ATmegi32A-PU i czujnika temperatury TMP36. Mam problem przy uśrednianiu wartości ADC. Mój sposób polega na tym, że do 6 elementowej tablicy zapisuję kolejne wartości ADC, potem je sumuje i dzielę przez 6. Niestety po tych działaniach  wartość temperatury nie uśrednia mi się poprawnie, bo na LCD pokazują się bardzo duże i dodatkowo ujemne wartości. Czy mój pomysł jest dobry, a jeżeli tak to gdzie jest błąd w jego realizacji i co mam zmienić w kodzie? Czy może lepiej byłoby zbierać wyniki z ADC w przerwaniu timera, np. co 10ms, a potem w pętli głównej go uśredniać?<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;HD44780.h&quot;<br /><br />#define VREF_DIVIDED 25<br /><br />uint16_t adc_value;<br />uint16_t voltage_value;<br />int16_t cz_d, cz_u;<br />int16_t temp;<br />int16_t values&#91;6&#93;;<br />int16_t counter = 0;<br />char decimal_buffer&#91;33&#93;;<br />char fraction_buffer&#91;33&#93;;<br /><br />void ADC_init(void);<br /><br />int16_t average_adc(void);<br /><br />int main(void)<br />{<br />// LCD init<br />LCD_Initalize();<br /><br />// ADC init<br />ADC_init();<br /><br />while (1)<br />{<br />adc_value = average_adc();<br />_delay_ms(40);<br />voltage_value = adc_value * VREF_DIVIDED;<br />temp = voltage_value / 10 - 500;<br />cz_d = temp/10;<br />cz_u = temp%10;<br /><br />itoa(cz_d, decimal_buffer, 10);<br />itoa(cz_u, fraction_buffer, 10);<br />LCD_Clear();<br />LCD_GoTo(2, 0);<br />LCD_WriteText(&quot;Temperatura:&quot;);<br />LCD_GoTo(6, 1);<br />LCD_WriteText(decimal_buffer);<br />LCD_WriteText(&quot;.&quot;);<br />LCD_WriteText(fraction_buffer);<br />_delay_ms(500);<br />}<br />}<br /><br />void ADC_init(void)<br />{<br />DDRA &amp;= ~(1 &lt;&lt; PA5) | ~(1 &lt;&lt; PA6) | ~(1 &lt;&lt; PA4);<br />ADMUX |= (1 &lt;&lt; REFS1) | (1 &lt;&lt; REFS0); // Vref = 2.56V<br />ADMUX |= (1 &lt;&lt; MUX0) | (1 &lt;&lt; MUX2); // Pomiar na ADC5<br />ADCSRA |= (1 &lt;&lt; ADEN) | (1 &lt;&lt; ADPS0) | (1 &lt;&lt; ADPS1); // Włączenie ADC i preskaler = 64<br />}<br /><br /><br />int16_t average_adc(void)<br />{<br />ADCSRA |= (1 &lt;&lt; ADSC);<br />while(ADCSRA &amp; (1 &lt;&lt; ADSC));<br /><br />int16_t average = 0;<br />values&#91;counter&#93; = ADC;<br />if (counter &gt; 6)<br />{<br />counter = 0;<br />for(int i = 0; i&lt;6; i++)<br />{<br />average += values&#91;i&#93;;<br />}<br /><br />return average /= 6;<br />}<br />counter++;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21647">antosV10</a> — 16 sty 2021, o 11:52</p><hr />
]]></content>
</entry>
</feed>