Есть ли способ прочитать сигнал ШИМ с контактов на Raspberry Pi?
Я попытался прибегая к помощи, но я нашел только PWM выход , а не вход .
Краткий ответ: Вы НЕ МОЖЕТЕ достоверно читать ШИМ на Raspberry Pi.
Чтение ШИМ требует микросекундной точности (если вы не читаете очень-очень медленный ШИМ), и это недоступно в Raspberry Pi для пользовательского программного обеспечения без работы с модулями ядра.
Самый простой способ перехватить ШИМ - это получить любой дешевый (менее $ 0,5) микроконтроллер с последовательным выходом или выходом I 2 C, подключить его к Raspberry Pi и считать фактические значения с микроконтроллера. Это будет работать очень надежно и достаточно точно.
Я могу сделать довольно точное измерение ширины импульса, используя библиотеку piGpio C: http://abyz.me.uk/rpi/pigpio/index.html
Эта библиотека позволяет вам установить функцию обратного вызова, которая будет запускаться при любом переходе ребра на выводе gpio, и давать вам метку времени микросекундного уровня для каждого перехода. Не думаю, что вы можете рассчитывать на точность микросекунды - но мои тесты показывают, что точность составляет не менее +/- 10us, а может и лучше.
Гораздо лучше, чем запускать петлю занятых, опрашивая gpio для изменения уровня самостоятельно.
источник
Это интересный вопрос, и вы правильно сказали, что поиск в Google не дает очевидного решения! (Я скучаю по дням, когда Google мог ответить на все, что я хотел знать, для моего образования / заданий в течение нескольких секунд.)
Я предполагаю, что вы понимаете принципы ШИМ . Поэтому я не буду вдаваться в это. Тем не менее, я считаю, что теоретически вы могли бы прочитать значение ШИМ на обычном цифровом входном выводе с некоторым умным кодированием.
Я признаю, что сам не пробовал этого, но вы должны быть в состоянии измерить время, когда вывод высок и время, за которое он низок (дает вам ваши показания ШИМ), а затем использовать любую математическую формулу, предоставленную поставщиком сенсора. чтобы преобразовать это в фактическое чтение.
Этот метод работает для меня по аналогичной проблеме, где мне нужно было прочитать длину импульса от ультразвукового модуля, а затем преобразовать его в расстояние. Проблемы, которые я могу предусмотреть, включают в себя обеспечение надежных показаний!
Если вы думаете, что это поможет и хотите увидеть код, который я использовал для ультразвукового модуля, просто скажите об этом, и я скопирую его, когда вернусь домой.
Я начал копировать код, но по какой-то причине веб-сайт позволяет мне копировать его только в небольшой раздел за раз (и я слишком ленив, чтобы вытащить мой пи из гаража), поэтому вот ссылка на него. игнорируйте большинство функций внизу, так как они связаны с использованием модуля в качестве датчика приближения. http://pibot.webnode.com/products/ultrasonic-range-sensor/
источник
Длинный ответ: вы действительно можете! (ну с небольшой помощью от наших друзей резистор и конденсатор)
Вы можете преобразовать выход ШИМ в аналоговый уровень напряжения (ЦАП) и прочитать его с помощью контакта АЦП на вашем Raspberry Pi.
Вам нужен резистор 4к7 и конденсатор 0,1 мкФ:
смоделировать эту схему - схема, созданная с использованием CircuitLab
Простой фильтр низких частот RC, приведенный выше, преобразует сигнал ШИМ в напряжение, пропорциональное рабочему циклу, которое может быть считано вашим Raspberry Pi в качестве аналогового значения.
источник
Если вас устраивает медленный ответ, вы можете прочитать быстрый PWM с помощью недостаточной выборки. Просто прочитайте GPIO в цикле и примените фильтр нижних частот. Вероятность считывания 1 в каждом цикле пропорциональна ширине импульса. Простой в применении фильтр низких частот IIR:
С уменьшением k разрешение улучшается, но ширина полосы уменьшается.
источник
Хотя мой ответ не из выводов, вы могли бы использовать что-то на основе осциллографа звуковой карты, чтобы прочитать импульсный вход.
Люди годами используют звуковые карты в настольных ПК для создания осциллографов. Похоже, что с современной внутренней звуковой картой вы можете получить полезные результаты до 10 кГц. При использовании звуковой карты Raspberry Pi USB, ваша максимальная частота может быть ниже.
Вот пример одного проекта осциллографа звуковой карты для Linux: http://www.yann.com/en/diy-turn-your-gnulinux-computer-into-a-free-oscilloscope-29/09/2010.html
источник
Этот скрипт на python, который я написал, отлично подходит для чтения сигналов ШИМ RC-ресивера. Высокочастотные ШИМ-сигналы, очевидно, не будут работать, как уже указывалось.
Я непосредственно подключил десять выводов сигнала RC-приемника к выводам Raspberry GPIO. Приемник питается от контактов + 5 В и GND от RPI.
Я упростил скрипт, так как он делает много других вещей, если вы обнаружите какие-либо ошибки или остатки, дайте мне знать
источник
Очень легко и относительно легко прочитать входные данные ШИМ на Raspberry Pi, используя библиотеку pigpio C. Если вы хотите хорошую производительность, я рекомендую использовать C, а не Python. Я предоставил небольшой пример кода ниже. Вопреки тому, что некоторые люди говорят, это имеет отличные характеристики синхронизации и довольно низкий уровень джиттера. Показания на моем RPi 3 B постоянно находятся в пределах 5 мкс, и он может измерять импульсы с точностью до 5 мкс. Обратите внимание, что предоставленный код является только концептуальным подтверждением, он не обрабатывает должным образом отсутствие импульсов (0% / 100% рабочего цикла) или «тиковый» переход, который происходит каждые 72 минуты. Программа отлично работает в пользовательском режиме, но для лучшей устойчивости к временным сбоям, запустите вашу программу на отрицательном хорошем уровне, например: sudo nice -n -20 ./program
Смотрите документацию по pigpio по адресу: http://abyz.me.uk/rpi/pigpio/pdif2.html.
источник
Простое решение с высокой точностью:
Использование Arduino в качестве iic slave или UART-устройства, кажется, прекрасно работает. Микроконтроллер способен считывать информацию с помощью метода pulseIn.
Для получения подробной информации: https://www.youtube.com/watch?v=ncBDvcbY1l4
источник