Spisu treści:
- Krok 1: Rozważania techniczne
- Krok 2: Wymagane składniki
- Krok 3: Budowa
- Krok 4: Kodeks
- Krok 5: Użycie
Wideo: Generator przebiegów Arduino: 5 kroków (ze zdjęciami)
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:29
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
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:
Funkcja DIY/Generator przebiegów: 6 kroków (ze zdjęciami)
Zrób to sam generator funkcji/przebiegów: W tym projekcie przyjrzymy się pokrótce komercyjnym generatorom funkcji/przebiegów, aby określić, jakie funkcje są ważne dla wersji DIY. Następnie pokażę Ci, jak stworzyć prosty generator funkcji, analogowy i cyfrowy
Interaktywny generator arkuszy laserowych z Arduino: 11 kroków (ze zdjęciami)
Interaktywny generator arkuszy laserowych z Arduino: Lasery mogą być używane do tworzenia niesamowitych efektów wizualnych. W tym projekcie skonstruowałem nowy rodzaj wyświetlacza laserowego, który jest interaktywny i odtwarza muzykę. Urządzenie obraca dwa lasery, tworząc dwie wirowe warstwy światła. Dołączyłem czujnik odległości
Generator muzyki oparty na pogodzie (generator Midi oparty na ESP8266): 4 kroki (ze zdjęciami)
Generator muzyki oparty na pogodzie (Generator Midi oparty na ESP8266): Cześć, dzisiaj wyjaśnię, jak zrobić własny mały generator muzyki oparty na pogodzie. Jest oparty na ESP8266, który jest trochę jak Arduino i reaguje na temperaturę, deszcz i intensywność światła.Nie oczekuj, że sprawi, że całe utwory lub akordy będą pro
Niski koszt generatora przebiegów (0 - 20 MHz): 20 kroków (ze zdjęciami)
Niski koszt generatora przebiegów (0 - 20 MHz): STRESZCZENIE Ten projekt wynika z konieczności uzyskania generatora fal o szerokości pasma powyżej 10 MHz i zniekształceniach harmonicznych poniżej 1%, a wszystko to przy niskiej cenie. Ten dokument opisuje projekt generatora fal o szerokości pasma przekraczającej
Przenośny generator funkcji na Arduino: 7 kroków (ze zdjęciami)
Przenośny generator funkcji na Arduino: Generator funkcji jest bardzo przydatnym narzędziem, zwłaszcza gdy rozważamy testowanie odpowiedzi naszego obwodu na określony sygnał. W tej instrukcji opiszę sekwencję budowania małego, łatwego w użyciu, przenośnego generatora funkcji. Cechy