RTV forum PL | NewsGroups PL

Algorytmy linearyzacji pomiarów dla procesorów AVR z dynamiczną tablicą punktów

Linearyzacja

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Algorytmy linearyzacji pomiarów dla procesorów AVR z dynamiczną tablicą punktów

Piotr Pitucha
Guest

Wed Sep 28, 2005 8:23 am   



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

Piotr Wyderski
Guest

Wed Sep 28, 2005 11:24 am   



Piotr Pitucha wrote:

Quote:
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.

Zadaj prosze to pytanie inaczej, bo ja nic nie rozumiem, a kilka pomysłów
będę pewnie miał. :-)

Pozdrawiam
Piotr Wyderski

Miłosz K.
Guest

Wed Sep 28, 2005 11:45 am   



Piotr Wyderski napisał(a):
Quote:
Piotr Pitucha wrote:


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.


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.


--
Miłosz Kłosowicz

------------------------------------------------
AVR : ISP,JTAG,moduły prototypowe (USB,CAN)
TYPO3: projekty, webhosting, sklepy internetowe
-> http://www.miklobit.com
------------------------------------------------

Piotr Pitucha
Guest

Wed Sep 28, 2005 12:12 pm   



Użytkownik "Piotr Wyderski" napisał w
wiadomości
Quote:
Piotr Pitucha wrote:
Zadaj prosze to pytanie inaczej, bo ja nic nie rozumiem, a kilka pomysłów
będę pewnie miał. :-)

Ależ proszę Smile

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

J.F.
Guest

Wed Sep 28, 2005 12:25 pm   



On Wed, 28 Sep 2005 11:23:20 +0200, Piotr Pitucha wrote:
Quote:
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

Hm - chyba jednak polecalbym aproksymacje odcinkami i tablice punktow.

Bo obliczanie wielomianow na 8-bitowcu to nie jest szczyt efektywnosci
:-)

J.

T.M.F.
Guest

Wed Sep 28, 2005 1:12 pm   



Quote:
Ależ proszę Smile
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...

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.


--
Inteligentny dom - http://idom.wizzard.one.pl
Teraz takze forum dyskusyjne
Zobacz, wyslij uwagi, dolacz sie do projektu.

Miłosz K.
Guest

Wed Sep 28, 2005 3:42 pm   



Piotr Pitucha napisał(a):

Quote:
Interesuje mnie algoryt dostępy do tablicy zapisanej w EEPROM, najchętniej
bez przeładowania jej do RAM...
Pozdrawiam


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));
------------------------------------------





--
Miłosz Kłosowicz

------------------------------------------------
AVR : ISP,JTAG,moduły prototypowe (USB,CAN)
TYPO3: projekty, webhosting, sklepy internetowe
-> http://www.miklobit.com
------------------------------------------------

Piotr
Guest

Wed Sep 28, 2005 4:48 pm   



Użytkownik "T.M.F." napisał w wiadomości

Quote:

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:)
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.

Quote:
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).
To jakiś pomysł, trochę komplikuje sprawę ale możnaby nawet zaprząc procesor

na etapie wprowadzania danych , bo wtedy czas mnie nie ogranicza

Quote:
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.
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ść Smile ), więc musze dokładnie to przemyśleć.
Dzięki za wskazówki Piotr

elektroda NewsGroups Forum Index - Elektronika Polska - Algorytmy linearyzacji pomiarów dla procesorów AVR z dynamiczną tablicą punktów

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map