Ćwiczenie 10

Transkrypt

Ćwiczenie 10
Ć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
DB
CLK
-
BSY
ADM
ADCON
analogowo-cyfrowego
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.
IEN0 A8h
Rejestr masek przerwań,
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
DAPR.3..0
Vgnd= Vagnd+
* (Varef-Vagnd),
16
DAPR.7..4
Vref= Vagnd+
* (Varef-Vagnd),
16
Vref - Vgnd > 1V,
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
EXF TF2 IEX6 IEX5
C3
C2
C1
C0
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
Stan rejestru
DAPR
Podzakres
pomiarowy
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DAPR3...0
DAPR7...4
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
Dolna wartość
napięcia podzakresu
pomiarowego
VintGND [V]
Górna wartość
napięcia podzakresu
pomiarowego
VintREF [V]
0,0
0,3125
0,625
0,9375
1,25
1,5625
1,875
2,1875
2,5
2,8125
3,125
3,4375
3,75
-
5,0
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ść Ux=3,857 V z rozdzielczością 10-bitów
jest następująca:
• wykonanie pierwszego pomiaru napięcia Ux w pełnym zakresie pomiarowym 0...5 [V]
• obliczenie na podstawie pierwszego pomiaru właściwego podzakresu pomiarowego
tek, aby wartość mierzonego napięcia Ux odległa była od wartości krańcowych
podzakresu; najkorzystniej jest przyjąć takie wartości, aby mierzone napięcie Ux
znalazło się w połowie podzakresu pomiarowego,
• wykonanie drugiego pomiaru napięcia Ux 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
−U
Wynik pomiaru UX = K* ∆U
∆U= REF max N REF min
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)
//inicjowanie portu szeregowego
{
SCON=0x40;
TMOD|=0x20;
TH1=TL1=0xFD;
TR1=1;
TI=1;
}
void main(void)
{
unsigned char c, kl_p=1;
init_rs();
ADCON |= 0x07;
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
5
Vint REF=4,375V
Vint REF=4,375V
Ux=3,857V
pomiar w zakresie 3,125 .. 4,375V
Vint GND=3,125V
pomiar wstępny
0
Vint REF=0V
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)
//inicjowanie portu szeregowego
{
SCON=0x40;
TMOD|=0x20;
TH1=TL1=0xFD;
TR1=1;
TI=1;
}
void main(void)
{
unsigned char c;
init_rs();
ADCON |= 0x07;
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
150OC, 0V- 0oC na każdy stopień 10mV/oC.
Napisz program symulujący pomiar temperatury i wyświetlający wynik portem szeregowym.
5V
LM35
WY
T= 100 *WY gdzie T (oC)
#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)
//inicjowanie portu szeregowego
{
SCON=0x40;
TMOD|=0x20;
TH1=TL1=0xFD;
TR1=1;
TI=1;
}
void main(void)
{
unsigned char c;
init_rs();
ADCON |= 0x07;
while(1)
AN0
uK
89C535
{
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.