instrukcja - Politechnika Warszawska

Transkrypt

instrukcja - Politechnika Warszawska
Politechnika Warszawska
Wydział Elektryczny
Laboratorium Podstaw Techniki Mikroprocesorowej
Skrypt do ćwiczenia M.39
Obliczanie wartości średniej oraz amplitudy z próbek sygnału
- asembler
1.Część teoretyczna
Jednym ze sposób obliczania amplitudy jest metoda uśredniania. Zakładając, Ŝe mamy
dane próbki składowej podstawowej sygnału przedstawione równaniem
x1 (n) = X 1m cos(nΩ1 + ϕ1 )
(3.1)
gdzie:
Ω1 = ω1T p = 2π
Tp
T1
=
2π
N1
(3.2)
gdzie N 1 - liczba próbek w okresie sygnału.
Poprzez uśrednienie wartości bezwzględnej dla przedziału czasowego, będącego
wielokrotnością półokresu sygnału, otrzymujemy amplitudę tego sygnału. Dla danego
przykładu naleŜy obliczyć sumy dyskretne z dostępnych próbek. Wartość tych sum nie
jest uzaleŜniona tylko od amplitudy sygnału, lecz równieŜ od chwili, w jakiej rozpoczęło
się próbkowanie sygnału, a dokładniej od czasu pomiędzy startem przetwarzania i
przejściem sygnału przez zero. Maksymalna wartość tego czasu maleje wraz ze wzrostem
częstotliwości próbkowania sygnału. Aby uzyskać symetryzację obliczonych sum trzeba
załoŜyć wartość średnią współczynnika, który jest skojarzony z obliczaną sumą. Dla sumy
obliczanej z połowy okresu otrzymuje się
N1 / 2 −1
∑ x ( n) = S
1
av
X 1m
(3.3)
n =0
gdzie:
 π 

S av = 0,5ctg 
 2 N1 
(3.4)
Uwzględniając te załoŜenia obliczenie amplitudy moŜe odbyć moŜe odbyć się w
następujący sposób
 π  N1 / 2−1
 ∑ x1 (n)
X 1m = 2tg 
 2 N 1  n =0
(3.5)
Pojawienie się błędu pomiarowego, związanego z przypadkowym czasem
próbkowania, powodującego wahania obliczonej wartości sumy, zaleŜy od ilości próbek w
jednym okresie sygnału, czyli w efekcie od częstotliwości próbkowania sygnału. Czym
większa częstotliwość próbkowania, tym mniejszy błąd pomiaru. W związku z tym, jeŜeli
częstotliwość próbkowania będzie dostatecznie duŜa to moŜna załoŜyć następujące
równanie będzie prawdziwe
X 1m =
π
N1 / 2 −1
N1
n =0
∑ x ( n)
1
Obliczenia amplitudy w programach zostały wykonane zgodnie ze wzorem (3.6).
(3.6)
1.1. Program obliczający wartość średnią oraz amplitudę (asembler)
Opisany w tym rozdziale kod znajduje się w katalogu „asm\pr1 - obl sr i ampl\1.asm”.
Zadaniem tego programu jest obliczanie wartości średniej oraz amplitudy jednego z
dwóch sygnałów podawanych na wejście analogowe 0 oraz 1 kontrolera DSM-51.
Sygnały te za pomocą multipleksera przekazywane są na przetwornik analogowo-cyfrowy,
gdzie następuje ich próbkowanie oraz kwantyzacja. Częstotliwość próbkowania wynosi
800Hz, co w efekcie daje 16 próbek na jeden okres sygnału wejściowego przy załoŜeniu,
Ŝe częstotliwość zmian sygnału badanego wynosi 50Hz. Wspólna dla wszystkich
programów jest część, dotycząca zbierania próbek sygnałów (nastawienie timerów oraz
sterowanie przetwornikiem A/C). Program ten funkcjonuje według schematu
przedstawionego na Rys. 1.1.
Ustawienie
liczników oraz
trybu pracy
timerów
Ustawienie
zezwolenia
przerwań oraz start
Timera 0
Obsługa przerwań od Timera0:
- ustawienie Timera0
- wybór wejścia 0 na multiplekserze
- start przetwornika A/C
- nastawienia Timera 1
- start Timera 1
Pętla nieskończona
Podprogram
obliczający
wartość średnią
Podprogram
obliczający
amplitudę
Obsługa przerwań od Timera1:
- zapis wartości z przetwornika A/C
- wybór wejścia 1 na multiplekserze
- start przetwornika A/C
- start Timera 1
Obsługa przerwań od Timera1:
- zapis wartości z przetwornika A/C
Skok do początku bloku
Rys. 1.1. Schemat blokowy działania programu
1.1.1. Obliczenie wartości średniej (podprogram SREDNIA0)
Pierwszy podprogram wylicza wartość średnią przebiegu. Realizowane jest to poprzez
zsumowanie wszystkich próbek a następnie dzielenie otrzymanej wartości przez ilość
próbek. Mimo iŜ wynik tych obliczeń jest wartością 8 bitową, to wartości pośrednie
podczas obliczeń (sumowanie szesnastu 8 bitowych wartości) wymagają zapisu na 16
bitach. W związku z tym do zapisu 16 bitowej sumy wykorzystane zostały dwa 8 bitowe
rejestr R2 oraz R3, które reprezentują odpowiednio młodszą i starszą część wyniku. Jako
wskaźnik komórki pamięci, w której znajdują się próbki wykorzystany został rejestr
DPTR. Rejestr R4 wykorzystany został jako licznik. Sumowanie polega na dodawaniu w
pętli kolejnych próbek do rejestru R2. Sposób realizacji operacji sumowania
przedstawiono poniŜej:
SREDNIA0:
MOV R2,#00
MOV R3,#00
MOV DPTR,#2000H
MOV R4,#00
SKOK2:
;Mlodsza czesc wyniku
;Starsza czesc wyniku
;Wskaznik komorki od ktorej zaczynam liczenie
;Licznik
;Sumowanie probek
MOVX A,@DPTR
CLR C
ADD A,R2
MOV R2,A
JNC SKOK1
INC R3
SKOK1:
INC DPTR
INC R4
CJNE R4,#16,SKOK2
;Pobranie wartosci probki z pamieci XDATA
;Zerowanie bitu przepelnienia
;Dodawanie wartosci probki do rejestru R2
;Zapis wyniku dodawania w rejestrze R2
;Skok warunkowy
;Inkrementacja rejestru R3 jezeli wystapi przepelnienie
;Inkrementacja rejestru DPTR
;Inkrementacja rejestru R4
;Skok warunkowy
KaŜde przepełnienie rejestru R2, sygnalizowane ustawieniem bitu C, powoduje
inkrementacje rejestru R3. Przy kaŜdym przejściu pętli inkrementowany zostaje rejestr
DPTR oraz licznik pętli.
Dzielenie sumy przez szesnaście (ilość próbek) odbyło się poprzez przesunięcie całego
wyniku o cztery bity w prawo. Odbyło się to w następujący sposób:
MOV A,R2
SWAP A
ANL A,#00001111B
MOV R2,A
MOV A,R3
ANL A,#00001111B
SWAP A
ADD A,R2
MOV R2,A
MOV A,R3
ANL A,#11110000B
SWAP A
MOV R3,A
;Przesuwam wynik o 4 bity w prawo
;Zamiana 4 bitуw hi<->lo
;Iloczyn logiczny
;Kopiowanie wartoњci z akumulatora do R2
;Kopiowanie zawartoњci R3 do akumulatora
;Iloczyn logiczny
;Zamiana 4 bitуw hi<->lo
;Dodawanie zawartosci rejestru R2 do akumulatora
;Zapis zawartosci akumulatora do rejestru R2
;Zapis zawartosci rejestru R3 do akumulatora
;Iloczyn logiczny
;Zamiana 4 bitуw hi<->lo
;Zapis zawartosci akumulatora do rejestru R3
MOV R0,#50H
MOV A,R2
MOV @R0,A
;Zapis adresu 50H w rejestrze R0
;Zapis wyniku w akumulatorze
;Zapis wyniku pod adresem wskazywanym przez R0
RETI
;Wyjscie z podprogramu
W rejestrze R2, za pomocą polecenia SWAP, zamienione zostały cztery starsze bity z
czterema młodszymi bitami. Następnie cztery starsze bity zostały wyzerowane, po czym
dodane zostały do nich cztery młodsze bity rejestru R3. W rejestrze R3 wyzerowane
zostały cztery młodsze bity, a następnie wykonana została zamiana tych bitów z czterema
starszymi bitami.
W związku z tym, Ŝe wartość średnia mieści się w ośmiu bitach, jako wynik zapisana
została zawartość rejestru R2 w komórce o adresie 50H.
1.1.2. Obliczenie amplitudy (podprogram AMPLITUDA0)
Zadaniem drugiego podprogramu jest obliczanie amplitudy badanego sygnału. Do
obliczeń wykorzystany został poniŜszy wzór:
X 1m =
gdzie:
X 1m - amplituda
π
N1 / 2−1
N1
n =0
∑ | x ( n) |
1
(7.2)
N1 - liczba próbek w okresie sygnału
x - próbka sygnału
Wynikiem obliczeń jest 8 bitowa wartość, lecz tak jak w poprzednim podprogramie
wymagany jest zapis na 16 bitach wartości pośrednich. W związku z tym do zapisu 16
bitowej sumy wykorzystane zostały dwa 8 bitowe rejestr R2 oraz R3, które reprezentują
odpowiednio młodszą i starszą część wyniku. Jako wskaźnik komórki pamięci, w której
znajdują się próbki wykorzystany został rejestr DPTR. Rejestr R4 wykorzystany został
jako licznik. Przed dokonaniem obliczeń zmodyfikowane zostały próbki sygnału w taki
sposób, aby uniknąć wpływu offsetu na wynik obliczeń:
AMPLITUDA0:
MOV R2,#00
MOV R3,#00
MOV DPTR,#2000H
MOV R4,#0
AMPLI0:
MOVX A,@DPTR
;Mlodsza czesc wyniku sumowania pomnozonych przez 50 probek
;Starsza czesc wyniku sumowania pomnozonych przez 50 probek
;Wskaznik na komorke od ktorej ma sie zaczac sumowanie
;Licznik
;Kopiowanie wartosci probki z XDATA do akumulatora
CLR C
SUBB A,#7CH
;Zerowanie bitu przepelnienia
;Odejmowanie offsetu od wartosci probki
JNC DODATNIA0
;Skok warunkowy do etykiety DODATNIA0
MOVX A,@DPTR
PUSH ACC
POP 5
MOV A,#7CH
CLR C
SUBB A,R5
DODATNIA0:
;Kopiowanie wartosci probki z XDATA do akumulatora
;Kopiowanie zawartosci akumulatora na stos
;Przeniesienie ostatniej wartosci ze stosu do rejestru R5
;Wpisanie do akumulatora wartosci odpowidajacej offsetowi sygnalu
;Zerowanie bitu przepelnienia
;Odejmowanie od akumulatora zawartosci rejestru R5
Od dodatniej części sinusoidy odjęta została równowartość offsetu, natomiast ujemna
część sinusoidy została odwrócona względem zera oraz odjęty został od niej offset. Takie
przekształcenie wyeliminowało wpływ offsetu na wynik obliczeń amplitudy. Do realizacji
tego przekształcenia niezbędna była kontrola bitu C po kaŜdym działaniu, tak aby
wykonać odpowiednie działanie na próbce w zaleŜności od tego z której części (dodatniej
lub ujemnej) sinusoidy pochodzi.
Aby uprościć realizację obliczeń równanie (7.3) został przekształcone w następujący
sposób:
X 1m =
3,14 ⋅ 16 7
∑ | x1 (n) |
16 ⋅ 16 n=0
(7.3)
w efekcie otrzymano poniŜszy wzór:
X 1m =
50,24 7
∑ | x1 (n) |
256 n=0
(7.4)
Przekształcenie to wyeliminowało potrzebę wykonywania czasochłonnego dzielenia,
poniewaŜ dzielenie przez 256 równowaŜne jest z przesunięciem o 8 bitów w prawo.
W efekcie zamiast dzielić 16 bitową sumę przez 256 bierzemy 8 starszych bitów jako
wynik dzielenia. Wartość 50,24 znajdująca się w liczniku została zaokrąglona do 50. Do
realizacji operacji mnoŜenia wykorzystane zostało polecenie MUL AB, które dokonuje
mnoŜenia zawartości akumulatora razy zawartość rejestru B. Sposób dokonywania
obliczeń przedstawiono poniŜej:
CLR C
MOV B,#50
MUL AB
ADD A,R2
znajdujacej sie w akumultorze
MOV R2,A
MOV A,B
rejestrze B, do akumulatora
ADDC A,R3
bitu C
MOV R3,A
INC DPTR
INC R4
CJNE R4,#8,AMPLI0
MOV R0,#52H
MOV A,R3
MOV @R0,A
RETI
;Zerowanie bitu przepelnienia
;Wpisanie wartosci 50 do rejestru B
;Mnozenie wartosci probki przez 50
;Dodawanie zawartosci R2 do mlodszej czesci wyniku mnozenia
;Przeniesienie zawartosci akumulatora do rejestru R2
;Przeniesienie starszej czesci wyniku mnozenia, znajdujacej sie w
;Dodawanie zawartosci rejestru R3 do akumulatora z uwzglednieniem
;Przeniesienie zawartosci akumulatora do rejestru R3
;Inkrementacja rejestru DPTR
;Inkrementacja rejestru R4
;Skok do etykiety AMPLI0 jezeli zawartosc rejestru R4 jest rozna od 8
;Zapis adresu 52H w rejestrze R0
;Zapis wyniku w akumulatorze
;Zapis wyniku pod adresem wskazywanym przez R0
;Wyjscie z podprogramu
Przed dokonaniem obliczenia w akumulatorze zapisana została wartość próbki,
natomiast do rejestru B załadowana została wartość 50. Po wykonaniu działania młodsza
część wyniku została dodana do rejestru R2, natomiast starsza do rejestru R3. Działania te
zostały powtórzone 8 razy w pętli, jaką tworzy skok warunkowy, tak aby wykonać
mnoŜenie oraz sumowanie wszystkich próbek. Etykieta AMPLI0, do której odwołuje się
skok warunkowy, znajduje się na początku programu.
Na koniec zawartość rejestru R3, będąca amplitudą badanego przebiegu, została
zapisana w komórce o adresie 52H.
1.1.3. Wyświetlenie wyników obliczeń (podprogram WYSWIETLANIE)
Zadaniem ostatniego podprogramu jest wyświetlenie wyników obliczeń poprzednich
podprogramów na ekranie mikrokontrolera. Na samym początku nastąpiło wyczyszczenie
ekranu. Następnie za pomocą komendy LCALL WRITE_HEX wyświetlonych zostało pięć
kolejnych wartości próbek. W drugiej linijce wyświetlacza wyświetlone zostały
odpowiednio wartość średnia oraz amplituda przebiegu.
W programie głównym wyŜej opisane podprogramy są wywoływane w pętli, dzięki
czemu wyniki obliczeń są na bieŜąco odświeŜane. Aby zapewnić czytelność
wyświetlanych na ekranie wartości między kaŜdym wyświetlaniem wstawione zostało
300ms opóźnienie. UŜyta do tego celu została komenda LCALL DELAY_100MS.