Oscyloskop

Typ_projektu
microPython
Zdjecie główne
Krótki opis projektu

Projekt został stworzony w celu zobrazowania działania oscyloskopu. Sygnał wytworzony przez generator i przekształcony przez układ elektryczny jest prezentowany w formie wykresu. Użytkownik może badać działanie oscyloskopu poprzez zmianę parametrów na generatorze oraz określenie podziałki czasowej.

Niezbędne elementy

1. Płytka ESP8266
2. Ekran 2.4 TFT SPI 240x320
3. Generator sygnału prostokątnego XY-LPWM
4. Dioda LED
5. Kondensator 10uF 50V
6. Rezystor 330 Ohm x2
7. Rezystor 3300 Ohm
8. Kable damsko-męskie

Opis projektu

Prosty oscylator rysuje wykres sygnału generowanego przez układ. Ze względu na czas potrzebny na rysowanie nawet pojedynczego piksela jest zbyt duży w porównaniu do częstotliwości generowanego sygnału, płytka zbiera sygnał z pewnego interwału czasowego, następnie wyświetla go na ekranie. Układ elektryczny na płytce prototypowej pełni dwie role. Po pierwsze, zawiera w sobie dzielnik napięcia, ponieważ inaczej napięcie wyjściowe byłoby za duże do odczytania przez płytkę. Po drugie, modyfikuje wygenerowany sygnał prostokątny i zwiększając czas narastania sygnału. Za pomocą przycisków na generatorze i modyfikację układu elektrycznego, można zmieniać odczytywany sygnał. Istnieje możliwość modyfikacji podziałki czasowej, definiowanej przez użytkownika w programie. Istnieją dwa tryby pracy "simple" - zalecany, nadpisuje na ekranie poprzedni wykres w czasie i "cont" - dodatkowy, przesuwa wykres, nowy sygnał rysowany jest za poprzednim, gorsza płynność.

Zdjęcia
kod programu
from ili9341 import Display
import time
from machine import Pin, SPI
adc = machine.ADC(0)
#ustawienie podziałki czasowej
podzialka_czasowa_us=100
#ustawienie trybu pracy (simple - zalecany, cont - opcjonalny)
work_mode="simple"

#setup
spi = SPI(1, 40000000, 14, 13)
tft = Display(spi, dc=Pin(2), cs=Pin(4), rst=Pin(0))
tft.clear()
x_start = 11
tab=[]


#rysowanie osi
tft.draw_vline(10,0,320,0X001F)
tft.draw_hline(0,10,240,0X001F)
tft.draw_line(10,319,0,310,0X001F)
tft.draw_line(10,319,20,310,0X001F)
tft.draw_line(239,10,230,0,0X001F)
tft.draw_line(239,10,230,20,0X001F)

#rysowanie pierwszego wykresu
for i in range(310):
    tab.append(adc.read())
    time.sleep_us(1)

for i in range(309):
    x = x_start + i  # Zwiększamy wartość x za każdym razem, aby przesunąć piksel w prawo
    #tft.draw_pixel(adc.read(), x, 0XF800) #opcja do rysowania wyników "na bieżąco", nie generuje czytelngo wykresu
    tft.draw_pixel(tab[i], x, 0XF800)
    #rysowanie podziałki czasowej
    if i%podzialka_czasowa_us==0:
        for j in range(6):
            tft.draw_hline(j*40,x,10,0X07E0)
    time.sleep(0.01)

#kontynuacja w zależności od trybu
if work_mode=="cont":
    while True:
        tab=[]

        for i in range(309):
            tab.append(adc.read())
            time.sleep_us(1)

        for i in range(309):
            x = x_start + i  # Zwiększamy wartość x za każdym razem, aby przesunąć piksel w prawo
            #tft.draw_pixel(adc.read(), x, 0XF800)
            tft.scroll(i)
            tft.draw_hline(11,x,240-11-10,0)
            tft.draw_pixel(tab[i], x, 0XF800)
            if i%podzialka_czasowa_us==0:
                for j in range(6):
                    tft.draw_hline(j*40,x,10,0X07E0)
                    time.sleep(0.01)
elif work_mode=="simple":
    while True:
        tab=[]
        for i in range(309):
            tab.append(adc.read())
            time.sleep_us(1)

        for i in range(309):
            x = x_start + i  # Zwiększamy wartość x za każdym razem, aby przesunąć piksel w prawo
            #tft.draw_pixel(adc.read(), x, 0XF800)
            tft.draw_hline(11,x,240-11-10,0)
            tft.draw_pixel(tab[i], x, 0XF800)
            if i%podzialka_czasowa_us==0:
                for j in range(6):
                    tft.draw_hline(j*40,x,10,0X07E0)
            time.sleep(0.01)
    
    
Pliki_projektu
Schemat
Tagi
oscyloskop tft spi esp8266 wykres