Понимание GPIO аналоговых и цифровых

11

Я пытаюсь понять GPIO, и прочитал кучу разных постов в блоге, и я думаю, что я близок к тому, чтобы получить его, но все еще борюсь с некоторыми вещами.

Я видел несколько упоминаний о том, что GPIO может работать только с двоичными значениями, но в других публикациях говорится, что значение может быть от 0 до 255. Я предполагаю, что это разница между аналоговым и цифровым GPIO. Это верно? Возможно ли, что один вывод GPIO может действовать как аналоговый, так и цифровой?

pedalpete
источник
Как продолжение некоторых ответов ... Двоичное значение относится к цифровому входу или выходу. Это может быть 1 (это должно быть напряжение источника, называемое «hi» или «on») или 0 (что означает 0V, называемое «lo» или «off»). Это разрешение 1 бит. Аналоговый вход может иметь диапазон, обычно от 0 В до VCC (напряжение источника). Цифровой чип с разрешением 8 бит преобразует этот аналоговый вход в 8-битный цифровой сигнал диапазона 0 - 255 (двоичный: 00000000 - 11111111), потому что 2 ^ 8 - 1 = 255 (двоичное означает основание 2, 8 - из 8 бит part, и "- 1", потому что цифровой материал начинает считать с 0, а не с 1).
Курт Э. Клотье

Ответы:

14

Вывод GPIO является выводом «общего назначения ввода / вывода». По умолчанию это только высокий или низкий уровень (уровень напряжения, высокий - напряжение питания микроконтроллера, низкий уровень - заземление или 0 В). Но уровни «высокий» и «низкий» обычно задаются как напряжения как пропорция напряжения питания. Таким образом, все, что обычно выше 66% от напряжения питания, считается логическим уровнем «высокого», что означает, что некоторые устройства с низким напряжением могут общаться с устройствами высокого напряжения, пока уровни находятся в пределах того, что считается «высоким». Например, у микроконтроллера с низким энергопотреблением 1,8–2,7 В или приемника GPS будут проблемы с подключением напрямую к микроконтроллеру с напряжением 5 В, потому что то, что низковольтное устройство считает «высоким», высоковольтное устройство вообще не будет считать, что оно высокое. Это для использования GPIO в качестве входного контакта,

Иногда вы можете использовать одиночный вывод для «аналоговых» значений, настроив вывод GPIO для использования другими встроенными устройствами, такими как аналого-цифровой преобразователь (АЦП). Вывод настроен на канал на АЦП, и теперь он служит входом для АЦП, а не обычным выводом GPIO. Затем вы можете настроить АЦП на выборку и прочитать значение регистра результата АЦП для чисел, таких как 0-1024, если это 10-битное разрешение.

Как кто-то упомянул, вывод GPIO может использоваться в программном обеспечении для получения эффекта сигнала ШИМ, обычно на низких скоростях для переключения GPIO. Большинство микроконтроллеров имеют выделенные генераторы ШИМ, которые можно настроить на использование вывода GPIO в качестве выходного вывода, и они очень быстрые и гораздо более стабильные, чем использование программного обеспечения для управления GPIO для генерации сигнала ШИМ. ШИМ используются для сигналов «среднего» или «%» стиля и позволяют вам делать такие вещи, как приглушенный свет и контролировать скорость двигателя.

Контакты GPIO обычно располагаются группами, называемыми портами. В небольших контроллерах это может быть 8-битная архитектура, поэтому порты часто группируются в лоты по 8, и их значения могут считываться одновременно, считывая «регистр данных», который представляет логические высокие / низкие значения этих штырьки. Точно так же вы можете установить выводы для вывода, а затем записать 8-битные данные в регистр данных, и контроллер GPIO микроконтроллеров будет считывать измененные значения регистра и выводить вывод на высокий уровень или выводить вывод на низкий уровень в зависимости от того, какое значение вы только что установили.

В новых контроллерах, таких как ARM Cortex A8 и A9, таких как Raspberry Pi и BeagleBone, их контроллеры GPIO и различные опции очень сложны. Они используют 32-разрядную архитектуру, поэтому большинство выводов GPIO расположены в 32-контактных блоках, даже если не все они фактически используются (некоторые могут быть выделены или не включены). BeagleBone (над которым я работал ранее) имеет несколько действительно замечательных опций для большого количества выводов, и иногда вам нужно будет использовать инструмент «pin mux», который позволяет вам устанавливать специальные режимы для определенных выводов для вещей. такие как ШИМ, захват импульсов, выходы таймера, входы аналогового канала (АЦП) и даже (в любом случае на BeagleBone) отображение на промышленные подпроцессоры, доступные на ядре ARM, но считаются независимыми процессорами и нуждаются в собственном отображении контактов для быть связанным с внешним миром.

KyranF
источник
Не могли бы вы привести пример того, как «ОДИН вывод можно использовать для« аналоговых »значений»?
Павел
@ JimJim2000 просто поток вкл / выкл или правильный ШИМ через RC-фильтр для получения плавного аналогового «среднего» напряжения на выходе.
KyranF
7

Скорее всего, вы имеете в виду аналоговый выход Arduino, который часто использует вывод GPIO с программным ШИМ . GPIO обычно имеет три состояния. Выходной Высокий, Выходной Низкий и Входной / Высокий-Z (Высокий Импеданс, где это не влияет на выход).

ШИМ быстро переключает выходной сигнал с выходного верхнего уровня на низкий выходной (период), создавая среднее значение (рабочий цикл), что позволяет получить нечто похожее на аналоговое значение. При переключении двоичного GPIO с коэффициентом заполнения 50% (или 128) выход по-прежнему является двоичным, но в среднем он составляет половину от высокого до низкого.

Подумай о лампочке. Вы видите его вкл или выкл. Но он действительно включается и выключается 60 раз в секунду, настолько быстро, что вы не замечаете, что он очень быстро мигает. Но включите и выключите лампочку вручную очень медленно, и вы заметите, что она мигает. 255 означает 100%, а менее 255 - это доля 100%.

Вот как двоичный GPIO может действовать как аналоговый вывод с 255 состояниями.

проезжий
источник
Спасибо @Passerby, это намного понятнее. Я не специально смотрю на Arduino, но малиновый пи и биглебоне. Означает ли это, что вы говорите, что любой вывод может иметь значение от 0 до 255? Я запутался между документацией, в которой говорится, что значение может быть двоичным по сравнению с другими, которые говорят, что значение может быть 0-255.
Pedalpete
1
@pedalpete RPI и Arduino имеют много общего в толпе и идеях. Но ШИМ от 0 до 255 является произвольным. Это может быть от 0 до 65535 или от 0 до 16. От 0 до 255 - это 8 бит точности. Где 255 или 65535 или что-то на 100%. GPIO имеет только Binary On и Off, но вы используете PWM, чтобы притвориться, что он может иметь больше, чем просто включить или выключить. Это полезный и намеренный обман зрения.
прохожий
2
Лампочка не мигает 60 раз в секунду. Нить нагревается и остается нагретой
Скотт Сейдман,
0

Бит GPIO может быть 0 или 1. 8-битный порт GPIO, состоящий из 8 последовательных битов, может находиться в диапазоне от 00000000 до 11111111, или 255 десятичных разрядов. Это имеет мало общего с понятием «аналог»

Скотт Сейдман
источник
Спасибо Скотт, хотя я думаю, что сейчас я в замешательстве, чем раньше. Что такое порт GPIO? Если у меня есть вывод GPIO (например, на Raspberry Pi), считается ли каждый вывод портом? Если да, может ли каждый штифт работать с указанным десятичным диапазоном 0-255?
Pedalpete
Не обращайте внимания на мой последний вопрос, я понимаю, что вы сейчас имеете в виду по поводу порта.
педальпет