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 buf z szybkością ustaloną przez obiekt timer.

buf może być na przykład bytearray lub array.array. Wartości ADC mają rozdzielczość 12-bitową i są zapisywane bezpośrednio do buf, jeśli rozmiar jego elementów wynosi 16 bitów lub więcej. Jeśli buf ma tylko elementy 8-bitowe (np. bytearray), rozdzielczość próbki zostanie zmniejszona do 8 bitów.

timer powinien 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, timer moż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 bytearray lub array.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ęcie read_timed_multi jest przydatne tylko z pojedynczym ADC. Aby używać go z więcej niż jednym ADC, podłącz dodatkowe wejścia analogowe poprzez odwołania cpu klasy pyb.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 zwraca False, 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.