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.