Stránka 1 z 2
Převedení hodnot z analogRead na napětí
Napsal: 06 úno 2018, 13:31
od Tomas Z
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
Re: Přetečení funkce analogWrite, funkce map
Napsal: 06 úno 2018, 14:25
od jankop
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
Re: Přetečení funkce analogWrite, funkce map
Napsal: 06 úno 2018, 14:30
od petan
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.
Re: Přetečení funkce analogWrite, funkce map
Napsal: 06 úno 2018, 14:50
od jankop
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.
Re: Přetečení funkce analogWrite, funkce map
Napsal: 06 úno 2018, 15:35
od ArduXPP
Nemá tam být 1023 ?
Re: Přetečení funkce analogWrite, funkce map
Napsal: 06 úno 2018, 19:12
od Tomas Z
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
Re: Přetečení funkce analogWrite, funkce map
Napsal: 07 úno 2018, 10:35
od zbysek
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:
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í
Re: Přetečení funkce analogWrite, funkce map
Napsal: 07 úno 2018, 12:22
od jankop
Máš pravdu, ale já jsem svůj názor již předtím korigoval.
Re: Přetečení funkce analogWrite, funkce map
Napsal: 07 úno 2018, 15:45
od zbysek
Jasný, ale chtěl jsem vysvětlit proč to tak musí být

Jestli to vyznělo jako útok, tak se omlouvám.
Re: Přetečení funkce analogWrite, funkce map
Napsal: 07 úno 2018, 16:00
od jankop
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.