Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

procedura uśrednienia próbek z kompaktora - Bascom - jak ?

olo_3
-
-
Posty: 27
Rejestracja: 20 gru 2009, o 17:21
Lokalizacja: EU

procedura uśrednienia próbek z kompaktora - Bascom - jak ?

Postautor: olo_3 » 12 cze 2010, o 11:37

jak napisać w Bascomie procedurę pobrania 10ciu próbek (z jednego ADC(0)) by odrzucić 5 skrajnych, wybrać 5 środkowych wartości i policzyć z nich średnia - możne ktoś podpowiedzieć ?

z góry dziękuje

Awatar użytkownika
Darlington
-
-
Posty: 574
Rejestracja: 12 lis 2007, o 18:18
Lokalizacja: stąd!

Postautor: Darlington » 12 cze 2010, o 11:45

Możesz zrobić też cyfrowy filtr uśredniający FIR, np. y(n) = 1/5 * (x(n) + x(n-1) + x(n-2) + x(n-3) + x(n-4))

olo_3
-
-
Posty: 27
Rejestracja: 20 gru 2009, o 17:21
Lokalizacja: EU

Postautor: olo_3 » 12 cze 2010, o 12:02

zapewne kolega ma racje,
ale ten wzór w przypadku baskoma wprowadzi wiele dodatkowych zmiennych i sporo linijek kodu (bo trzeba będzie go rozpisać na człony).

są jeszcze jakieś inne propozycje ?

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2653
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Postautor: pajaczek » 12 cze 2010, o 12:02

olo_3, Trochę to skomplikowałeś, bo co znaczy 5 skrajnych?? 5 najwyższych/najniższych, czy 2 od góry/3 od dołu, 3 od dołu/2 od góry? 5 najbardziej odległych od przewidywań (tylko co przewidujemy, może od wstępnej średniej?).
Sprecyzuj.

A czy nie może być średniej ze wszystkich próbek?

olo_3
-
-
Posty: 27
Rejestracja: 20 gru 2009, o 17:21
Lokalizacja: EU

Postautor: olo_3 » 12 cze 2010, o 12:08

pajaczek,
nie średnia ze wszystkich nie możne być (mam tak i nie jestem zadowolony).

pisząc odrzucić skrajne mam na myśli ze:
mamy np. 12 pomiarów i chcemy wybrać 6 środkowe czyli ignorujemy najwyższe wartości i najniższe, wybieramy ze środka "skali" (czyli pomiarów) i je dopiero dzielimy w tym wypadku przez 6.
czyli sprawdzamy kolejne pomiary, sortujemy je i odrzucamy (np. od największej do najniższej ) i w tym przykładzie odrzucamy 3 największe i 3 najniższe zostają nam 6 środkowych (nazwijmy je optymalne) z których dopiero policzymy średnia.

- mam nadzieje ze teraz jaśniej napisałem

Awatar użytkownika
pikczu
-
-
Posty: 89
Rejestracja: 5 paź 2003, o 19:55
Lokalizacja: Dublin
Kontaktowanie:

Postautor: pikczu » 12 cze 2010, o 13:58

Witam
Wydaje mi się bez sensu wybieranie tylko środkowych lepiej to dodać podzilić przez ilość.

Kod: Zaznacz cały

For Channel = 0 To 1 Przetwornik = 0 Przetwornik = Getadc(channel) 'pierwszy i drugi pomiar pomijamy Przetwornik = Getadc(channel) Przetwornik = 0 Przetwornik = Przetwornik + Getadc(channel) 'pomiar Przetwornik = Przetwornik + Getadc(channel) Przetwornik = Przetwornik + Getadc(channel) Shift Przetwornik , Right , 4
Ewentulnie jesli tak bardzo Ci na tym zależy zrobic tablicę z miejscem na 10 czy 12 pomiarów dim Pomiar(12) as word.
Potem tylko wybrać odpowienie miesjca z tablicy.
jakaś zmienna= pomiar(3)+pomiar(4)+pomiar(5)+pomiar(6)+pomiar(7) itd a potem podzielić.
Zamiast dzielic możesz użyć shift mniej obciąża procesor a efekt ten sam.

Ewentualnie opcja nr 3 to użyc tablicy i min i max

Kod: Zaznacz cały

'----------------------------------------------------------------------------------------- 'name : minmax.bas 'copyright : (c) 1995-2005, MCS Electronics 'purpose : show the MIN and MAX functions 'micro : Mega48 'suited for demo : yes 'commercial addon needed : no '----------------------------------------------------------------------------------------- $regfile = "m48def.dat" ' specify the used micro $crystal = 4000000 ' used crystal frequency $baud = 19200 ' use baud rate $hwstack = 32 ' default use 32 for the hardware stack $swstack = 10 ' default use 10 for the SW stack $framesize = 40 ' default use 40 for the frame space ' These functions only works on BYTE and WORD arrays at the moment !!!!! 'Dim some variables Dim Wb As Byte , B As Byte Dim W(10) As Word ' or use a BYTE array 'fill the word array with values from 1 to 10 For B = 1 To 10 W(b) = B Next Print "Max number " ; Max(w(1)) Print "Min number " ; Min(w(1)) Dim Idx As Word , M1 As Word Min(w(1) , M1 , Idx) Print "Min number " ; M1 ; " index " ; Idx Max(w(1) , M1 , Idx) Print "Max number " ; M1 ; " index " ; Idx End
Wtedy będziesz mógł uzyskać wartość maxymalna i index gdzie ta wartośś jest zapisana.

olo_3
-
-
Posty: 27
Rejestracja: 20 gru 2009, o 17:21
Lokalizacja: EU

Postautor: olo_3 » 12 cze 2010, o 14:46

pikczu,

BARDZO ładnie opracowane - serdecznie dziękuje.

Awatar użytkownika
pikczu
-
-
Posty: 89
Rejestracja: 5 paź 2003, o 19:55
Lokalizacja: Dublin
Kontaktowanie:

Postautor: pikczu » 12 cze 2010, o 20:27

To min i max to był przykład z helpa.
Albertsowi z MCS Electronics podziękuj ja to tylko przekleiłem.

olo_3
-
-
Posty: 27
Rejestracja: 20 gru 2009, o 17:21
Lokalizacja: EU

Postautor: olo_3 » 13 cze 2010, o 02:10

tak, wiem, ale bardziej chodziło mi o Twoja prace i zaangażowanie.

a w temacie,
wytłumacz mi dlaczego funkcja:

Kod: Zaznacz cały

$regfile = "m16def.dat" $crystal = 16000000 Config Adc = Single , Prescaler = Auto , Reference = internal Dim Wart_ac1 as Word Wart_ac1 = Getadc(0)
zwraca w przypadku zwarcia do GND wartość 130 a przy 5V - 900 ?? - według mnie powinna dać 0/1023

Awatar użytkownika
pikczu
-
-
Posty: 89
Rejestracja: 5 paź 2003, o 19:55
Lokalizacja: Dublin
Kontaktowanie:

Postautor: pikczu » 13 cze 2010, o 13:04

Zobacz tu:http://www.pg.gda.pl/~zbczaja/pdf/atmega16mmr.pdf
strona 39 na dole.
Masz wybrane wewnętrzne zródło napięcia odniesienia 2.56V
Hmm choć po przeliczniu 2.56v/1023=0.0025024437927664 jednostek
I teraz 900*0.0025024437927664=2.252199413489736 wychodiz dziwnie nie 2.56V
Coś jest nie tak pokaz schemat jak możesz.

olo_3
-
-
Posty: 27
Rejestracja: 20 gru 2009, o 17:21
Lokalizacja: EU

Postautor: olo_3 » 13 cze 2010, o 14:36

nie mam (jeszcze) .sch bo mam to na płycie rozwojowej.
a adc do gnd lub vcc, zasilania stabilne, dobrze filtrowane i do tego z zasilacza lab.
bez różnicy jakie ma napięcie ref (podawałem mu już ref=5V, 2,56V (filtrowane)) zawsze to samo.

olo_3
-
-
Posty: 27
Rejestracja: 20 gru 2009, o 17:21
Lokalizacja: EU

Postautor: olo_3 » 13 cze 2010, o 14:37

ps.
link nie działa
ponadto z tym 900 to różnie możne być weź pod uwagę GND =130 (+-1)

Awatar użytkownika
pikczu
-
-
Posty: 89
Rejestracja: 5 paź 2003, o 19:55
Lokalizacja: Dublin
Kontaktowanie:

Postautor: pikczu » 13 cze 2010, o 17:28

Dziwne nigdy nie miałem takiego przypadku.
Spróbuj wybrać inne ustawienie w config adc nie internal
help mówi że:
'The prescaler divides the internal clock by 2,4,8,16,32,64 or 128
'Because the ADC needs a clock from 50-200 KHz
'The AUTO feature, will select the highest clockrate possible
Spróbuj na niższej częstotliwości daj inny kwarc lub zmien fusy na wewnętrzny 8Mhz.

Link działa tylko wklej w google to jest polski PDF do mega16.

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2653
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Postautor: pajaczek » 13 cze 2010, o 19:30

Masz coś przed ADC? Bo wygląda to jak przepuszczone przez WO który nie jest rail2rail.

Awatar użytkownika
pikczu
-
-
Posty: 89
Rejestracja: 5 paź 2003, o 19:55
Lokalizacja: Dublin
Kontaktowanie:

Postautor: pikczu » 13 cze 2010, o 19:40

Jestem bardzo ciekaw co to.
Nie mam pojęcia co jest źle, wygląda na to jak by sie wlaśnie coś dostawalo na wejście adc.

olo_3
-
-
Posty: 27
Rejestracja: 20 gru 2009, o 17:21
Lokalizacja: EU

Postautor: olo_3 » 13 cze 2010, o 20:09

nie ma nic przed
pin adc0 jest podpięty od GND lub VCC lub przez poti - wszystko w celach testowych.
przerzucę ten program na m128 i zobaczę co będzie, bo na dwóch m16 wychodzi to samo.

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości