Generator funkcyjny Wykonany przez Data wykonania Paweł Białas Adam Miarka Maksymilian Szczepanik 13 czerwca 2015 r. Generator został zbudowany w ramach XI Prezentacji Aplikacji Mikrokontrolerów Freescale. Poniższy dokument zawiera ogólne informacje nt. budowy i działania generatora. Spis treści Działanie...1 Interfejs...1 Parametry sprzętu...2 Uproszczony schemat układu...3 Przykładowe fragmenty kodu...5 Kod algorytmu korygującego częstotliwość:...5 Kod obsługi przycisków:...6 Przykładowe przebiegi z generatora...8 Bibliografia...10 Działanie Nasz układ to urządzenie pozwalające na generowanie sygnału elektrycznego o zadanej częstotliwości. Dostępne sygnały wyjściowe to sygnał prostokątny, trójkątny ( piła ) i sinusoidalny. Układ po rozpoczęciu generowania włącza odpowiedni układ kondensatorów, a następnie mierzy częstotliwość otrzymaną na wyjściu i zmienia napięcie sterujące w pewnym stopniu. Jeżeli częstotliwość na wyjściu przekroczy zadaną, układ zmniejszy stopień zmiany napięcia sterującego, oraz zmieni kierunek zmiany. W ten sposób po pewnym czasie na wyjściu znajdzie się przybliżona zadana częstotliwość. Interfejs Wybrana częstotliwość jest wyświetlana na wyświetlaczu. Generator obsługuje się poprzez interfejs zbudowany z trzech przycisków: 1) uruchamia generowanie wybranego sygnału 2) odpowiada za zmianę wartości wybranego rzędu wielkości 3) odpowiada za zmianę zaznaczenia rzędu wielkości Aby rozpocząć generowanie należy przy użyciu przycisku 3. wybierać kolejne pozycje dziesiętne liczby i zmieniać je przy użyciu przycisku 2. Gdy zostanie wprowadzona żądana liczba można uruchomić generowanie przy użyciu przycisku 1. Aby uruchomić generowanie nowej częstotliwości należy zresetować układ. 1/10
Wyjścia układu znajdują się odpowiednio: sygnał sinusoidalny: wyjście nr 2 ICL8038 (niewyprowadzone) sygnał trójkątny: wyjście przy układzie kondensatorów sygnał prostokątny: wyjście w układzie skalowania napięcia do pomiaru częstotliwości (dostępne różne amplitudy) Parametry sprzętu Generator pozwala na otrzymanie przebiegów: trójkątnego, prostokątnego i sinusoidalnego. Osiągalne są częstotliwości z zakresu 17Hz 315Hz oraz 420Hz 2,12 khz. Wykorzystany sprzęt: Płytka rozwojowa Freedom KL25Z z 32-bitowym procesorem ARM Cortex-M0 Układ generujący ICL8038 Wyświetlacz zgodny z HD44780 Cały układ używa zasilania 12V dla części generującej i 3,3V dla części sterującej. Program wgrany na procesor został napisany w C++, przy użyciu platformy developerskiej mbed.org. 2/10
Uproszczony schemat układu Układ generujący ICL8038 jest sterowany przy użyciu napięcia z analogowego wyjścia płytki FRDM oraz układu rezystorów określających prąd ładowania kondensatorów, które są podłączane do układu przez klucze sterowane przez FRDM. Układ ICL wykorzystuje czas ładowania/rozładowywania kondensatorów jako podstawę generowanego sygnału. Zdjęcie działającego układu 3/10
usb rst FRDM KL25Z Comparator in Analog out D4-7 RS E HD44780 Układ kondensatorów ICL8038 12V Układ kondensatorów 12V ICL8038 12V 12V KL25Z 4/10
Przykładowe fragmenty kodu Kod algorytmu korygującego częstotliwość: Ticker pstrykacz; ComparatorIn cmp(ptc8, NC); //ustawienie w funkcji main: cmp.treshold(0.5); volatile int a_licznik = 0; volatile int a_lock = 0; volatile int a_desired = 100; volatile float vstep = VOLTAGE_STEP; //funkcja wywoływana przez komparator void cmpr() { a_licznik++; void v_dec(); void v_inc(); void adjust(int result) { if(result > a_desired) v_dec(); else if(resulst < a_desired) v_inc(); //funkcja wywoływana przez timer void ont() { //wstrzymanie funkcji komparatora cmp.rising(0); if(a_lock) { //interpretacja wartości z licznika a_lock = 0; adjust(a_licznik); else { //zerowanie licznika a_licznik = 0; a_lock = 1; //ponowne uruchomienie komparatora cmp.rising(&cmpr); 5/10
//funkcja wywoływana przez przycisk uruchomienia generowania void initwork() { a_desired = freq; cmp.rising(&cmpr); //rejestracja przerwania na komparatorze pstrykacz.attach(&ont, 1); //rejestracja przerw. na timerze volatile int lastsign = 0; //funkcje v_inc i v_dec zmieniają wartość napięcia na wyjściu, w razie przekroczenia oczekiwanej //wartości zmniejszają dwukrotnie korekcję po jednym pomiarze //void setv(float v) przyjmuje v z zakresu (0, 1) i skaluje je na właściwą wartość na wyjściu //analogowym void v_inc() { if(lastsign == -1) vstep /= 2; setv(voltage + vstep); lastsign = 1; void v_dec() { if(lastsign == 1) vstep /= 2; setv(voltage - vstep); lastsign = -1; Kod obsługi przycisków: //Przyciski w trybie pullup zwarte ze stanem wysokim, //naciśnięcie odczytywane przy zwarciu pinu z masą DigitalIn mode_switcher(d5); //w main: mode_switcher.mode(pullup); DigitalIn sb1(d2); //w main: sb1.mode(pullup); DigitalIn sb2(d3); //w main: sb2.mode(pullup); int freq_pos = 0; //wykorzystywane do rysowania interfejsu znacznik //wyboru pozycji dziesiętnej volatile int switch_lock; #define SWITCH_LOCK_DEFAULT 14097 //eliminacja drgania styków void inccurrent(); // zwiększenie wartości wybranej pozycji dziesiętnej int sb1_lock = 0; int sb2_lock = 0; int checkbuttons() { //wywoływana w while(1) wraz //z rysowaniem interfejsu 6/10
if(switch_lock) { switch_lock--; return 0; if(!mode_switcher) { switch_lock = SWITCH_LOCK_DEFAULT; return 1; //powoduje break w while(1) if(!sb1) { if(sb1_lock) return 0; switch_lock = SWITCH_LOCK_DEFAULT; sb1_lock = 1; freq_pos = (freq_pos+1)%5; //kolejna pozycja dziesiętna return 2; else { sb1_lock = 0; switch_lock = SWITCH_LOCK_DEFAULT; if(!sb2) { if(sb2_lock) return 0; switch_lock = SWITCH_LOCK_DEFAULT; sb2_lock = 1; inccurrent(); return 2; else { sb2_lock = 0; switch_lock = SWITCH_LOCK_DEFAULT; return 0; 7/10
Przykładowe przebiegi z generatora Do sprawdzania sygnałów używaliśmy miernika Siglent SDS 1022DL. Interfejs użytkownika 8/10 Przebieg prostokątny 0-8V
Przebieg trójkątny Przebieg sinusoidalny Robienie pomiarów 9/10
Bibliografia Literatura: Sztuka elektroniki, Paul Horowitz ICL8038 Datasheet, Intersil Corporation Wykorzystane biblioteki z platformy mbed.org Obsługa wyświetlacza HD44780, Simon Ford Obsługa wejścia komparatora, Frank Vannieuwkerke 10/10