MicroPython:Библиотеки/pyb/Класс ADC/ADC.read timed multi()

Материал из Онлайн справочника
Версия от 17:31, 24 мая 2023; EducationBot (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Класс ADC – аналогово-цифровое преобразование[1]

  • ADC.read_timed_multi((adcx, adcy, ...), (bufx, bufy, ...), timer) – это статический метод. Его можно использовать, чтобы узнать разницу во времени между считываниями на разных АЦП-каналах, а также чтобы прочесть фазовые данные на нескольких АЦП-каналах.

Этот метод считывает аналоговые значения с нескольких АЦП-каналов в буферы с периодичностью, заданной в аргументе timer. При каждом срабатывании таймера с каждого АЦП-канала по очереди быстро считывается новая порция данных.

Экземпляры для АЦП-каналов и буферов передаются в функцию в виде кортежей, в результате чего у каждого АЦП-канала будет привязанный к нему буфер. Все буферы должны быть одного и того же типа и размера, а количество буферов должно соответствовать количеству АЦП-каналов.

Объектами для буферов могут быть, к примеру, bytearray или array.array. АЦП-значения имеют 12-битное разрешение и сохраняются напрямую в буфер, если размер его элементов составляет 16 бит и более. Если в буферах есть только 8-битные элементы (например, bytearray), то разрешение считанных данных будет обрезано до 8 бит.

В аргументе timer должен быть объект Timer. Таймер должен быть уже инициализирован и запущен с нужной частотой.

Пример считывания с трех АЦП-каналов:

adc0 = pyb.ADC(pyb.Pin.board.X1)    # создаем АЦП-каналы
adc1 = pyb.ADC(pyb.Pin.board.X2)
adc2 = pyb.ADC(pyb.Pin.board.X3)
tim = pyb.Timer(8, freq=100)        # создаем таймер
rx0 = array.array('H', (0 for i in range(100))) # АЦП-буферы
rx1 = array.array('H', (0 for i in range(100))) # на 100 
                                                # 16-битных слов 
rx2 = array.array('H', (0 for i in range(100)))
# считываем аналоговые значения в буферы 
# с частотой 100 Гц (занимает одну секунду):
pyb.ADC.read_timed_multi((adc0, adc1, adc2), (rx0, rx1, rx2), tim)
for n in range(len(rx0)):
    print(rx0[n], rx1[n], rx2[n])

Эта функция не выделяет память в куче. И это блокирующая функция: программа, запустившая ее, не возобновит работу, пока буфер не заполнится.

Функция вернет True, если все данные были в правильное время. На высоких частотах время считывания может превышать значение в timer – в этом случае функция вернет False, что будет говорить о потере точности данных в период их считывания. В крайнем случае данные могут быть даже потеряны.

Максимальная частота зависит от ряда факторов, включая разрядность данных и количество АЦП-каналов, с которых производится считывание. Согласно нашим тестам, при считывании данных с двух АЦП-каналов с частотой до 210 КГц сбоев не возникает. При частоте 215 КГц данные начинают теряться. Для трех АЦП-каналов это ограничение составляет около 140 КГц, а для четырех – около 110 КГц. На высоких частотах риск случайной потери данных может можно снизить, отключив прерывания на период считывания данных.

См.также

Внешние ссылки