Spisu treści:

Generator przebiegów Arduino: 5 kroków (ze zdjęciami)
Generator przebiegów Arduino: 5 kroków (ze zdjęciami)

Wideo: Generator przebiegów Arduino: 5 kroków (ze zdjęciami)

Wideo: Generator przebiegów Arduino: 5 kroków (ze zdjęciami)
Wideo: PWM dla POCZĄTKUJĄCYCH, modulacja szerokości impulsów, TEORIA, krok po kroku 2024, Listopad
Anonim
Generator przebiegów Arduino
Generator przebiegów Arduino

Aktualizacja z lutego 2021: sprawdź nową wersję z 300-krotną częstotliwością próbkowania, opartą na Raspberry Pi Pico

W laboratorium często potrzebny jest powtarzalny sygnał o określonej częstotliwości, kształcie i amplitudzie. Może to być test wzmacniacza, sprawdzenie obwodu, komponentu lub siłownika. Potężne generatory przebiegów są dostępne na rynku, ale stosunkowo łatwo jest zrobić użyteczny z Arduino Uno lub Arduino Nano, patrz na przykład:

www.instructables.com/id/Arduino-Waveform-…

www.instructables.com/id/10-Resister-Ardui…

Oto opis innego z następującymi funkcjami:

* Dokładne przebiegi: 8-bitowe wyjście przy użyciu R2R DAC, kształt 256 próbek

* Szybko: częstotliwość próbkowania 381 kHz

* Precyzyjny: zakres częstotliwości kroków 1mHz. Tak dokładny jak kryształ Arduino.

* Łatwa obsługa: ustawianie kształtu fali i częstotliwości za pomocą pojedynczego enkodera obrotowego

* Szeroki zakres amplitud: miliwolty do 20V

* 20 predefiniowanych przebiegów. Łatwo dodać więcej.

* Łatwy do wykonania: Arduino Uno lub Nano plus standardowe komponenty

Krok 1: Rozważania techniczne

Wykonywanie sygnału analogowego

Wadą Arduino Uno i Nano jest to, że nie ma konwertera cyfrowo-analogowego (DAC), więc nie jest możliwe wyprowadzenie napięcia analogowego bezpośrednio na piny. Jednym z rozwiązań jest drabinka R2R: 8 pinów cyfrowych jest podłączonych do sieci rezystorów, dzięki czemu można osiągnąć 256 poziomów wyjściowych. Dzięki bezpośredniemu dostępowi do portu Arduino może ustawić 8 pinów jednocześnie za pomocą jednego polecenia. Do sieci rezystorów potrzeba 9 rezystorów o wartości R i 8 o wartości 2R. Użyłem 10kOhm jako wartości R, która utrzymuje prąd z pinów do 0,5mA lub mniej. Myślę, że R = 1kOhm może również działać, ponieważ Arduino może z łatwością dostarczyć 5mA na pin, 40mA na port. Ważne jest, aby stosunek oporników R do 2R wynosił naprawdę 2. Najłatwiej to osiągnąć, łącząc szeregowo 2 oporniki o wartości R, co daje łącznie 25 oporników.

Akumulator fazowy

Generowanie przebiegu sprowadza się następnie do wielokrotnego wysyłania sekwencji 8-bitowych liczb do pinów Arduino. Przebieg jest przechowywany w tablicy 256 bajtów, a tablica ta jest próbkowana i wysyłana do pinów. Częstotliwość sygnału wyjściowego jest określona przez szybkość poruszania się po tablicy. Solidnym, precyzyjnym i eleganckim sposobem na to jest akumulator fazy: 32-bitowa liczba jest zwiększana w regularnych odstępach czasu, a 8 najbardziej znaczących bitów używamy jako indeksu tablicy.

Szybkie pobieranie próbek

Przerwania pozwalają na próbkowanie w ściśle określonym czasie, ale narzut przerwań ogranicza częstotliwość próbkowania do ~100kHz. Nieskończona pętla do aktualizacji fazy, próbkowania przebiegu i ustawiania pinów zajmuje 42 cykle zegara, osiągając w ten sposób częstotliwość próbkowania 16MHz/42=381kHz. Obracanie lub wciskanie enkodera obrotowego powoduje zmianę pinu i przerwanie, które wydostaje się z pętli w celu zmiany ustawienia (przebiegu lub częstotliwości). Na tym etapie 256 liczb w tablicy jest przeliczanych ponownie, dzięki czemu nie trzeba wykonywać rzeczywistych obliczeń przebiegu w pętli głównej. Absolutna maksymalna częstotliwość, jaką można wygenerować, wynosi 190 kHz (połowa częstotliwości próbkowania), ale wtedy są tylko dwie próbki na okres, więc nie ma dużej kontroli nad kształtem. Interfejs nie pozwala więc na ustawienie częstotliwości powyżej 100kHz. Przy 50 kHz jest 7-8 próbek na okres, a przy 1,5 kHz i poniżej wszystkie 256 liczb zapisanych w tablicy jest próbkowane w każdym okresie. W przypadku przebiegów, w których sygnał zmienia się płynnie, na przykład sinusoida, pomijanie próbek nie stanowi problemu. Ale w przypadku przebiegów o wąskich skokach, na przykład fali prostokątnej o małym współczynniku wypełnienia, istnieje niebezpieczeństwo, że dla częstotliwości powyżej 1,5 kHz brak pojedynczej próbki może spowodować, że przebieg nie będzie zachowywał się zgodnie z oczekiwaniami

Dokładność częstotliwości

Liczba, o którą zwiększana jest faza w każdej próbce, jest proporcjonalna do częstotliwości. Częstotliwość można więc ustawić z dokładnością do 381kHz/2^32=0,089mHz. W praktyce taka dokładność nie jest potrzebna, dlatego interfejs ogranicza częstotliwość do ustawienia w krokach co 1mHz. Bezwzględna precyzja częstotliwości zależy od precyzji częstotliwości zegara Arduino. Zależy to od typu Arduino, ale większość określa częstotliwość 16.000 MHz, a więc precyzję ~10^-4. Kod pozwala na modyfikację stosunku częstotliwości i przyrostu fazy w celu skorygowania małych odchyleń przy założeniu 16MHz.

Buforowanie i amplifikacja

Sieć rezystorów ma wysoką impedancję wyjściową, więc jej napięcie wyjściowe szybko spada po podłączeniu obciążenia. Można to rozwiązać poprzez buforowanie lub wzmacnianie wyjścia. Tutaj buforowanie i wzmacnianie odbywa się za pomocą wzmacniacza operacyjnego. Użyłem LM358, bo trochę miałem. Jest to powolny wzmacniacz operacyjny (szybkość narastania 0,5 V na mikrosekundę), więc przy wysokiej częstotliwości i wysokiej amplitudzie sygnał zostaje zniekształcony. Dobrą rzeczą jest to, że może obsługiwać napięcia bardzo bliskie 0V. Napięcie wyjściowe jest jednak ograniczone do ~2V poniżej szyny, więc użycie zasilania +5V ogranicza napięcie wyjściowe do 3V. Moduły Step-up są kompaktowe i tanie. Podając +20V do wzmacniacza operacyjnego, może generować sygnały o napięciu do 18V. (Uwaga, schemat mówi LTC3105, ponieważ był to jedyny step-up, jaki znalazłem we Fritzing. W rzeczywistości użyłem modułu MT3608, zobacz zdjęcia w następnych krokach). Zdecydowałem się zastosować zmienne tłumienie na wyjściu przetwornika cyfrowo-analogowego R2R, a następnie użyć jednego z wzmacniaczy operacyjnych do buforowania sygnału bez wzmocnienia, a drugiego do wzmocnienia o wartości 5,7, aby sygnał mógł osiągnąć maksymalną moc wyjściową około 20 V. Prąd wyjściowy jest raczej ograniczony, ~10mA, więc może być potrzebny mocniejszy wzmacniacz, jeśli sygnał ma napędzać duży głośnik lub elektromagnes.

Krok 2: Wymagane składniki

Dla generatora przebiegów rdzeniowych

Arduino Uno lub Nano

Wyświetlacz LCD 16x2 + trymer 20kOhm i rezystor serii 100Ohm do podświetlenia

5-pinowy enkoder obrotowy (ze zintegrowanym przyciskiem)

25 rezystorów 10kOhm

Do bufora/wzmacniacza

LM358 lub inny podwójny wzmacniacz operacyjny

moduł step-up oparty na MT3608

Rezystor zmienny 50kOhm

Rezystor 10kOhm

Rezystor 47kOhm

Kondensator 1mF

Krok 3: Budowa

Budowa
Budowa
Budowa
Budowa

Wszystko przylutowałem na płytce prototypowej 7x9cm, jak widać na zdjęciu. Ponieważ było trochę bałaganu ze wszystkimi przewodami, próbowałem pokolorować przewody z dodatnim napięciem na czerwono, a te z masą na czarno.

Enkoder, którego użyłem, ma 5 pinów, 3 z jednej strony, 2 z drugiej. Strona z 3 pinami to rzeczywisty enkoder, strona z 2 pinami to zintegrowany przycisk. Po stronie 3-pinowej środkowy pin powinien być podłączony do masy, pozostałe dwa piny do D10 i D11. Po stronie 2-pinowej jeden pin powinien być podłączony do masy, a drugi do D12.

To najbrzydsza rzecz, jaką kiedykolwiek zrobiłem, ale działa. Byłoby fajnie umieścić w obudowie, ale na razie dodatkowa praca i koszt tak naprawdę tego nie usprawiedliwiają. Nano i wyświetlacz są połączone za pomocą nagłówków. Nie zrobiłbym tego ponownie, gdybym zbudował nowy. Nie umieściłem złączy na płytce do odbierania sygnałów. Zamiast tego podnoszę je krokodylowymi przewodami z wystających kawałków drutu miedzianego, oznaczonych następująco:

R - surowy sygnał z przetwornika R2R DAC

B - sygnał buforowany

A - wzmocniony sygnał

T - sygnał timera z pinu 9

G - ziemia

+ - dodatnie „wysokie” napięcie z modułu podwyższającego napięcie

Krok 4: Kodeks

Kod, szkic Arduino, jest załączony i należy go wgrać do Arduino.

Wstępnie zdefiniowano 20 przebiegów. Dodanie jakiejkolwiek innej fali powinno być proste. Zauważ, że fale losowe wypełniają tablicę 256-wartościową wartościami losowymi, ale ten sam wzór powtarza się w każdym okresie. Prawdziwe przypadkowe sygnały brzmią jak szum, ale ten przebieg brzmi bardziej jak gwizdek.

Kod ustawia sygnał 1kHz na pinie D9 z TIMER1. Jest to przydatne do sprawdzenia taktowania sygnału analogowego. W ten sposób ustaliłem, że liczba cykli zegara wynosi 42: Jeśli przyjmę 41 lub 43 i wygeneruję sygnał 1kHz, to wyraźnie ma on inną częstotliwość niż sygnał na pinie D9. Z wartością 42 pasują idealnie.

Zwykle Arduino przerywa co milisekundę, aby śledzić czas za pomocą funkcji millis(). Zakłóciłoby to dokładne generowanie sygnału, więc konkretne przerwanie jest wyłączone.

Kompilator mówi: „Sketch wykorzystuje 7254 bajty (23%) przestrzeni pamięci programu. Maksymalnie 30720 bajtów. Zmienne globalne wykorzystują 483 bajty (23%) pamięci dynamicznej, pozostawiając 1565 bajtów dla zmiennych lokalnych. Maksymalnie 2048 bajtów”. Jest więc dużo miejsca na bardziej wyrafinowany kod. Uważaj, że być może będziesz musiał wybrać "ATmega328P (stary bootloader)", aby pomyślnie przesłać do Nano.

Krok 5: Użycie

Generator sygnału może być zasilany po prostu przez kabel mini-USB Arduino Nano. Najlepiej zrobić to za pomocą power banku, aby nie było przypadkowej pętli masy z urządzeniem, do którego może być podłączony.

Po włączeniu wygeneruje falę sinusoidalną o częstotliwości 100 Hz. Obracając pokrętło, można wybrać jeden z pozostałych 20 rodzajów fal. Obracając, gdy jest wciśnięty, kursor można ustawić na dowolną cyfrę częstotliwości, którą następnie można zmienić na żądaną wartość.

Amplitudę można regulować potencjometrem i można wykorzystać sygnał buforowany lub wzmocniony.

Bardzo pomocne jest użycie oscyloskopu do sprawdzenia amplitudy sygnału, zwłaszcza gdy sygnał dostarcza prąd do innego urządzenia. Jeśli zostanie pobrany zbyt duży prąd, sygnał będzie się przycinał, a sygnał jest mocno zniekształcony

Dla bardzo niskich częstotliwości wyjście można wizualizować za pomocą diody LED połączonej szeregowo z rezystorem 10kOhm. Częstotliwości audio można usłyszeć przez głośnik. Upewnij się, że ustawiłeś bardzo mały sygnał ~0,5V, w przeciwnym razie prąd stanie się zbyt wysoki i sygnał zacznie się przecinać.

Zalecana: