Převedení hodnot z analogRead na napětí

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Tomas Z
Příspěvky: 12
Registrován: 26 led 2018, 09:37

Převedení hodnot z analogRead na napětí

Příspěvek od Tomas Z » 06 úno 2018, 13:31

Mohl bych opět prosím poprosit o radu a vysvětlení? Popřípadě nasměrování, kde bych se mohl dočíst?

Zkoušel jsem si toto zapojení.
http://navody.arduino-shop.cz/arduino-p ... pleji.html

Nerozumím v kodu těmto hodnotám:
float voltage = (sensorVal / 1024.0) * 5.0;
float temperature = (voltage - 0.5) * 100.0;

To se hodnota načtená v proměnné sensorVal dělí 1024.0 a následně celé násobí hodnotou 5.0? Proč je tam ještě x.0? Nebo to číslo např. /1024.0 má nějaký jiný význam?
A to samé v druhém řádku.

Můžete mi to prosím aspoň trochu někdo popsat?
Moc děkuji

jankop
Příspěvky: 1057
Registrován: 06 zář 2017, 20:04
Bydliště: Brno
Kontaktovat uživatele:

Re: Přetečení funkce analogWrite, funkce map

Příspěvek od jankop » 06 úno 2018, 14:25

1. Ta desetinná místa nemají rozumné opodstatnění, jedině že autor chtěl zdůraznit, že se jedná o reálná čísla.

Ten první vztah vyjadřuje napětí získané 10 bitovým AD převodníkem s referenčním napětím 5V.
Vem si příklad, kdy na vstupu převodníku je 0,75V což odpovídá hodnotě 154, kterou mi převodník vrátí.
Pak 154 / 1024 * 5V = 0,75V

Druhý vztah vychází z datasheetu obvodu TMP36. Ten dáva při 25 stupních Celsia 750mV se strmostí 10mV/K.
Když dosadíš float temperature = (0,75V - 0,5V) *100 = 25 stupňů.
To napětí 0,5V vyjadřuje offset do 0 stupňů a ta hodnota 100 vznikla z toho, že jeden stupeň udělá změnu jednu setinu voltu

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Kontaktovat uživatele:

Re: Přetečení funkce analogWrite, funkce map

Příspěvek od petan » 06 úno 2018, 14:30

Mrkni sem: https://www.arduino.cc/reference/en/lan ... pes/float/

Podle popisu, pokud používáš float, měl by si přidat desetinné místo. Ale abych řekl pravdu, doteď jsem to nějak zvlášť neřešil. Častěji používám integer.

jankop
Příspěvky: 1057
Registrován: 06 zář 2017, 20:04
Bydliště: Brno
Kontaktovat uživatele:

Re: Přetečení funkce analogWrite, funkce map

Příspěvek od jankop » 06 úno 2018, 14:50

Ano, vypadá to tak, že ve Wiringu by se měly rozlišovat konstanty integer a float přidáním desetiné tečky a nuly. Zatím jsem tak nečinil, ale specifikace je specifikace.

ArduXPP
Příspěvky: 361
Registrován: 14 pro 2017, 19:31
Kontaktovat uživatele:

Re: Přetečení funkce analogWrite, funkce map

Příspěvek od ArduXPP » 06 úno 2018, 15:35

Nemá tam být 1023 ?

Tomas Z
Příspěvky: 12
Registrován: 26 led 2018, 09:37

Re: Přetečení funkce analogWrite, funkce map

Příspěvek od Tomas Z » 06 úno 2018, 19:12

Moc všem díky, hlavně Jankop za podrobný popis. Teď už vím, co uvedené hodnoty znamenají a co a jak se počíta.
Díky

zbysek
Site Admin
Příspěvky: 125
Registrován: 22 úno 2017, 15:18

Re: Přetečení funkce analogWrite, funkce map

Příspěvek od zbysek » 07 úno 2018, 10:35

jankop píše:
06 úno 2018, 14:25
1. Ta desetinná místa nemají rozumné opodstatnění, jedině že autor chtěl zdůraznit, že se jedná o reálná čísla.
To není pravda.

C++ se kouká na to, jakého datového typu operandy jsou a podle toho se chovají i výsledky operací.
Například:
  • int op int -> int
  • float op float -> float
  • float op int -> float
  • int op float -> float
Kde op je +, -, *, /


100 / 1024 je sice matematicky cca 0.1, ale jelikož jsou oba operandy integer dojde k zaokrouhlení k 0, protože i výsledek musí být integer
stejný případ by byl s sensorVal / 1024, protože sensorVal je integer

pokud bychom tedy zapsali:

Kód: Vybrat vše

float voltage = (sensorVal / 1024) * 5;
tak výsledek bude 0 pro sensorVal z intervalu <0; 511> a 5 pro sensorVal z intervalu <512; 1023>

musíme tedy napsat alespoň:

Kód: Vybrat vše

float voltage = (sensorVal / 1024.0) * 5;
potom se bude chovat vše dle očekávání

jankop
Příspěvky: 1057
Registrován: 06 zář 2017, 20:04
Bydliště: Brno
Kontaktovat uživatele:

Re: Přetečení funkce analogWrite, funkce map

Příspěvek od jankop » 07 úno 2018, 12:22

Máš pravdu, ale já jsem svůj názor již předtím korigoval.

zbysek
Site Admin
Příspěvky: 125
Registrován: 22 úno 2017, 15:18

Re: Přetečení funkce analogWrite, funkce map

Příspěvek od zbysek » 07 úno 2018, 15:45

Jasný, ale chtěl jsem vysvětlit proč to tak musí být :)
Jestli to vyznělo jako útok, tak se omlouvám.

jankop
Příspěvky: 1057
Registrován: 06 zář 2017, 20:04
Bydliště: Brno
Kontaktovat uživatele:

Re: Přetečení funkce analogWrite, funkce map

Příspěvek od jankop » 07 úno 2018, 16:00

Nemám problém, naopak. Ověřil jsem si, že nerespektování reálných konstant může přinést za určitých podmínek docela velké problémy, nelenil jsem a hned jsem u sebe udělal nějaké opravy.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host