Розуміння аналогового та цифрового GPIO


11

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

Я бачив декілька посилань на GPIO, здатні працювати лише з двійковими значеннями, але інші пости, які говорять про значення, можуть становити від 0-255. Я припускаю, що це різниця між аналоговим та цифровим GPIO. Це правильно? Чи можливо, що один штифт GPIO може діяти як аналоговим, так і цифровим?


Як доповнення до деяких відповідей ... Двійкове значення відноситься до цифрового входу або виходу. Це може бути 1 (яке має бути напругою джерела, яке називається "привіт" або "увімкнено") або 0 (що означає 0В, називається "lo" або "off"). Це роздільна здатність 1 біт. Аналоговий вхід може бути діапазоном, як правило, від 0В до VCC (напруга джерела). Цифровий чіп з 8-бітовою роздільною здатністю перетворить цей аналоговий вхід у 8-бітовий цифровий сигнал діапазону 0 - 255 (двійковий: 00000000 - 11111111), оскільки 2 ^ 8 - 1 = 255 (двійкові засоби бази 2, 8 - це 8-бітний частина, і "- 1", оскільки цифрові речі починають рахувати з 0, а не 1).
Курт Е. Клотьє

Відповіді:


14

PIN-код 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, але вважаються незалежними процесорами і потребують власного штифтового відображення для того, щоб бути зв’язаним із зовнішнім світом.


Чи можете ви навести приклад того, як "SINGLE pin" може бути використаний для "аналогових" значень?
Павло

@ JimJim2000 - це просто потік включення / вимкнення або власне ШІМ через RC-фільтр для отримання плавного аналогового "середнього" напруги на виході.
KyranF

7

Ви, швидше за все, маєте на увазі аналог Arduino, який часто використовує штифт GPIO із програмним PWM . GPIO зазвичай мають три стани. Вихід високий, низький вихідний і вхідний / високий-Z (високий опір, де це не впливає на вихід).

ШІМ швидко перемикає вихід з високого виходу на низький вихідний (період), щоб створити середнє значення (цикл робочого циклу), що дозволяє щось подібне до аналогового значення. Перемикаючи Binary GPIO на 50% (або 128) робочий цикл, вихід все ще є двійковим, але в середньому дорівнює половині між High та Low.

Подумайте про лампочку. Ви бачите це ввімкнено або вимкнено. Але це дійсно вмикається і вимикається 60 разів на секунду, так швидко, що ви не помічаєте його блимання дуже швидко. Але вмикайте і вимикайте лампочку вручну дійсно повільно, і ви помічаєте її блимання. До 255 року це означає 100%, а менше 255 - частка на 100%.

Ось як Binary GPIO може діяти як аналоговий контакт 255 стану.


Дякую @Passerby, це набагато зрозуміліше. Я спеціально не дивлюсь на ардуїно, а на малиновий пі та гончак. Чи означає те, що ви говорите, що будь-який контакт може мати значення між 0 і 255? Я плутаюсь між документацією, яка говорить про те, що значення може бути двійковим порівняно з іншими, які говорять, що значення може бути 0-255.
педальпета

1
@pedalpete RPI і Arduino мають багато перекриттів у натовпі та ідеях. Але ШІМ від 0 до 255 є довільним. Це може бути від 0 до 65535, або від 0 до 16. 0 до 255 - це 8 біт точності. Де 255 або 65535 або що-небудь 100%. GPIO має лише ввімкнутий і вимкнутий двійковий файл, але ви використовуєте ШІМ, щоб зробити вигляд, що він може мати більше, ніж просто ввімкнути або вимкнути. Це корисна і навмисна оптична ілюзія.
Перехожий

2
Лампочка не блимає і вимикається не 60 разів за секунду. Нитка нагрівається і залишається нагрітою
Скотт Сейдман

0

Біт GPIO може бути 0 або 1. 8-бітний порт GPIO, виготовлений з 8 послідовних біт, може становити від 00000000 до 11111111, або 255 десятків. Це мало стосується поняття "аналог"


Дякую Скотту, хоча я думаю, що зараз я більше плутаюся, ніж раніше. Що таке порт GPIO? Якщо у мене є штифт GPIO (наприклад, на Raspberry Pi), чи вважається кожен штифт портом? Якщо так, чи може кожен штифт працювати із зазначеним діапазоном 0-255 десятків?
педальпета

Ігноруючи моє останнє запитання, я бачу, що ви зараз маєте на увазі про порт.
педальпета
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.