ĆWICZENIE TEMAT: OBSŁUGA PRZETWORNIKA A/C W ukontrolerze 80C535 KEILuVISON
Wiadomości wstępne: Wszystkie sygnały analogowe, które mają być przetwarzane w systemach mikroprocesorowych są próbkowane, kwantowane i kodowane. Próbkowanie umożliwia wyznaczenie wartości chwilowych sygnału, kwantowanie przekształcenie ciągłej wartości chwilowej na wartość dyskretną, a kodowanie na zminę dyskretnej wartości chwilowej sygnału na kod binarny. Mikrokontroler SAB80C515/535 posiada w strukturze wewnętrznej przetwornik A/C. 15 cykli maszynowych w procesorze SAB 80515/535 13cykli maszynowych w procesorze SAB 80C515/535 Schemat blokowy przetwornika analogowo cyfrowego mikrokontrolera SAB 80C515/535 Programowanie przetwornika A/C związane jest z: -wyborem nr wejściowego kanału analogowego, bity MX2...MX0 w rejestrze ADCON -ustaleniem rodzaju przetwarzania, znacznik ADM w rejestsze ADCON: ADM=0- pomioar pojedynczy, ADM=1-seria pomiarów do chwili,w której ADM=0 Rejestr sterujacy przetwornika ADCON analogowo-cyfrowego DB CLK - BSY ADM MX2 MX1 MX0 BUSY- jesli busy =1, trwa przetwarzanie, kasowany samoczynnie po zakonczeniu, ADM = 1 - przetwarzanie ciagle, 0 - przetwarzanie jednokrotne, MX2- bity wyboru jednego z 8-miu kanalow przetwornika a/c MX1- bity wyboru jednego z 8-miu kanalow przetwornika a/c MX0- bity wyboru jednego z 8-miu kanalow przetwornika a/c
-odblokowanie systemu przerwań, znacznik EAL w rejestrze IEN0, jeśli o zakonczeniu przetwarzania jest przerwanie od przetwornika, znacznik EADC w rejestrze IEN1. Rejestr masek przerwań, IEN0 A8h EAL WDT ET2 ES ET1 EX1 ET0 EX0 EAL - globalna maska przerwan, WDT- flaga odswiezania licznika watch-doga, kasuje sie samoczynnie po trzech cyklach maszynowych od ustawienia ET2 - maska przerwania timera2, ES - maska przerwania kanalu szeregowego, ET1 - maska przerwania timera1, EX1 - maska przerwania int1, ET0 - maska przerwania timera0, EX0 - maska przerwania int0, IEN1 B8h EXEN2 SWDT EX6 EX5 EX4 EX3 EX2 EADC EXEN2- gdy ustawiony, umozliwia przerwanie od zewnetrznego przeladowania timera t2, SWDT- jesli jest ustawiona po reset-cie uruchamia licznik watch-dog-a, jesli ustawiona zaraz po ustawieniu wdt - zeruje licznik w-d, EX6 - gdy ustawiony, umozliwia przerwanie int6 EX5- gdy ustawiony, umozliwia przerwanie int5 EX4 - gdy ustawiony, umozliwia przerwanie int4 EX3 - gdy ustawiony, umozliwia przerwanie int3 EX2- gdy ustawiony, umozliwia przerwanie int2 EADC - gdy ustawiony, umozliwia przerwanie od przetwornika a/c -wyborem podzakresu pomiarowego, napięcie VintAGND (bity DAPR3...0) oraz napiecie VintAREF (bity DAPR7...4) DAPR 0DAH - rejestr napiec referencyjnych, Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 NapięcieVintAREF Napięcie VintAGND Vgnd= Vagnd+ DAPR.3..0 16 * (Varef-Vagnd), DAPR.7..4 Vref= Vagnd+ * (Varef-Vagnd), Vref - Vgnd > 1V, 16
Zakończenie pomiaru sygnalizowane jest: -zerowa wartościa znacznika BSY w rejesrrze ADCON, -przerwaniem, ustawieniem znacznika IADC w rejestrze IRCON, IRCON C0h - rejestr zgłoszeń przerwań C7 C6 C5 C4 C3 C2 C1 C0 EXF TF2 IEX6 IEX5 IEX4 IEX3 IEX2 IADC EXF2 - flaga przeladowana t2, TF2 - przepelnienie timera2, IEX6 - zgloszenie przerwania int6, ustawiany przez procesor gdy na p1.3 pojawia sie sygnal przerwania lub zgodnosc porownania cc3, kasowany gdy zostaje obsluzone przerwanie, IEX5 - zgloszenie przerwania int5, ustawiany przez procesor gdy na p1.2 pojawia sie sygnal przerwania lub zgodnosc porownania cc2, kasowany gdy zostaje obsluzone przerwanie, IEX4 - zgloszenie przerwania int4, ustawiany przez procesor gdy na p1.1 pojawia sie sygnal przerwania lub zgodnosc porownania cc1, kasowany gdy zostaje obsluzone przerwanie, IEX3 - zgloszenie przerwania int3#, ustawiany przez procesor gdy na p1.0 pojawia sie sygnal przerwania lub zgodnosc porownania cc0, kasowany gdy zostaje obsluzone przerwanie, IEX2 - zgloszenie przerwania int2#, ustawiany przez procesor gdy na p1.4 pojawia sie sygnal przerwania lub zgodnosc porownania cc4, kasowany gdy zostaje obsluzone przerwanie, IADC - ustawiany przez procesor po konwersji a/c, musi byc kasowany programowo,
Tabela zmian podzakresów pomiarowych. Podzakres pomiarowy Podzakres pomiarowy 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Stan rejestru DAPR Dolna wartość napięcia podzakresu pomiarowego Górna wartość napięcia podzakresu pomiarowego DAPR 3...0 DAPR 7...4 V intgnd [V] V intref [V] 0000 0,0 5,0 0001 0,3125-0010 0,625-0011 0,9375-0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 1,25 1,5625 1,875 2,1875 2,5 2,8125 3,125 3,4375 3,75 - - - 1,25 1,5625 1,875 2,1875 2,5 2,8125 3,125 3,4375 3,75 4,0625 4,375 4,6875 W zależności od wartości bitów rejestru DAPR uzyskiwanych jest 16 podzakresów pomiarowych. Zasada dwuetapowego pomiaru napięcia, np. wartość U x =3,857 V z rozdzielczością 10-bitów jest następująca: wykonanie pierwszego pomiaru napięcia U x w pełnym zakresie pomiarowym 0...5 [V] obliczenie na podstawie pierwszego pomiaru właściwego podzakresu pomiarowego tek, aby wartość mierzonego napięcia U x odległa była od wartości krańcowych podzakresu; najkorzystniej jest przyjąć takie wartości, aby mierzone napięcie U x znalazło się w połowie podzakresu pomiarowego, wykonanie drugiego pomiaru napięcia U x w zmniejszonym podzakresie pomiarowym, np. 3,125... 4,375[V] obliczenie na podstawie dwóch pomiarów i znajomości granic zmniejszonego podzakresu pomiarowego pełnego wyniku z U 0,005V (jak w przypadku rozdzielczości dla przetwornika 10-bitowego)
Zadanie 1. Napisz program dokonujący pomiaru napięcia na kanale AN7, a następnie wyświetlający zakodowany wynik pomiaru na diodach portu P5. Zakres pomiarowy 0 5. U Wynik pomiaru U X = K* U U= REF max U REF min N 2 #include <REG515.h> #include <stdio.h> void main(void) ADCON = 0x07; DAPR = 0x00; while(1) while(!bsy) P5=ADDAT; DAPR = 0x00;
Zadanie 2. Pomiar napięcia z kanału AN7 na wciśnięty klawisz P3.2, wysłanie wyniku przez port szeregowy za pomocą funkcji printf. #include <REG515.h> #include <stdio.h> sbit kl=p3^2; float ufs =5; float u; void delay(void) unsigned int i=300; while(i--); void init_rs (void) SCON=0x40; TMOD =0x20; TH1=TL1=0xFD; TR1=1; TI=1; void main(void) unsigned char c, kl_p=1; init_rs(); ADCON = 0x07; //inicjowanie portu szeregowego while(1) if (kl==0&&kl_p==1) DAPR = 0x00; while(bsy= = 1); c=addat; u=ufs*c/256; printf("napięcie [V] = %f\n", u); P5=ADDAT; kl_p=kl; delay();
Zadanie 3. Napisz program który wykonuje dwukrotny pomiar napięcia, najpierw na całym zakresie a następnie w zakresie zmniejszonym. Wg rysunku. Wynik pomiaru wysłać przez port szeregowy. Pomiary powinny być wykonane na naciśnięcie klawisza P3^0 pełny zakres P3^1 zmniejszony. U V int REF =4,375V 5 V int REF =4,375V U x =3,857V pomiar w zakresie 3,125.. 4,375V V int GND =3,125V 0 V int REF =0V pomiar wstępny V Przykładowy program mierzący napięcie w zakresie od 0 do 5V a następnie od 0 do 1,25V #include <REG515.h> #include <stdio.h> sbit kl=p3^0; float ufs =5,ufs1=1.25; float u; void delay(void) unsigned int i=50000; while(i--); void init_rs (void) SCON=0x40; TMOD =0x20; TH1=TL1=0xFD; TR1=1; TI=1; void main(void) unsigned char c; init_rs(); ADCON = 0x07; //inicjowanie portu szeregowego while(1) DAPR=0x00; while(bsy==1);
c=addat; u=ufs*c/256; printf("napięcie [V] = %f\n", u); P5=ADDAT; delay(); DAPR=0x40; while(bsy==1); c=addat; u=ufs1*c/256; printf("napięcie [V] = %f\n", u); P1=ADDAT; while(kl==1);
Zadanie 4. Pomiar napięcia na kanale AN7 w pełnym zakresie na wciśnięty klawisz P5.7 oraz pomiar napięcia w zakresie 0 1.25V na wciśnięty klawisz P5.0 W zadaniu należy dopisać jeszcze pomiary dla następujących zakresów: kl1 P5.1 zakres 1.25 2.5 V kl2 P5.2 zakres 2.5 3.75 V kl3 P5.3 zakres 3.75 4.6875 V Zadanie 6. Czujnik LM 35 daje napięcie proporcjonalne do temperatury w zakresie od 0 do 150 O C, 0V- 0 o C na każdy stopień 10mV/ o C. Napisz program symulujący pomiar temperatury i wyświetlający wynik portem szeregowym. 5V uk LM35 WY AN0 89C535 T= 100 *WY gdzie T ( o C) #include <REG515.h> #include <stdio.h> sbit kl=p3^0; float ufs =1.25; float u,t; void delay(void) unsigned int i=50000; while(i--); void init_rs (void) SCON=0x40; TMOD =0x20; TH1=TL1=0xFD; TR1=1; TI=1; void main(void) unsigned char c; init_rs(); ADCON = 0x07; //inicjowanie portu szeregowego while(1)
DAPR=0x40; while(bsy==1); c=addat; u=ufs*c/256; T=100*u; printf("temperatura [C] = %.1f\n", T); P5=ADDAT; delay( ); while(kl==1);
Zadanie 5. Napisz program wypisujący przez port szeregowy wartość 0 100 % odczytaną z przetwornika A/C na kanale AN7. W zadaniu wykorzystaj bibliotekę stworzoną w ćwiczeniu 5 system.h system.h #include<reg515.h> void init_rs (void) //inicjowanie portu szeregowego SCON=0x40; TMOD =0x20; TH1=TL1=0xFD; TR1=1; TI=1; void putc_rs (char x) //wysłanie znaku portem szeregowym SBUF=x; while (TI==0); TI=0; void puts_rs (char *s) //wysłanie łańcucha portem szeregowym while(*s) putc_rs(*s); s++;
Program główny: #include<system.h> #include<stdio.h> void delay() unsigned int i=60000; while(i--); void main (void) unsigned char c; char buf[6]; float u; init_rs(); ADCON=0x07; /*POMIAR POJEDYNCZY KANAŁ 7*/ while(1) DAPR=0x00; /* ZAKRES 0-5V*/ while (BSY!=0); c=addat; u = c*100.0/255.0; sprintf(buf,"%.0f %%", u); putc_rs('\n'); puts_rs(buf); delay();
Zadanie 6. Napisz program, w którym jeśli napięcie przekroczy wybraną wartość (np. 2V) to włączą się diody portu P5 (ALARM), jeśli napięcie będzie poniżej tej wartości to Port P5 ma być wyłączony. Wartość napięcia ma być wysyłana portem szeregowym.