Você está na página 1de 12

Laboratorium Prototypowania ukadw elektronicznych

Gawlewicz Adam, Lasyk Jerzy, Smaro Piotr


04-12-2012

Grupa 3, Poniedziaek 8:30

wiczenie nr 1: 1-Wire

1.1

Cel wiczenia

Celem wiczenia byo zapoznanie si z zasad dziaania magistrali 1-Wire. Naszym zadaniem
byo odczytanie unikalnego, 64-bitowego numeru identykacyjnego ukadu DS18B20, zapisanego
w wewntrznej pamieci ROM.
1.2

Wykonanie wiczenia

W celu wykonania wiczenia naleao zmodykowa plik bazowy napisany w jzyku C. Przede
wszystkim naleao nawiza komunikacj z urzdzeniem poprzez cykliczne wysyanie komendy
odczytu numeru seryjnego. Poniej fragment kodu odpowiadajcy za inicjalizacj:
int i=0;
DQ=0;
for(;i<30;i++)
{
_delay_us10();
}

Inicjalizacja polega na wymuszeniu na linii stanu niskiego przez co najmniej 480s, po czym
nastpuje oczekiwanie na odpowied ukadu slave :
DQ=1;
for( i=0 ; i<50 ; i++ )
{
_delay_us10();
}

Oczekiwanie polega na utrzymaniu stanu wysokiego. Jeli na linii urzdzenie slave wymusi stan
niski, oznacza to jego obecno.
Po udanej inicjalizacji nastpuje wysanie polecenia odczytania numeru id, co jest rwnowane
wysaniu kodu 33h:
one();
one();
zero();
zero();
one();
one();
zero();
zero();

gdzie poszczeglne funkcje zdeniowane s nastpujco:


void one( void )
{
DQ=0;
_delay_us10();
DQ=1;
_delay_us10();
_delay_us10();
_delay_us10();
_delay_us10();
_delay_us10();
_delay_us10();
_delay_us10();
}
void zero( void )
{
DQ=0;
_delay_us10();
_delay_us10();
_delay_us10();
_delay_us10();
_delay_us10();
_delay_us10();
_delay_us10();
_delay_us10();
_delay_us10();
DQ=1;
_delay_us10();
_delay_us10();
}

Naley przy tym pamita, e wysyanie komendy zaczyna si od najmodszego bitu. Nastpnie
nastpuje procedura odczytu wysanej wartoci przez ukad slave:
void readROM( int licznik )
{
DQ=0;
_delay_us2();
DQ=1;
_delay_us10();
_delay_us10();
_delay_us10();

_delay_us10();
_delay_us10();
_delay_us10();
if( DQ == 1 )
{
tablica[licznik] = 1;
}
else
tablica[licznik] = 0;
}
}

Odczyt polega na wymuszeniu stanu niskiego na linii na czas od 1 do 15 s, po czym wymuszeniu stanu wysokiego na min 45s, w taki sposb, aby caa procedura nie trwaa krcej ni 60s.
Po upywie tego czasu odczytujemy warto sygnau DQ. Wszystkie odczytane wartoci zapisujemy do tablicy. Nastpnie tablica ta zostaje przekazana do funkcji, ktra odpowiedzialna jest za
wywietlenie zapisanych w niej znakw:
void kod2bin( )
{
int i=0;
char znak[2];
for( ; i<64 ; i += 4)
{
bin = tablica[i]+tablica[i+1]*10+tablica[i+2]*100+tablica[i+3]*1000;
znak[0] = bin2hex();
znak[1] = '\0';
lcd_printxy_c1((i+1)/2,2,znak);
}
}

Funkcja ta do korzysta z dodatkowej funkcji odpowiadajcej za odkodowanie znakw:


char bin2hex( )
{
switch( bin )
{
case 1111 :
case 1110 :
case 1101 :
case 1100 :

return
return
return
return

'F';
'E';
'D';
'C';

case
case
case
case
case
case
case
case
case
case
case
case

1011
1010
1001
1000
0111
0110
0101
0100
0011
0010
0001
0000

:
:
:
:
:
:
:
:
:
:
:
:

return
return
return
return
return
return
return
return
return
return
return
return

'B';
'A';
'9';
'8';
'7';
'6';
'5';
'4';
'3';
'2';
'1';
'0';

}
return 'Z';
}
1.3

Podsumowanie

Wykonanie wiczenia nie udao si w caoci. Mylimy, e gwnym powodem byo nie zachowanie odpowiednich ram czasowych w trakcie odczytu danych urzdzenia slave. Na oscyloskopie
otrzymywalimy same jedynki, tzn. slave nie utrzymywa stanu niskiego na linii przez odpowiedni
czas.
2
2.1

wiczenie nr 2: LabView
Cel wiczenia

Celem wiczenia byo zrealizowanie generatora PWM, o zmiennym wspczynniku wypenienia,


oraz stworzenie logiki odpowiadajacej za odczyt pozycji z enkodera kwadraturowego.
2.2

2.2.1

Wykonanie wiczenia

Realizacja PWM

Generator PWM zosta w pierwszej fazie wykonany na komputerze, a nastpnie przeniesiony na


ukad FPGA. Poniej schemat ukadu blokowego:

dziaa !
2.2.2

Realizacja enkodera

Podobnie jak w przypadku generatora PWM, logika odpowiadajca za odczyt sygnaw z enkodera
pocztkowo zaprojektowana zostaa na komputerze, a nastpnie przeniesiona na ukad FPGA:

2.2.3

Panel operatorski

W panelu operatorskim mona ustawi wypenienie generatora PWM od 0 do 100%, zmieni


okres sygnau PWM oraz zmienia kierunek ruchu silnika. Dodatkowo moliwe jest zatrzymanie

dziaania logiki. Na wykresie wywietlane s dwie fale, A oraz B, enkodera, poniej natomiast
zliczona warto.

2.3

Podsumowanie

wiczenie zostao wykonane w peni poprawnie. Wszystkie elementy zachowyway si zgodnie z


zaoeniami, co zostao potwierdzone testami aplikacji.
3
3.1

wiczenie nr 3: Xilinx
Cel wiczenia

Celem wiczenia byo zrealizowanie logiki odpowiadajcej za sterowanie silnikiem za pomoc sygnau z generatora PWM, nastpnie odczyt sygnaw z dwu enkoderw. Kocowym zadaniem
byo stworzenie ukadu nadnego.
3.2

Wykonanie wiczenia

Gwna cz odpowiadajca za generator PWM przedstawia si nastpujco:


Wypelnienie(11 downto 8) <= Switch(3 downto 0);
...
if (I = Dzielnik) then
Okres <= Okres+1;
I := "00000000";
end if;
if (Okres > Wypelnienie) then
PWM <= '1';

else
PWM <= '0';
end if;
if (Okres = "111111111111") then
Okres <= "000000000000";
end if;

Wypenienie sygnau zostao zapisywane do 12-bitowej wartoci, ktrej 4 najstarsze bity mona
byo regulowa poprzez zmian przecznikw hebelkowych znajdujcych si na ukadzie FPGA.
Druga cz, odpowiadajca za sczytywanie wartoci z ekondera:
A := Enc1_A & A(0);
B := Enc1_B & B(0);
C := Enc2_A & C(0);
D := Enc2_B & D(0);
temp := A & B;
temp2 := C & D;
if( temp = "1000" or temp = "1110" or temp = "0111" or temp = "0001" ) then
enkoder1 := enkoder1 + 1;
end if;
if( temp = "0010" or temp = "1011" or temp = "1101" or temp = "0100" ) then
enkoder1 := enkoder1 - 1;
end if;
if( temp2 = "1000" or temp2 = "1110" or temp2 = "0111" or temp2 = "0001" ) then
enkoder2 := enkoder2 + 1;
end if;
if( temp2 = "0010" or temp2 = "1011" or temp2 = "1101" or temp2 = "0100" ) then
enkoder2 := enkoder2 - 1;
end if;
...
A(0) :=
B(0) :=
C(0) :=
D(0) :=

A(1);
B(1);
C(1);
D(1);

Na podstawie obu czci kodu, staralimy si wykona ukad nadny, ktrego czci kodu zamieszczamy poniej:

wzmocnienie := "00000001";
...
uchyb := enkoder1 + enkoder2;
...
if( uchyb < 0 ) then
Dir <= '1';
else
Dir <= '0';
end if;
...
if (Okres = "111111111111") then
Okres <= "000000000000";
Wypelnienie <= uchyb*wzmocnienie;
end if;
3.3

Podsumowanie

Udao nam si zrealizowa generator PWM oraz logik odpowiadajc za odczyt enkoderw, natomiast ukad nadny nie dziaa do koca poprawnie. Mylimy, e powodem bdnego dziaania
bya le dobrana zmiana kierunku.
4

wiczenie nr 4: ADC 

4.1

Cel wiczenia

Celem wiczenia byo zrealizowanie kilku zada:


1. generacja fali sinusoidalnej, 8-bitowej na jednym wyjciu,
2. generacja fali sinusoidalnej, 12-bitowej na jednym wyjciu,
3. generacja dwch sinusoidalnych, 12-bitowych fal oraz
4. generacja dwch sinusoidalnych, 12-bitowych fal przesunitych wzgldem siebie o 90o .
4.2

4.2.1

Wykonanie wiczenia

Sinus 8-bitowy

MOV
MOV
MOV
MOV

DACCON, #11111111b
;ustawienie na 8-bit
DAC0L, #00000000b
;wyzerowanie wartoci wyjciowej z przetwornika
DAC0H, #00000000b
DPTR, #Sin8bit
;ustawienie wskanika na pocztek tablicy sinus

MOV R1, #0
LOOP:
CLR A
MOVC A, @A+DPTR
INC DPL
MOV DAC0L,A
MOV R1,DPL
CJNE R1,#64, LOOP
MOV DPTR, #Sin8bit
AJMP LOOP
4.2.2

; aktualna wartosac sinusa


; zwiekszenie DPTR ,
; wyslanie danych na przetwornik
;inkrementacja R1
;jeli R1 nie doliczyo do 64, skacz
;jeli R1 osigno 64, ustaw wskanik na pocztek tablicy sin

Sinus 12-bitowy

Sinus 12-bitow rni si od poprzedniego kilkoma rzeczami:


MOV
MOV
MOV
MOV

DACCON, #01111111b
DAC0L, #00000000b
DAC0H, #00000000b
DPTR, #Sin12bit

;konfiguracja na 12-bit
;ustawienie na pocztek tablicy 12-bitowego sin

MOV R1,#0
LOOP:
CLR A
MOVC A,@A+DPTR
MOV DAC0H, A
INC DPTR

; wskanik jest inkrementowany 2 razy

CLR A
MOVC A, @A+DPTR
MOV DAC0L, A
INC DPTR

; 2 inkrementacja wskanika

INC R1
MOV A,R1
CJNE R1, #64, LOOP
MOV DPTR, #Sin12bit
MOV R1,#0
LJMP LOOP
4.2.3

Dwa sinusy 12-bitowe

Drugi sinus uzyskujemy przez dodanie kodu przed etykiet


MOV DAC1L, #00000000b
MOV DAC1H, #00000000b

10

LOOP

oraz dodanie odpowiednich linii:


MOV DAC1L, A

oraz
MOV DAC1H, A

przy zapisywaniu wartoci do wyjcia.


4.2.4

Dwa sinusy 12-bitowe przesunite w fazie

MOV
MOV
MOV
MOV
MOV
MOV

DACCON, #01111111b
DAC1H, #00000000b
DAC0H, #00000000b
DAC1L, #00000000b
DAC0L, #00000000b
DPTR, #Sin12bit

MOV R1,#48
MOV R4,#64
MOV R2,#00
MOV R3,#32

;ustawienie na dwa 12-bitowe wyjscia

;dwa rejestry R1 i R4 su do
;wchodzenia do etykiet
;dwa rejestry R2 i R3 odpowiadaj
;za przesunicie wskanika w tablicy

LOOP:
CLR A
MOV A,R2
MOVC A,@A+DPTR;
MOV DAC0H,A
CLR A
MOV A,R3
MOVC A,@A+DPTR;
MOV DAC1H,A
INC DPTR
CLR A
MOV A,R2
MOVC A,@A+DPTR
MOV DAC0L,A
CLR A
MOV A,R3
MOVC A,@A+DPTR
MOV DAC1L,A
INC DPTR

11

DEC R1
DEC R4
CLR A
MOV A,R1
JZ LOOP1
MOV A,R4
JZ LOOP2

;do akumulatora przypisujemy warto R1


;jeli jest rwna 0, nastpuje skok
;podobnie z rejestrem R4

LJMP LOOP
LOOP1:
MOV
MOV
MOV
MOV

DPTR, #Sin12bit
R3,#00
R2,#96
R1,#64

;w obu ptlach zmieniamy adresy na ktre


;wskazuje wskanik

LJMP LOOP
LOOP2:
MOV DPTR, #Sin12bit
MOV R3,#32
MOV R2,#00
MOV R4,#64
MOV R1,#48
LJMP
4.3

LOOP

Podsumowanie

Udao si nam zrealizowa wszystkie cele, co potwierdzilimy wywietlaniem wynikw dziaania


kodw na oscyloskopie.

12

Você também pode gostar