Использование АЦП в Raspberry Pi – руководство для начинающих

В данной статье мы рассмотрим подключение модуля аналого-цифрового преобразования (АЦП) ADC0804 к плате Raspberry Pi. Зачем нужно АЦП? К примеру, у нас есть значение температуры, которое нужно передать в микроконтроллер. Но значение температуры – это десятичное число, а микроконтроллеры оперируют только двоичными (цифровыми) данными. Для преобразования десятичных чисел в цифровые данные и применяется аналого-цифровое преобразование.

Внешний вид подключения модуля АЦП ADC0804 к плате Raspberry Pi

Общие принципы работы ADC0804

Большинство современных микроконтроллеров имеют в своем составе собственные аналого-цифровые преобразователи (АЦП каналы), однако в плате Raspberry Pi собственных АЦП нет. Поэтому если вы хотите подключить к ней какие-нибудь аналоговые датчики, то вам будет необходим внешний АЦП, например, ADC0804.

Чип ADC0804 представляет собой микросхему, предназначенную для преобразования аналогового сигнала в 8-битные цифровые данные. В настоящее время это одна из самых популярных микросхем АЦП в бюджетном сегменте. Поскольку ее разрядность равна 8 бит, то на ее выходе мы можем получать значения от 0 до 255. Поскольку максимальное измеряемое ею напряжение составляет 5V, то, следовательно, одно ее цифровое значение равно шагу напряжения 19.5mV. На следующем рисунке представлена распиновка микросхемы ADC0804.

Распиновка микросхемы ADC0804

Модуль (микросхема) ADC0804 работает с напряжениями 5V, поэтому на своих логических выходах она также обеспечивает напряжение 5V. То есть уровню логической 1 на ее выходных контактах соответствует напряжение 5V. Но плата Raspberry Pi работает с уровнями напряжений +3.3V, поэтому на нее нельзя непосредственно подавать уровни +5V поскольку это может привести к повреждению платы. Поэтому для понижения уровня напряжения с +5V до +3.3V мы будем использовать схему резистивного делителя напряжения. Точнее сказать, мы с помощью этого делителя напряжения будем понижать уровень +5V до уровня +2.5V, который и будет подаваться на плату Raspberry Pi. То есть уровень +2.5V на входе Raspberry Pi будет обозначать логическую 1.

Более подробно о контактах ввода/вывода (GPIO) на плате Raspberry Pi вы можете прочитать в следующей статье.

Необходимые компоненты

  1. Плата Raspberry Pi 2 Model B или другая аналогичная (купить на AliExpress).
  2. Резистор 220 Ом или 1 кОм – 17 шт. (купить на AliExpress).
  3. Потенциометр 10 кОм (купить на AliExpress).
  4. Конденсатор 0,1 мкФ – 2 шт. (купить на AliExpress).
  5. Модуль ADC0804 (купить на AliExpress).
  6. Макетная плата.
  7. Соединительные провода.

Схема проекта

Схема подключения модуля АЦП ADC0804 к Raspberry Pi представлена на следующем рисунке.

Схема подключения модуля АЦП ADC0804 к Raspberry Pi

На выходе модуля АЦП обычно присутствует множество различных шумов, поэтому для частичной фильтрации этих шумов мы использовали конденсатор емкостью 0.1 мкФ. Без этого конденсатора на выходах модуля АЦП могут наблюдаться значительные флуктуации напряжения.

В нашем проекте частота работы модуля АЦП ADC0804 задается с помощью RC-генератора – на представленной схеме он состоит из конденсатора C2 и резистора R20. Здесь важно отметить, что емкость конденсатора C2 можно уменьшить для того, чтобы повысить скорость АЦП. Но помните о том, что увеличение скорости АЦП приводит к уменьшению его точности. Поэтому, если для вашего приложения критически важна именно точность АЦП, а не его скорость, то в этом случае вам необходимо увеличить емкость конденсатора C2.

Объяснение программы для Raspberry Pi

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

После того, как все необходимые соединения в схеме сделаны, мы можем подать питание на Raspberry Pi и после загрузки ее операционной системы можно начать писать программу в ней на Python. Подробнее о том, как это можно сделать, можно прочитать в статье про мигание светодиода с помощью Raspberry Pi.

В программе нам первым делом необходимо подключить (импортировать) библиотеку для работы с контактами ввода/вывода. Также мы импортируем эту библиотеку RPi.GPIO под именем “IO” (то есть переименовываем ее для использования в программе), то есть далее в программе всегда, когда мы захотим обратиться к контактам ввода/вывода, мы будем использовать слово ‘IO’.

Иногда контакты ввода/вывода (GPIO pins), которые мы собираемся использовать в программе, могут выполнять другие функции. В этом случае во время исполнения программы мы будем получать предупреждения (warnings). Следующей командой мы укажем плате Raspberry Pi на то, чтобы она игнорировала эти предупреждения и продолжала исполнение программы.

Мы можем обращаться к контактам ввода/вывода (GPIO pins) платы Raspberry Pi используя либо номер контакта на плате, либо его функциональный номер. Например, если смотреть распиновку контактов ввода/вывода платы Raspberry Pi, то можно увидеть, что в ней обозначение GPIO5 соответствует контакту PIN 29. То есть в зависимости от того, какой способ обращения к контактам мы выбрали, мы можем обращаться к рассмотренному контакту либо по номеру ‘29’, либо по номеру ‘5’. В данном проекте мы выберем способ обращения к контактам по их функциональным номерам, поэтому используем следующую команду:

Далее мы сконфигурируем 8 контактов платы Raspberry Pi в качестве цифровых входов – на них мы будем подавать значения с 8 выходных контактов модуля АЦП ADC0804.

Далее в программе мы будем проверять состояние контакта GPIO19. Если на этом контакте уровень high, то мы выполним действия, относящиеся к этому оператору IF. Если же на этом контакте уровень low, то действия внутри оператора IF выполняться не будут.

Следующей командой будет формироваться бесконечный цикл, внутри него все команды будут выполняться непрерывно.

После написания программы можно приступать к проверке работы схемы.

Тестирование работы проекта

После запуска программы на выполнение вы будете наблюдать на экране ‘0’, что будет обозначать 0 вольт на входе АЦП.

Наблюдаемые значения при 0 вольт на входе АЦП

Если мы будем вращать ручку потенциометра, подключенного ко входу АЦП, то мы будем наблюдать изменения значений на экране. Данные на экране будут в виде скроллинга – то есть они непрерывно будут изменяться в зависимости от цифровых значений, получаемых платой Raspberry Pi.

Если мы повернем ручку потенциометра в среднее положение, то мы увидим на экране значения 128 как показано на следующем рисунке.

Наблюдаемые значения при среднем значении ручки потенциометра

Для крайнего положения потенциометра (то есть значения напряжения на входе АЦП равного +5V), мы на экране компьютера увидим значения 255.

Наблюдаемые значения при +5V на входе АЦП

Исходный код программы

В коде программы имеются необходимые комментарии.

Видео, демонстрирующее работу проекта

(Проголосуй первым!)
Загрузка...
32 просмотров


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *