Prototypowanie układów elektronicznych, sprawozdanie
-
Upload
miroslawjarzebinka -
Category
Documents
-
view
214 -
download
1
description
Transcript of Prototypowanie układów elektronicznych, sprawozdanie
![Page 1: Prototypowanie układów elektronicznych, sprawozdanie](https://reader035.fdocuments.net/reader035/viewer/2022080905/55cf918c550346f57b8e5b81/html5/thumbnails/1.jpg)
Laboratorium Prototypowania ukªadów elektronicznych
Gawlewicz Adam, Lasyk Jerzy, Smaro« Piotr
04-12-2012
Grupa 3, Poniedziaªek 8:30
1
![Page 2: Prototypowanie układów elektronicznych, sprawozdanie](https://reader035.fdocuments.net/reader035/viewer/2022080905/55cf918c550346f57b8e5b81/html5/thumbnails/2.jpg)
1 �wiczenie nr 1: �1-Wire�
1.1 Cel ¢wiczenia
Celem ¢wiczenia byªo zapoznanie si¦ z zasad¡ dziaªania magistrali 1-Wire. Naszym zadaniembyªo odczytanie unikalnego, 64-bitowego numeru identy�kacyjnego ukªadu DS18B20, zapisanegow wewn¦trznej pamieci ROM.
1.2 Wykonanie ¢wiczenia
W celu wykonania ¢wiczenia nale»aªo zmody�kowa¢ plik bazowy napisany w j¦zyku C. Przedewszystkim nale»aªo nawi¡za¢ komunikacj¦ z urz¡dzeniem poprzez cykliczne wysyªanie komendyodczytu numeru seryjnego. Poni»ej fragment kodu odpowiadaj¡cy za inicjalizacj¦:
int i=0;
DQ=0;
for(;i<30;i++)
{
_delay_us10();
}
Inicjalizacja polega na wymuszeniu na linii stanu niskiego przez co najmniej 480µs, po czymnast¦puje oczekiwanie na odpowied¹ ukªadu slave:
DQ=1;
for( i=0 ; i<50 ; i++ )
{
_delay_us10();
}
Oczekiwanie polega na utrzymaniu stanu wysokiego. Je±li na linii urz¡dzenie slave wymusi stanniski, oznacza to jego obecno±¢.
Po udanej inicjalizacji nast¦puje wysªanie polecenia odczytania numeru id, co jest równowa»newysªaniu kodu 33h:
one();
one();
zero();
zero();
one();
one();
zero();
zero();
2
![Page 3: Prototypowanie układów elektronicznych, sprawozdanie](https://reader035.fdocuments.net/reader035/viewer/2022080905/55cf918c550346f57b8e5b81/html5/thumbnails/3.jpg)
gdzie poszczególne funkcje zde�niowane s¡ nast¦puj¡co:
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();
}
Nale»y przy tym pami¦ta¢, »e wysyªanie komendy zaczyna si¦ od najmªodszego bitu. Nast¦pnienast¦puje procedura odczytu wysªanej warto±ci przez ukªad slave:
void readROM( int licznik )
{
DQ=0;
_delay_us2();
DQ=1;
_delay_us10();
_delay_us10();
_delay_us10();
3
![Page 4: Prototypowanie układów elektronicznych, sprawozdanie](https://reader035.fdocuments.net/reader035/viewer/2022080905/55cf918c550346f57b8e5b81/html5/thumbnails/4.jpg)
_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 wymusze-niu stanu wysokiego na min 45µs, w taki sposób, aby caªa procedura nie trwaªa krócej ni» 60µs.Po upªywie tego czasu odczytujemy warto±¢ sygnaªu DQ. Wszystkie odczytane warto±ci zapisu-jemy do tablicy. Nast¦pnie tablica ta zostaje przekazana do funkcji, która odpowiedzialna jest zawy±wietlenie zapisanych w niej znaków:
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 odpowiadaj¡cej za odkodowanie znaków:
char bin2hex( )
{
switch( bin )
{
case 1111 : return 'F';
case 1110 : return 'E';
case 1101 : return 'D';
case 1100 : return 'C';
4
![Page 5: Prototypowanie układów elektronicznych, sprawozdanie](https://reader035.fdocuments.net/reader035/viewer/2022080905/55cf918c550346f57b8e5b81/html5/thumbnails/5.jpg)
case 1011 : return 'B';
case 1010 : return 'A';
case 1001 : return '9';
case 1000 : return '8';
case 0111 : return '7';
case 0110 : return '6';
case 0101 : return '5';
case 0100 : return '4';
case 0011 : return '3';
case 0010 : return '2';
case 0001 : return '1';
case 0000 : return '0';
}
return 'Z';
}
1.3 Podsumowanie
Wykonanie ¢wiczenia nie udaªo si¦ w caªo±ci. My±limy, »e gªównym powodem byªo nie zacho-wanie odpowiednich ram czasowych w trakcie odczytu danych urz¡dzenia slave. Na oscyloskopieotrzymywali±my same jedynki, tzn. slave nie utrzymywaª stanu niskiego na linii przez odpowiedniczas.
2 �wiczenie nr 2: �LabView�
2.1 Cel ¢wiczenia
Celem ¢wiczenia byªo zrealizowanie generatora PWM, o zmiennym wspóªczynniku wypeªnienia,oraz stworzenie logiki odpowiadajacej za odczyt pozycji z enkodera kwadraturowego.
2.2 Wykonanie ¢wiczenia
2.2.1 Realizacja PWM
Generator PWM zostaª w pierwszej fazie wykonany na komputerze, a nast¦pnie przeniesiony naukªad FPGA. Poni»ej schemat ukªadu blokowego:
5
![Page 6: Prototypowanie układów elektronicznych, sprawozdanie](https://reader035.fdocuments.net/reader035/viewer/2022080905/55cf918c550346f57b8e5b81/html5/thumbnails/6.jpg)
dziaªaª !
2.2.2 Realizacja enkodera
Podobnie jak w przypadku generatora PWM, logika odpowiadaj¡ca za odczyt sygnaªów z enkoderapocz¡tkowo zaprojektowana zostaªa na komputerze, a nast¦pnie przeniesiona na ukªad FPGA:
2.2.3 Panel operatorski
W panelu operatorskim mo»na ustawi¢ wypeªnienie generatora PWM od 0 do 100%, zmieni¢okres sygnaªu PWM oraz zmienia¢ kierunek ruchu silnika. Dodatkowo mo»liwe jest zatrzymanie
6
![Page 7: Prototypowanie układów elektronicznych, sprawozdanie](https://reader035.fdocuments.net/reader035/viewer/2022080905/55cf918c550346f57b8e5b81/html5/thumbnails/7.jpg)
dziaªania logiki. Na wykresie wy±wietlane s¡ dwie fale, A oraz B, enkodera, poni»ej natomiastzliczona warto±¢.
2.3 Podsumowanie
�wiczenie zostaªo wykonane w peªni poprawnie. Wszystkie elementy zachowywaªy si¦ zgodnie zzaªo»eniami, co zostaªo potwierdzone testami aplikacji.
3 �wiczenie nr 3: �Xilinx�
3.1 Cel ¢wiczenia
Celem ¢wiczenia byªo zrealizowanie logiki odpowiadaj¡cej za sterowanie silnikiem za pomoc¡ sy-gnaªu z generatora PWM, nast¦pnie odczyt sygnaªów z dwu enkoderów. Ko«cowym zadaniembyªo stworzenie ukªadu nad¡»nego.
3.2 Wykonanie ¢wiczenia
Gªówna cz¦±¢ odpowiadaj¡ca za generator PWM przedstawia si¦ nast¦puj¡co:
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';
7
![Page 8: Prototypowanie układów elektronicznych, sprawozdanie](https://reader035.fdocuments.net/reader035/viewer/2022080905/55cf918c550346f57b8e5b81/html5/thumbnails/8.jpg)
else
PWM <= '0';
end if;
if (Okres = "111111111111") then
Okres <= "000000000000";
end if;
Wypeªnienie sygnaªu zostaªo zapisywane do 12-bitowej warto±ci, której 4 najstarsze bity mo»nabyªo regulowa¢ poprzez zmian¦ przeª¡czników hebelkowych znajduj¡cych si¦ na ukªadzie FPGA.
Druga cz¦±¢, odpowiadaj¡ca za sczytywanie warto±ci 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) := A(1);
B(0) := B(1);
C(0) := C(1);
D(0) := D(1);
Na podstawie obu cz¦±ci kodu, starali±my si¦ wykona¢ ukªad nad¡»ny, którego cz¦±ci kodu za-mieszczamy poni»ej:
8
![Page 9: Prototypowanie układów elektronicznych, sprawozdanie](https://reader035.fdocuments.net/reader035/viewer/2022080905/55cf918c550346f57b8e5b81/html5/thumbnails/9.jpg)
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
Udaªo nam si¦ zrealizowa¢ generator PWM oraz logik¦ odpowiadaj¡c¡ za odczyt enkoderów, na-tomiast ukªad nad¡»ny nie dziaªaª do ko«ca poprawnie. My±limy, »e powodem bª¦dnego dziaªaniabyªa ¹le dobrana zmiana kierunku.
4 �wiczenie nr 4: �ADµC�
4.1 Cel ¢wiczenia
Celem ¢wiczenia byªo zrealizowanie kilku zada«:
1. generacja fali sinusoidalnej, 8-bitowej na jednym wyj±ciu,
2. generacja fali sinusoidalnej, 12-bitowej na jednym wyj±ciu,
3. generacja dwóch sinusoidalnych, 12-bitowych fal oraz
4. generacja dwóch sinusoidalnych, 12-bitowych fal przesuni¦tych wzgl¦dem siebie o 90o.
4.2 Wykonanie ¢wiczenia
4.2.1 Sinus 8-bitowy
MOV DACCON, #11111111b ;ustawienie na 8-bit
MOV DAC0L, #00000000b ;wyzerowanie warto±ci wyj±ciowej z przetwornika
MOV DAC0H, #00000000b
MOV DPTR, #Sin8bit ;ustawienie wska¹nika na pocz¡tek tablicy sinus
9
![Page 10: Prototypowanie układów elektronicznych, sprawozdanie](https://reader035.fdocuments.net/reader035/viewer/2022080905/55cf918c550346f57b8e5b81/html5/thumbnails/10.jpg)
MOV R1, #0
LOOP:
CLR A
MOVC A, @A+DPTR ; aktualna wartosac sinusa
INC DPL ; zwiekszenie DPTR ,
MOV DAC0L,A ; wyslanie danych na przetwornik
MOV R1,DPL ;inkrementacja R1
CJNE R1,#64, LOOP ;je±li R1 nie doliczyªo do 64, skacz
MOV DPTR, #Sin8bit ;je±li R1 osi¡gn¦ªo 64, ustaw wska¹nik na pocz¡tek tablicy sin
AJMP LOOP
4.2.2 Sinus 12-bitowy
Sinus 12-bitow ró»ni si¦ od poprzedniego kilkoma rzeczami:
MOV DACCON, #01111111b ;konfiguracja na 12-bit
MOV DAC0L, #00000000b
MOV DAC0H, #00000000b
MOV DPTR, #Sin12bit ;ustawienie na pocz¡tek tablicy 12-bitowego sin
MOV R1,#0
LOOP:
CLR A
MOVC A,@A+DPTR
MOV DAC0H, A
INC DPTR ; wska¹nik jest inkrementowany 2 razy
CLR A
MOVC A, @A+DPTR
MOV DAC0L, A
INC DPTR ; 2 inkrementacja wska¹nika
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¦ LOOP :
MOV DAC1L, #00000000b
MOV DAC1H, #00000000b
10
![Page 11: Prototypowanie układów elektronicznych, sprawozdanie](https://reader035.fdocuments.net/reader035/viewer/2022080905/55cf918c550346f57b8e5b81/html5/thumbnails/11.jpg)
oraz dodanie odpowiednich linii:
MOV DAC1L, A
oraz
MOV DAC1H, A
przy zapisywaniu warto±ci do wyj±cia.
4.2.4 Dwa sinusy 12-bitowe przesuni¦te w fazie
MOV DACCON, #01111111b ;ustawienie na dwa 12-bitowe wyjscia
MOV DAC1H, #00000000b
MOV DAC0H, #00000000b
MOV DAC1L, #00000000b
MOV DAC0L, #00000000b
MOV DPTR, #Sin12bit
MOV R1,#48 ;dwa rejestry R1 i R4 sªu»¡ do
;wchodzenia do etykiet
MOV R4,#64
MOV R2,#00 ;dwa rejestry R2 i R3 odpowiadaj¡
;za przesuni¦cie wska¹nika w tablicy
MOV R3,#32
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
![Page 12: Prototypowanie układów elektronicznych, sprawozdanie](https://reader035.fdocuments.net/reader035/viewer/2022080905/55cf918c550346f57b8e5b81/html5/thumbnails/12.jpg)
DEC R1
DEC R4
CLR A
MOV A,R1 ;do akumulatora przypisujemy warto±¢ R1
JZ LOOP1 ;je±li jest równa 0, nast¦puje skok
MOV A,R4 ;podobnie z rejestrem R4
JZ LOOP2
LJMP LOOP
LOOP1: ;w obu p¦tlach zmieniamy adresy na które
;wskazuje wska¹nik
MOV DPTR, #Sin12bit
MOV R3,#00
MOV R2,#96
MOV R1,#64
LJMP LOOP
LOOP2:
MOV DPTR, #Sin12bit
MOV R3,#32
MOV R2,#00
MOV R4,#64
MOV R1,#48
LJMP LOOP
4.3 Podsumowanie
Udaªo si¦ nam zrealizowa¢ wszystkie cele, co potwierdzili±my wy±wietlaniem wyników dziaªaniakodów na oscyloskopie.
12