Generator sygnałów z zadawaniem parametrów z komputera

Transkrypt

Generator sygnałów z zadawaniem parametrów z komputera
Politechnika Warszawska
Wydział Elektroniki i Technik Informacyjnych
Mikrokontrolery ARM
Generator sygnałów z zadawaniem parametrów z komputera
Jakub Janeczko ([email protected])
Prowadzący przedmiot: dr inż. Mariusz Suchenek
Semestr 2016L
1 Wstęp
Tematem projektu jest generator sygnałów z możliwością zadawania parametrów z urzyciem
komputera. W poprzednim semestrze (2015Z) projekt o tym samym temacie był realizowany przez
Macieja Rzepińskiego. Aby nie powielać tej samej pracy postanowiłem zmodyfikować istniejący
projekt i rozwinąć go w kierunku generatora DDS (direct digital synthesis).
Celem mojego projektu jest zrealizowanie dwukanałowego generator DDS programowalnego
dynamicznie przez sieć (poprzez Ethernet).
2 Ogólna zasada działania
Na urządzeniu będzie uruchomiony serwer, który po podłączeniu kabla rozpoczyna nasłuchiwanie na z
góry ustalonym porcie. Po nawiązaniu połączenia urządzenie będzie oczekiwać na konfigurację pracy.
Konfiguracja będzie zawierać:
•
numer kanału do konfiguracji
•
częstotliwość próbkowania (częstotliwość zmiany na kolejną próbkę)
•
tablica próbek
•
sumę kontrolną/hash przesłanych danych
Pierwszą czynnością po odebraniu konfiguracji będzie weryfikacja jej integralności poprzez
sprawdzenie sumy kontrlolnej/hash-u. Następnie należy skonfigurować DAC i kontroler DMA i
rozpocząć generację próbek.
Próbki będą kopionowane z pamięci RAM do przetwornika DAC przy użyciu kontrolera DMA aby
odciążyć procesor. Aby efektywniek wykorzystać szynę APB1, do której podłączony jest konwerter
DAC możliwe będzie urzycie trybu dual DAC (jedna operacja kopiowania dla dwóch kanałów
jednocześnie).
Do realizacji projektu zamierzam urzyć zestawu STM32F4DISCOVERY z procesorem
STM32F407VGT6, ponieważ posiada on dwukanałowy konwerter cyfrowo-analogowy (DAC) oraz
zestawu STM32F4DIS-BB do komunikacji poprzez Ethernet.
3 Opis
Jako punkt początkowy użyłem przykładu tcp_echo serwera dostarczonego przez ST. Echo serwer
został przerobiony tak aby odbierać konfiguracyjną ramkę konfiguracyjną oraz została dodana obsługa
konwersji C/A. Do budowy projektu używam środowiska EWARM. Próby z użyciem kompilatora
GCC nie zakończyły się na razie powodzeniem.
Oprogramowanie sentyzatora można podzielić na dwie funkcjonalne części: serwer (dds_server.c) i
aplikacja (dds.c). Zadaniem serwera jest odebranie kompletnej ramki konfiguracyjnej i przekazanie jej
do części aplikacyjnej. Serwer może znajdować się w trzech satnach:
1. DS_IDLE – bezczynny, żaden klient nie jest połączony z serwerem.
2. DS_HEADER – oczekiwanie na nagłówek ramki. Serwer przechodzi do tego stanu gdy klient
połączy się z nim. Najistotniejszą daną dla serwera jest wielkość całej ramki danych, która jest
zawarta w nagłówku, dzięki niej będzie mógł sprawdzić czy ma wystarczającą ilośc pamięci na
przechowanie wszystkich danych. Po pobraniu nagłówka serwer przechodzi w stan
DS_RECEIVING.
3. DS_RECEIVING – serwer odbiera pozostałe dane. Gdy odbierze co najmniej tyle danych ile
zostało podane w nagłówku, przekazuje je do części alikacyjnej.
Część aplikacyjna zawiera funkcje:
1. DDS_Init – do inicjalizacji wszystkich peryferiów potrzebnych do realizacji DDS.
2. DDS_Start – która konfiguruje odpowiednie peryferia na podstawie kompletnej ramki danych i
rozpoczyna konweresje C/A.
3. DDS_Stop – zatrzymanie konwersji.
Urządzenie (aplikacja) może działać w trzech trybach
1. niezależnym (independent) – każdy z kanałów jest wyzwalany odzielnym timerem, używane są
różne kanały DMA
2. pojedynczy wyzwalacz (single trigger) – każdy z kanaów wyzwalany jest z tego samego timera,
różne kanały DMA.
3. podwójny (dual) – dwa kanały są wyzwalane z tego samego timera, muszą mieć taką samą ilość
próbek, używany jest jeden kanal DMA oraz dane dostarczone muszą być w formacie
podwójnym (na zmiane).
Urądzenie sygnalizuje swój stan także poprzez diody LED
1. niebieska – świeci się podczas aktywnego połączenia TCP (da się zobaczeć).
2. zielona – dioda konwersji C/A, gaśnie i zapala się naprzemiennie, zmienia swój stan gdy
wszyskie próbki zostały przekonwertowane i rozpoczyna się konwersja od początku.
3. czerwona – błąd protokołu dds_serwera
4. pomarańczowa – błąd (niepoprawność) danych dostarczonych do aplikacji
Ramka danych - nagłówek
Nazwa
Typ
Opis
magic
char[4]
4 chary tworzące napis „MARM”. Sygnaizacja
początku ramki
checksum
uint32_t
Skrót/suma kontrolna danych. Ma nacelu
upewnienie się, że klient wysyła poprawne dane
tworzące ramkę konfiguracyjną. Nie trzeba
sprawdzać czy nastąpiło przekłamanie w
procesie transmisji – to weryfikowane jest na
poziomie protokołu.
size
uint32_t
Wielkość całej ramki danych
mode
uint8_t
Tryb działania, jeden z independent, sigle trigger
i dual
ch
dds_chconfig[2] Konfiguracja kanałów
data
void[0]
Początek danych zawierających próbki
Ramka danych – dds_chconfig – konfiguracja kanału
Nazwa
Typ
Opis
enabled
uint8_t
1 – kanał włączony, 0 - wyłączony
data_format uint8_t
Format danych, jeden z DDS_FORMAT_8bit,
DDS_FORMAT_12bit_LEFT,
DDS_FORMAT_12bit_RIGHT
data_offset uint32_t
Przesunięcie początka danych dla kanału,
liczone od dds_header->data
data_size
uint32_t
Rozmiar wszystkich próbek dla danego kanału
period
uint32_t
Period timera
prescaler
uint16_t
Prescaler timera
Odpowiedzi zwracane przez serwer
Nazwa
Opis
OK
Ok
Invalid header
Niepoprawny nagłówek, nie rozpoczyna się od „MARM”
Invalid checksum
Niepoprawna suma kontrolna
Invalid data
Niepoprawny format danych
Invalid configuration Nieprawidłowa konfoguracja
No enough memory Brak pamięci
timeout
Po 30 sekundach oczekiwania na dane, serwer rozłączy
się automatycznie
W trybie single trigger ustawienia timera dla drugiego kanału są ignorowane. W trybie dual, cały
deskryptor drugiego kanału jest ignorowany.
DDS klent
Częścią projektu jest także aplikacja kliencka (napisana w Pythonie) uruchamiana na komputerze,
której zadaniem jest stworzenie poprawnej ramki konfiguracyjne i wysłanie do serwera DDS (na porcie
1234).
4 Implementacja
Projekt został wstępnie zaimplementowany, brakuje opcji liczenia sumy kontrolnej, weryfikacji
poprawności formatu danych (próbek) i konfiguracji. Aktualny stan projektu przedstawia się
następująco. Serwer działa poprawnie odbiera i przekazuje dane (zweryfikowane za pomocą debuggera
EWARM), widać zapaljącą się na chwile diodę niebieską. Natomiast konwersja C/A nie rusza.
Najprawdopodobniej niepoprawnie skonfigurowane timery i/lub DMA.
Niestety brakuje czasu na dopracowanie projektu, dlatego wysyłam projekt w takim stanie.
Kod projektu znajduje się tutaj: https://github.com/yay6/dds_marm
5 Możliwe modyfikacje
Dodatkowe funkcje jakie mogą być dodane do projektu to:
1. dodawanie próbek pośrednich między zapisanymi w RAM-ie np. poprzez liniową
aproksymacje. Dzięki temu można zmniejszyć tablice próbek dla niektórych przebiegów.
2. Użycie karty SD do przechowywania próbek lub/i do zapamiętyania stanu między odłączeniami
zasilania.
6 Schemat połączeń
STM32F407VGT6
LAN8720
PB11
TXEN
PB12
TXD0
PB13
TXD1
PC4
RXD0/MODE0
PC5
RXD1/MODE1
PA7
CRS_DV/MODE2
PA2
MDIO
PC1
MDC
PA1
NINT/REFCLKO
PE2
NRST
STM32F407VGT6
PA4/DAC_OUT1
Wyjście – kanał 1
PA5/DAC_OUT2
Wyjście – kanał 2
PA0
Synchronizacja

Podobne dokumenty