MicroPython:Библиотеки/pyb/Класс ADC/ADC.read timed multi(): различия между версиями
Myagkij (обсуждение | вклад) (Новая страница: «{{MicroPython/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} =Класс ADC – аналогово-цифро...») |
Нет описания правки |
||
Строка 17: | Строка 17: | ||
Пример считывания с трех [[АЦП-канал]]ов: | Пример считывания с трех [[АЦП-канал]]ов: | ||
<syntaxhighlight lang="python | <syntaxhighlight lang="python"> | ||
adc0 = pyb.ADC(pyb.Pin.board.X1) # создаем АЦП-каналы | adc0 = pyb.ADC(pyb.Pin.board.X1) # создаем АЦП-каналы | ||
adc1 = pyb.ADC(pyb.Pin.board.X2) | adc1 = pyb.ADC(pyb.Pin.board.X2) |
Текущая версия от 17:31, 24 мая 2023
Класс 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 КГц. На высоких частотах риск случайной потери данных может можно снизить, отключив прерывания на период считывания данных.