Konverze výstupu čidla SHT71 - výpočet relativní vlhkosti

Ahoj,
mám takovy problem. Zprovoznil jsem cidlo SHT71 jenz meri relativní vlhkost. Vystup cidla je ve 2B (konkretne informace o relativni vlhkosti je obsazena v 12bitech ). Problem je ten, ze hodnota z techto 2B se musi prepocitat na hodnotu relativni vlhkost pomoci nasledujici formule:

RH(%)=c1VYSTUPSHT+c2VYSTUPSHT+c3VYSTUPSHTVYSTUPSHT,

c1=-2,0468
c2=0,0367
c3=-1.5955E-6

Program pisi v ASM a nechci prechazet na vyssi programovaci jazyk. Cidlo spojuji s mikrokotnrolerem AT89s2051.

Nevim, jak vyresit pocitani s desetinnymi cisly, napriklad s konstantou c1 bych nejdrive udelal to, ze bych zapsal cislo -204 a to vydelil 100. Tato metoda se mi ale zda dosti nepresna a pro c2 a c3 nepouzitelna. Muzete mi prosim nekdo poradit?

Moc diky…

:arrow_right: administrator: přesunuto z "Microchip"

:arrow_right: administrator: přejmenováno z "Converse vystupu cidla SHT71"

Koukám do pdfka, a vidím konstanty: -4, 0.0405, -2.8e-6, ale hlavně ta rovnice se mi nezdála - 2 konstanty s neznámou stejnýho řádu nemají smysl. Není ta rovnice RH(%)=c1+c2VYSTUPSHT+c3VYSTUPSHT*VYSTUPSHT ? :wink:
Opravdu potřebuješ takovou přesnost, že musíš převodní charakteristiku linearizovat? Zas tak drastický odchylky to mít nebude.
Každopádně jesli to chceš přepočítávat, prováděj výpočty ve 32 bitech. Všechny konstanty použij vynásobené 2^23 a konečný výsledek posuň doprava o 23b. Snad by to mělo být.

Co dělá to téma v “Microchip”, když jde o x51 a ještě k tomu atmeláckou? :unamused:

s PICem jsem to v ASM počítal takto: s-o.webnode.cz/rvtg

Čau,
mrkni se na tydle stránky a měl bys to poměrně snadno vyřešit, násobení konstantou není problém, to ti vygeneruje přímo první stránka, potom se mrkni na tu druhou, kde bys měl dohledat zbytek.
techref.massmind.org/techref/pic … divmul.htm
piclist.com/techref/microchip/math/basic.htm

Téma je blbě zařazeno - nejde o PIC.

Velmi se omlouvám za nezařazení tématu. Ano, v rovnici jsem se spletl. Konstanty, které zde uváfíš jsou pro čidlo SHT11, já používám vývodovou verzi SHT71 a v datasheetu jsou konstanty výše uvedené.

Pořád ale nechápu jak zapsat v 8 bitech desetinné číslo, respektive jak ho vytvořit. Metodu, jenz jsem popisoval je nesmyslna, pze AT89s2051 deli jen celociselne. Muzes(te) mi prosim poradit konkretne, jak vytvorit konstantu napriklad 0,0367?Princip musi byt prece v posouvani desetinne carky ne?

Ano mas pravdu, nepotreboval bych az takovou presnost, ale kdyz uz to delam, chtel bych tomu prijit na kloub. Moc vám všem dekuju za jakoukoliv radu.

Diky mrknu na to.

Konstanty vynásobíš 2^23 (8 388 608).
c1=2,0468*2^23 => 17 169 803 (desetin. část zahodíš - je zanedbatelná vzhledem k velikosti čísla). To samé s ostatníma konstantama a výpočty pak provádíš celočíselně. Na konci posuneš onen 32-bitový výsledek o 23 bitů doprava. Nejnižší byte je hledaná hodnota.

edit: Tak už jsem narazil za zakopanýho psa u koeficientů (jsou pro oba senzory stejný). Záleží, jesli máš koeficienty pro senzor V3 nebo V4. Ty tvoje jsou novější, “optimalizované”. Měly by však platit i ty stré (je tam jiný poměr, ale ve výsledku se to může v určitém rozsahu hodně podobat).
alldatasheet.com/datasheet-p … SHT71.html str.7/8

Takze postup je nasledujici? c1=2,0468*2^23 => 17 169 803 => ulozim do ctyr 1B promennych=> pronasobim jednotlive BAJTY s odpovidajici hodnotou cidla => vydelim 2^23 => vezmu nejnizsi bajt. To bude s timhle 8b procesorem trochu zdlouhavy, ale melo by to byt spravne, je tak?

Diky mnohokrat…

:arrow_right: administrator: příspěvek byl upraven
Předchozí příspěvky se necitují.

Poslední příspěvky se necitují :wink:

Přibližně tak, ale ten výpočet musí projít ve 32 bitech celý (včetně součtu a násobení s ostatníma konstantama). Nejde jen o pronásobení jednotlivých bytů. Je to vícebytová aritmetika - doufám, že víš, že násobení vícebytového čísla konstantou není jen vynásobení jednotlivých bytů konstantou!
Zdlouhavé to rozhodně bude, o tom žádná (obzvlášť jesli nevíš jak na to) :wink: Pokud chceš ovšem ten výpočet celý, tak jinou možnost nemáš (teda krom toho, že by sis to napsal ve float :smiley:).
Kdyby ti stačila jen základní přesnost bez linearizace, bylo by to mnohem jednodušší. O C ani nemluvě.

Pardon, uz se to nestane:-)

v podstate ted uz hledam co nejjednodussi reseni prevodu tohoto udaje :slight_smile:. Cely program pisi v ASM v programu KEIL uvision2. Zkousel sem vsak napsat C funkci a vlozit ji do ASM kodu, nejak mi to ale nejde. Nevim jak se propojuji promenne atd. Pravdou je, ze v cecku je to mnohem snazsi.

Linearizací myslis uzití konstant c1,c2 a c3? Zakladni presnost = Nepouziti konstanty c3?

C funkci do asm vložíš těžko. Lze v kládat asm do C, ale opačně jsem o tom ještě neslyšel :smiley:
Ta základní přesnost je vpodstatě jen konstanta C2 a celá operace upravená pro celočíselný výpočet.

a keby si z cecka vygenervoal asm…mozno ze zlozistos tby nebola neuveritelne zlozita a so by to napisat do ludskeho asm

Tak ono celočíselný 4B násobení zas tak neuvěřitelně složitý není. Pár součinů, pár součtů a je to :slight_smile:. Zvlášť když víš, že se výsledek do 4B vejde (proto 2^23).
Rutiny pro 32b * 16b unsigned se dají na netu určitě najít.

myslim ze:

ludske asm = C

:slight_smile:

lebo ako moj stary znamy hovoril:" mudre a pekne dievca neexistuje, lebo mudre a pekne dievca je uz chlapec"

Nakonec jsem nasel tuhle matematickou knihovnu, myslite, ze by mohla pomoct?

dhservis.cz/rutiny_soubory/fpmath.htm

Sam bych to asi napsat nedokazal…Nemuzu na to prijit…

Tohle je float. Najdi si spíš celočíselnou, bude to jednodušší.

Třeba tu: 8051projects.net/downloads47.html
V souboru MATH32.INC je rutina “Mul_16”: 32b * 16b.

Supr, uz to nasobi, ted mam vysledne cislo obrovske a uz jen posunout 23x doprava, nebo vydelit 2^23.Snazsi asi bude rotovat 23x doprava, jen musim prijit na to, jak to udelat ve 4 bytech…

Rozhodně jednodušší bude posun :smiley:
Způsob: rotace přes C.

Optimalizace:
Když se nad tím zamyslíš, zjistíš, že vpodstatě tě zajímá jen nejvyšší byte a 1 bit z nižšího. Spodní 2B tím posunem zahodíš. Jelikož je výsledek číslo 0-100, tak v nejvyšším bytu je z výsledku 7b a osmý je níže. Když provedeš rotaci doleva 3. bytu přes C, posuneš onen bit do C. Když hned na to provedeš tu samou rotaci s nejvyšším bytem, ten bit v C se ti tam zapíše. A máš hotovo. V nejvyšším byte je výsledek a ostatní tě nezajímá :wink:.

edit: ještě jsem přešel výpočet a vejdeš se do 32b (4B) i když pro násobení použiješ místo 2^23 číslo 2^24 (nejdřív C2*hodnota, pak odečíst zbytek vzorce). V tom případě nemusíš nic posouvat a výsledek je rovnou nejvyšší byte.

Ano diky moc, take me to napadlo, ze se vejdu s prehledem, ikdyz to vynasobim 2^24. Cidlo uz na LCD ukazuje 58%. Zmenil jsem tedy jen konstantu a uz si beru jen posledni byte. zda se mi to jednodussi:-)V horni polovine stupnice vsak pomerne dost narusta chyba(ve 100% je chyba temer 12%)
Predpokladam, ze kdybych chtel zapojit jeste konstantu c3 musel bych udelat to same. c32^24=-26,76 pronasobit s udajem a opet vydelit 2^24…V tomto pripade by to nejvyssi cislo mohlo byt ~273300=89100, takze bych musel ulozit cislo to 3 byte a to pote pronasobit s jednim bajtem. Je to tak?

Jinak moc dekuju za tvou trpelivost, bez tebe bych nad tim marne sedel jeste par dni navic…