Сглаживание аналоговых входных значений

Я сделал устройство для тестирования потенциометра, которое считывает аналоговые значения с АЦП MCP3008.

Чтобы скрыть спорадические колебания аналогового входа, я вычисляю среднее значение нескольких измерений в цикле while с помощью функции, подобной следующей:

def analog_average():
    analog1 = (mcp_analog)
    time.sleep(0.001)
    analog2 = (mcp_analog)
    time.sleep(0.001)
    analog3 = (mcp_analog)
    time.sleep(0.001)
    analog4 = (mcp_analog)
    time.sleep(0.001)
    analog5 = (mcp_analog)
    analog_average = ((analog1 + analog2 + analog3 + analog4 + analog5) / 5)
    print(analog_average)

mcp_analog - значение первого аналогового входа АЦП.

Я получаю желаемый результат. Однако есть ли более чистый и эффективный способ?


person qeiynn    schedule 22.09.2020    source источник


Ответы (1)


Используя цикл и statistics.mean:

from statistics import mean

def analog_average(N):
    measures = []
    for _ in range(N):
        measures.append(mcp_analog.value)
        time.sleep(0.001)

    return mean(measures)

print(analog_average(5))

Таким образом, вы можете легко изменить количество выборок, не добавляя все больше и больше строк переменных sleep и analog.

person Tomerikoo    schedule 22.09.2020
comment
Спасибо, выглядит отлично. Извините, я не разъяснил это, mcp_analog предопределен в моем коде. Считывает значение на первом аналоговом входе АЦП. - person qeiynn; 22.09.2020
comment
Итак, я предполагаю, что это должен быть вызов функции? mcp_analog()? В противном случае вы просто добавляете одно и то же значение снова и снова, и окончательное среднее значение будет просто тем же значением ... @qeiynn - person Tomerikoo; 22.09.2020
comment
Он определяется как mcp = MCP.MCP3008(spi, mcp_read) и mcp_analog1 = AnalogIn(mcp, MCP.P0). Каждое показание немного отличается из-за нестабильного аналогового входа. - person qeiynn; 22.09.2020
comment
Опять же, согласно тому, что вы говорите, mcp_analog - это просто AnalogIn объект. Это твой класс или какая-то библиотека? У вас есть на это ссылка? Мне интересно узнать, что это такое - person Tomerikoo; 22.09.2020
comment
Еще немного подробностей. Код работает на микроконтроллере Adafruit CircuitPython. Чтобы получить показания от АЦП MCP3008, необходимо импортировать библиотеку из adafruit (adafruit_mcp3xxx.mcp3008). Я импортировал это как MCP. Теперь мой предыдущий комментарий должен иметь больше смысла. - person qeiynn; 22.09.2020
comment
Да, я до сих пор не уверен, как работает простое mcp_analog, но пока оно работает на вас, я счастлив ^ _ ^ Мне просто стало любопытно - person Tomerikoo; 22.09.2020
comment
Ссылка из следующей библиотеки, включающая примеры, которые должны прояснить это. mcp adafruit library. В этих примерах chan используется вместо mcp_analog. Еще раз спасибо за помощь, а также за проявленный интерес! :) - person qeiynn; 22.09.2020
comment
Хорошо, я нашел это! Посмотрите на первый пример в вашей ссылке, я думаю, вам нужно сделать mcp_analog.value. Вот почему это казалось странным. Просто передавая mpc_analog, вы продолжаете добавлять тот же объект AnalogIn. Но с доступом к определенному атрибуту, например .value, имеет смысл быть чем-то более динамичным, что изменяется внутри этого объекта. Тайна раскрыта: D - person Tomerikoo; 22.09.2020