Witam Szukam pomys³u na linearyzacjê pomiaru, tylko do¶æ specyficzn±, procesorek obrabia co¶ co z góry nie jest za³o¿one, powiedzmy ¿e mam kilkana¶cie punktów w tablicy i miêdzy nimi mierzê liniowo. Teraz problem, program wpisujê do procesora na sta³e a tablicê muszê w³adowaæ po fakcie, ilo¶æ i po³o¿enie punktów charakterystyki nie jest z góry okre¶lony, procesorek klasy ma³ego AVR, chodzi mi raczej o pomys³ na algorytm bêdê raczej programowa³ w czym¶ wysokiego poziomu. Z góry dziêkujê za pomys³y
Linearyzacja
Sep 28, 2005
7 Replies
Zadaj prosze to pytanie inaczej, bo ja nic nie rozumiem, a kilka pomys³ów bêdê pewnie mia³. :-)
Pozdrawiam Piotr Wyderski
Ja to rozumiem tak, że człowiek ma np. podłączony czujnik, którego każdy egzemplarz ma inną charakterystyke, która musi byc znana w momencie wykonania programu. Czyli albo zdejmujemy ją na zewnatrz i ładujemy do eepromomu zewnętrznym programatorem, albo np. program ma własną procedury do kalibracji i taka tabelkę sam sobie wpisuje do eepromu.
Ale¿ proszê :) mam na przyk³ad nieforemny otwarty baniak, badam ci¶nienie cieczy w baniaku a chcê okre¶laæ ilo¶æ cieczy w baniaku, czyli wk³adam ma³± tabelkê w której dla jakiego¶ ci¶nienia ( wysoko¶ci ) mam odpowiedni± objêto¶æ, je¶li zbiornik bardzo nieforemny to powiedzmy bêdê potrzebowa³ kilkana¶cie charakterystycznych punktów i odpowiadaj±c± im objêto¶æ, dla okr±g³ego stoj±cego baniaka zale¿no¶æ bêdzie liniowa, dla innego przypadku mo¿e to byæ
4 punkty... Chodzi mi o algorytm w którym tablica mo¿e mieæ ró¿n± d³ugo¶æci¶nienie objêto¶æ
1 100 1,15 148 2,34 225 ...... ...... ...... ...... itd x ? koniec tablicy ??W szczególnym przypadku mam tylko dwa wpisy dotycz±ce pocz±tku i koñca zakresu, przyk³ad ze zbiornikiem zupe³nie abstrakcyjny, ale obrazuje co chcê zrobiæ. Mierzymy np. 1,03 i przeliczamy 100+((148-100)*0,03)/015 Interesuje mnie algoryt dostêpy do tablicy zapisanej w EEPROM, najchêtniej bez prze³adowania jej do RAM... Pozdrawiam
Hm - chyba jednak polecalbym aproksymacje odcinkami i tablice punktow.
Bo obliczanie wielomianow na 8-bitowcu to nie jest szczyt efektywnosci :-)
J.
Ja bym to zrobil tak. Najpierw z odczytanym cisnieniem wchodzimy do tabeli zawierajacej dwa pola: cisnienie i objetosc. Nasze cisnienie porownujemy z kolejnymi elementami tabeli az do momentu, kiedy kolejna zapisana wartosc cisnienia w tabeli bedzie wieksza od zmierzonego cisnienia. W ten sposob wyznaczylismy dwa punkty - element o indeksie o
1 mniejszym [i-1] bedzie mial cisnienie mniejsze niz zmierzone, a element [i] bedzie mial cisnienie wieksze. Pomiedzy tymi elementami przeprowadzamy linearyzacje. A wiec wyznaczamy wspolczynnik kierunkowy rownania prostej a=(p[i]-p[i-1])/v[i]-v[i-1]. Teraz zmierzona objetosc rowna sie v[i-1]+a*(pzmierzone-p[i-1]) - zapewne da sie to uproscic, ale spiesze sie, wiec zostawiam to tobie:) Komplikujac nieco sama tabele mozna uniknac wyznaczania kolejnych wspolczynnikow a, czyli ominac dzielenie. Od biedy da sie to zrobic nawet za pomoca arytmetyki stalopozycyjnej (wykorzystujac tylko szybkie i zwiezle operacje na liczbach calkowitych). Oczywiscie ostatni element tablicy musi zawierac cisnienie wieksze niz max. mozliwe do zmierzenia, inaczej program sie wykrzaczy, a pierwszy cisnienie nanizsze mozliwe do zmierzenia, wzglednie 0. To jednoczesnie zapewnia ci zmienna ilosc elementow tablicy. Pozdrawiam, T.M.F.Piotr Pitucha napisał(a):
W avr-gcc mozna tak:
------------------------------------------ struct t_pomiar { double cisnienie; double objętosc; };
#define EEPROM __attribute__ ((section (".eeprom"))) EEPROM struct t_pomiar c_pomiary[]; struct t_pomiar v_pomiar;
/* odczyt danych z n-tego rekordu z tabeli */ eeprom_read_block( &v_pomiar, &c_pomiary[N], sizeof( struct t_pomiar)); /* zapis danych do n-tego rekordu w tabeli */ eeprom_write_block( &v_pomiar, &c_pomiary[N], sizeof( struct t_pomiar));
------------------------------------------
U¿ytkownik "T.M.F." snipped-for-privacy@nospam.mp.pl> napisa³ w wiadomo¶ci news: snipped-for-privacy@hermes.wizzard...
Koncepcja taka o jakiej my¶la³em, w miarê proste i jasne, ale ciemno¶æ je¶li chodzi o obrabianie tego, mo¿e mi brakn±æ RAMu aby to wsadziæ i szybko czytaæ, a przegl±danie tabeli czyli czytanie kilkunastu warto¶ci dwubajtowych z EEPROM mo¿e troche trwaæ, mo¿e przesadzam ale z pewno¶ci± to najbardziej czasoch³onny element programu jeszcze jak bêdzie w pêtli to kaszana. Nie wiem jak efektywnie UNTIL przet³umaczy siê na Asemblera, bo to chyba bêdzie najwygodniejszy sposób na czytanie tablicy o nieznanych rozmiarach, jak siê nie uda to bêdê musia³ do³o¿yæ ze 20 na procesorek z du¿ym RAMem i wtedy problemy czasowe mnie nie bêd± gryz³y.
To jaki¶ pomys³, trochê komplikuje sprawê ale mo¿naby nawet zaprz±c procesor na etapie wprowadzania danych , bo wtedy czas mnie nie ogranicza
Pocz±tek jest prosty, ka¿da tablica bêdzie mia³a conajmniej 2 linie wpisów, pocz±tek i koniec charakterystyki, ze stwierdzeniem koñca bêdzie gorzej, w specyficznych warunkach wartosci obrabiane bêd± mog³y byæ nawet ujemne ( oczywi¶cie nie objêto¶æ :) ), wiêc musze dok³adnie to przemy¶leæ. Dziêki za wskazówki Piotr
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required