klasa ADC – konwersja analogowo-cyfrowa¶
Użycie:
import pyb
adc = pyb.ADC("P6")
val = adc.read()
Zobacz pyb.ADCAll, aby uzyskać jednoczesny dostęp do każdego kanału ADC oraz do wewnętrznych sensorów temperatury matrycy MCU, VBAT i VREFINT.
Konstruktory¶
- class pyb.ADC(pin: int | str | Pin)¶
Tworzy obiekt ADC powiązany z podanym pinem. Umożliwia to następnie odczytywanie wartości analogowych na tym pinie.
Metody¶
- read() int¶
Odczytuje wartość na analogowym pinie i zwraca ją. Zwrócona wartość będzie się mieścić w zakresie od 0 do 4095.
- read_timed(buf: bytearray | 'array.array', timer: Timer | int) int¶
Odczytuje wartości analogowe do
bufz szybkością ustaloną przez obiekttimer.bufmoże być na przykład bytearray lub array.array. Wartości ADC mają rozdzielczość 12-bitową i są zapisywane bezpośrednio dobuf, jeśli rozmiar jego elementów wynosi 16 bitów lub więcej. Jeślibufma tylko elementy 8-bitowe (np. bytearray), rozdzielczość próbki zostanie zmniejszona do 8 bitów.timerpowinien być obiektem Timer, a próbka jest odczytywana za każdym razem, gdy licznik czasu (timer) wyzwala. Licznik czasu (timer) musi być już zainicjowany i działać z żądaną częstotliwością próbkowania.Aby zachować zgodność z wcześniejszym zachowaniem tej funkcji,
timermoże też być liczbą całkowitą określającą częstotliwość (w Hz), z jaką ma odbywać się próbkowanie. W takim przypadku Timer(6) zostanie automatycznie skonfigurowany do działania z podaną częstotliwością.Przykład z użyciem obiektu Timer (preferowany sposób):
adc = pyb.ADC(pyb.Pin.board.P6) # create an ADC on pin P6 tim = pyb.Timer(6, freq=10) # create a timer running at 10Hz buf = bytearray(100) # buffer to hold the samples adc.read_timed(buf, tim) # sample 100 values, taking 10s
Przykład z użyciem liczby całkowitej jako częstotliwości:
adc = pyb.ADC(pyb.Pin.board.P6) # create an ADC on pin P6 buf = bytearray(100) # buffer of 100 bytes adc.read_timed(buf, 10) # read 100 samples at 10Hz (10s total) for val in buf: print(val)
Ta funkcja nie alokuje żadnej pamięci sterty. Działa w trybie blokującym: nie wraca do programu wywołującego, dopóki bufor nie zostanie zapełniony.
- static read_timed_multi(adcs: Tuple[ADC, ...], bufs: Tuple[bytearray | 'array.array', ...], timer: Timer) bool¶
Wyodrębnia dane o względnym czasie lub fazie z wielu przetworników ADC.
Odczytuje wartości analogowe z wielu przetworników ADC do buforów z szybkością ustaloną przez obiekt timer. Za każdym razem, gdy licznik czasu (timer) wyzwala, próbka jest szybko odczytywana kolejno z każdego ADC.
Instancje ADC i bufora są przekazywane w krotkach, przy czym każdy ADC ma powiązany bufor. Wszystkie bufory muszą być tego samego typu i mieć tę samą długość, a liczba buforów musi być równa liczbie przetworników ADC.
Bufory mogą być na przykład
bytearraylubarray.array. Wartości ADC mają rozdzielczość 12-bitową i są zapisywane bezpośrednio do bufora, jeśli rozmiar jego elementów wynosi 16 bitów lub więcej. Jeśli bufory mają tylko elementy 8-bitowe (np.bytearray), rozdzielczość próbki zostanie zmniejszona do 8 bitów.timer musi być obiektem Timer. Licznik czasu (timer) musi być już zainicjowany i działać z żądaną częstotliwością próbkowania.
Kamery STM32 OpenMV Cam udostępniają tylko jeden pin nagłówka obsługujący ADC (
P6), więc na fabrycznym sprzęcieread_timed_multijest przydatne tylko z pojedynczym ADC. Aby używać go z więcej niż jednym ADC, podłącz dodatkowe wejścia analogowe poprzez odwołaniacpuklasypyb.Pin.Przykład odczytu jednego ADC:
import array adc = pyb.ADC(pyb.Pin.board.P6) tim = pyb.Timer(8, freq=100) rx = array.array("H", (0 for i in range(100))) # Sample 100 values at 100Hz (takes one second). pyb.ADC.read_timed_multi((adc,), (rx,), tim) for val in rx: print(val)
Ta funkcja nie alokuje żadnej pamięci sterty. Działa w trybie blokującym: nie wraca do programu wywołującego, dopóki bufory nie zostaną zapełnione.
Funkcja zwraca
True, jeśli wszystkie próbki zostały pozyskane z prawidłowym taktowaniem. Przy wysokich szybkościach próbkowania czas potrzebny na pozyskanie zestawu próbek może przekroczyć okres licznika czasu (timer). W takim przypadku funkcja zwracaFalse, wskazując utratę precyzji w odstępie między próbkami. W skrajnych przypadkach próbki mogą zostać pominięte.Maksymalna szybkość zależy od czynników takich jak szerokość danych oraz liczba odczytywanych przetworników ADC. W testach dwa przetworniki ADC były próbkowane z szybkością licznika czasu (timer) 210 kHz bez przekroczenia. Próbki były pomijane przy 215 kHz. Dla trzech przetworników ADC granica wynosi około 140 kHz, a dla czterech około 110 kHz. Przy wysokich szybkościach próbkowania wyłączenie przerwań na czas trwania operacji może zmniejszyć ryzyko sporadycznej utraty danych.