Підтягуючий резистор – незамінний компонент у багатьох електронних схемах. Без нього неможливо забезпечити стабільну роботу мікроконтролерів, процесорів та інших логічних мікросхем. Давайте розберемося, що собою представляє підтягуючий резистор, чому він такий важливий і як правильно підібрати його параметри.
1. Що таке підтягуючий резистор і навіщо він потрібний
Підтягуючий резистор – це резистор, який підключається між входом логічного елемента та джерелом живлення або загальною шиною (землею). Його основне призначення – стабілізувати рівень сигналу на вході мікросхеми, запобігаючи хибним спрацьовуванням.
Існує два типи підтягуючих резисторів:
- Pull-up резистор – підтягує сигнал до живлення, встановлюючи високий логічний рівень за умовчанням;
- Pull-down резистор – підтягує сигнал до землі, встановлюючи низький логічний рівень за умовчанням.
Підтягуючі резистори широко використовуються при підключенні:
- Кнопок та перемикачів
- Датчики з відкритим колектором
- Шин даних I2C, SPI, 1-Wire
Вони необхідні для того, щоб уникнути "плавання" вхідного сигналу та виникнення паразитних імпульсів. Наприклад, якщо до входу логічного елемента нічого не підключено, він може спрацьовувати від електромагнітних наведень. Підтягуючий резистор задає на вході певний потенціал, запобігаючи хибним перемиканням.
За своєю суттю, ланцюг із підтягуючим резистором працює як дільник напруги. Підтягуючий резистор має високий опір, а опір джерела сигналу (кнопки, датчика) дуже маленький.Тому переважна частина напруги живлення падає саме на резисторі, що підтягує.
2. Як підібрати резистор, що підтягує.
Щоб правильно вибрати резистор, що підтягує, потрібно враховувати такі параметри:
- Напруга живлення схеми
- Максимальний струм, який споживається входом мікросхеми
- Необхідний логічний рівень на вході (високий чи низький)
- Порогова напруга переходу логічних рівнів
Для CMOS логіки гранична напруга становить приблизно половину напруги живлення. А для ТТЛ логіки – близько 1,5 Ст.
Формула для розрахунку підтягуючого резистора:
R = (Упит – Упоріг) / Виживання
- R – опір резистора
- Упит – напруга живлення схеми
- Упоріг – порогова напруга логічного рівня
- Використання – максимальний вхідний струм мікросхеми
Наприклад, для схеми на 5В з логікою ТТЛ, де струм споживання входу становить 1 мА, формула буде:
R = (5 В – 1,5 В) / 0,001 А = 3,5 кОм
Стандартні значення резисторів, що підтягують, зазвичай лежать в діапазоні від 1 кОм до 10 кОм. Чим менший опір, тим швидше перемикатиметься вхід при зміні сигналу. Але при цьому зростає споживаний струм.
Також важливим є правильний вибір між pull-up і pull-down резистором. Якщо схема використовує позитивну логіку (HIGH – 1), то частіше застосовується pull-up. Для негативної логіки (LOW – 1) підходить pull-down.
Підтягуючий резистор – простий, але критично важливий компонент електронних пристроїв. Правильний вибір параметрів резистора дозволяє уникнути багатьох проблем у роботі схеми.
Далі ми докладно розберемо застосування резисторів, що підтягують, в конкретних схемах і на прикладі популярних мікроконтролерів.
3. Особливості застосування у мікроконтролерах
Багато сучасних мікроконтролерів, таких як Arduino або Raspberry Pi, мають вбудовані підтягуючі резистори на входах GPIO. Це дозволяє спростити схему та заощадити на додаткових дискретних компонентах.
Вбудовані резистори можуть бути включені програмно, установкою відповідних біт у регістрі порту. Наприклад, у Arduino для активації підтяжки до живлення використовується функція pinMode (pin, INPUT_PULLUP).
4. Правила підключення зовнішніх резисторів
Однак не завжди вбудованих резисторів буває достатньо. Тоді доводиться використати зовнішні дискретні резистори.
При підключенні до Arduino важливо враховувати:
- Напруга живлення (5В або 3.3В)
- Максимальний струм входу/виходу 40мА
- CMOS логіка входів
Для базової моделі Arduino Uno оптимальним є резистор підтягування живлення номіналом 4,7 кОм.
5. Розрахунок резисторів для шин даних
При роботі з шинами I2C, SPI, 1-Wire Arduino слід враховувати їх особливості.
Наприклад, для шини I2C передбачені резистори підтяжки до живлення на лініях SDA та SCL. Їх номінал розраховується за формулою:
Рпідтяжки = (Упит – Упоріг_низк)
6. Підтяжка висновків із відкритим стоком
Поширеною задачею є підтяжка висновків різних мікросхем, що мають вихід із відкритим стоком (open drain). Наприклад, ШІМ-контролерів, драйверів світлодіодів, датчиків.
У таких випадках на вихід пристрою необхідно встановлювати підтягуючий резистор живлення для формування високого логічного рівня.
7. Типові помилки під час вибору резисторів
Щоб уникнути проблем, слід пам'ятати про поширені помилки:
- Перевищення допустимого струму входу/виходу
- Неправильний розрахунок опору
- Невідповідність полярності підтяжки типу логіки
Перед запуском схеми потрібно перевірити правильність вибору всіх резисторів.
Ми хотіли б відстежувати натискання кнопки для виконання якихось дій. Для цього ми підключили лінію +5В через резистор і кнопку до цифрового висновку Ардуїно, вважаючи, що при натисканні на кнопку струм потіче через неї і Ардуїно вважає на цифровому вході сигнал високого рівня. Відповідно при розмиканні контакту ми розраховуємо отримати на вході сигнал низького рівня. Чи це так? Перевіримо.
Підключимо кнопку за наведеною схемою та завантажимо в Ардуїно наступний скетч. Результат його роботи подивимося на моніторі порту.
void setup() < Serial.begin(9600); pinMode(2, INPUT); > void loop() < Serial.println(digitalRead(2)); delay(1000); >
При натисканні на кнопку Ардуїно дійсно зафіксує на вході сигнал високого рівня, при цьому в монітор порту буде виводитися значення "1". Але при відпусканні кнопки в моніторі порту виводитимуться як "0", так і "1". Я навіть більше скажу: можна виключити зі схеми кнопку (все одно вона розімкнена), у нас залишиться тільки провід, підключений до порту 2 Ардуїно, результат опитування порту буде таким же непередбачуваним. Особливо це добре помітно з довгим шматком дроту. Чому так відбувається? Справа в тому, що вхід Ардуїно не підключений ні до лінії живлення, ні до землі – він знаходиться "ні в якому" стані. Такий стан називається високоімпедансним або Z станом. Провід в даному випадку виконує роль антени, на яку впливають електромагнітні поля, що оточують її. У результаті Ардуїно непередбачено фіксує то високий, то низький рівень сигналу цьому вході.
Щоб логічний вхід не залишався у підвішеному стані при розімкнутому контакті кнопки та гарантувати на ньому сигнал низького рівня, його через резистор з'єднують із землею. Такий резистор називають підтягуючим: він забезпечує підтяжку сигналу до землі (як у даному випадку) або живлення, якщо встановлюється між логічним входом пристрою і лінією живлення. Відповідно, при підтяжці до живлення на логічному вході буде гарантовано високий рівень сигналу.
Іноді підтягуючим називають резистор, який підтягує саме до харчування, також використовують англомовний термін pull-up (pull-up резистор). А для позначення резистора, що підтягує до землі, можна використовувати термін резистор, що стягує або pull-down. Нижче наведені схеми підключення кнопки до логічного входу (не обов'язково Ардуїно) з використанням резисторів, що підтягують і стягують.
Спробуйте підключити кнопку до Ардуїно, використовуючи одну з наведених схем. На цей раз у моніторі порту не буде жодних несподіваних значень.
Як ви розумієте, резистори, що підтягують, дуже затребувані в електроніці. Вони потрібні не тільки для підключення кнопок, але також при підключенні висновків пристроїв із станом Z або відкритим колектором. Тому багато контролерів мають вбудовані підтягуючі резистори, в тому числі і Ардуїно (а точніше використовувані в них мікроконтролери). Щоб підтягнути порт Ардуїно до живлення, необхідно функцією pinMode встановити для даного порту режим INPUT_PULLUP. Давайте трохи змінимо схему та скетч із початку цієї статті. Зі схеми приберемо резистор і встановимо кнопку між другим портом і землею:
А в скетчі змінимо режим роботи порту на INPUT_PULLUP, щоб задіяти внутрішній резистор, що підтягує:
void setup() < Serial.begin(9600); pinMode(2, INPUT_PULLUP); > void loop() < Serial.println(digitalRead(2)); delay(1000); >
Завантажте цей код в Ардуїно і переконайтеся, що схема працює як нам потрібно без додаткових (зовнішніх) резисторів. У той момент коли кнопка розімкнена порт Ардуїно не залишається підвішеним у повітрі: він підтягнутий до живлення внутрішнім резистором. Тому на ньому гарантовано сигнал високого рівня. А при натисканні кнопки зчитуватиметься сигнал низького рівня.
Не забувайте про вбудовані підтягуючі резистори Ардуїно. Я досить часто помічаю, що люди, які пишуть статті про Ардуїно, не знають про їхню наявність і вішають для тих самих кнопок зовнішні резистори, що підтягують.
Що таке сильний (strong pull-up) і слабкий (weak pull-up) резистор, що підтягує? Чим нижче опір резистора, що підтягує, тим більший струм протікає через нього і тим сильніше він підтягує сигнал до живлення (або землі, якщо мова про pull-down резистори). Звідси і назва сильний резистор, що підтягує. Відповідно, чим вищий опір, тим слабше резистор підтягує сигнал, тому його називають слабким.
Як вибрати номінал для резистора, що підтягує? Загальна рекомендація – це, як правило, 10кОм. Десь від 5кОм і нижче вважається сильною підтяжкою, 20…100кОм – слабка. Підтягуючі резистори Ардуїно мають номінал 20..50кОм (конкретне значення підбирається і встановлюється заводі виготовлювачі), тобто. є слабкими. Тому в документації до різних пристроїв можна побачити рекомендації використовувати сильніші підтягуючі резистори.Особливо це актуально для пристроїв, що працюють у несприятливих умовах або за значної довжини провідників, коли збільшується ймовірність виникнення електромагнітних перешкод.
Чи є в Ардуїно підтяжка до землі (внутрішні резистори)? – Ні. В Ардуїно доступні тільки до резистори, що підтягують до живлення. Тому якщо вам потрібно підтягнути висновок до землі, використовуйте для цього зовнішній резистор.
На цьому все. А дочитав до кінця як бонус функціональна схема порту введення/виводу мікроконтролера ATmega328P, що використовується в Arduino UNO. На схемі показаний підтягуючий резистор та умови для його включення:
- біт PUD (PULLUP DISABLE) регістра MCUCR має бути скинутий;
- регістр DDxn (Data Direction) може бути встановлено 0, тобто. порт налаштований на введення;
- регістр PORTxn має бути встановлений у 1.
Можливо, Вам буде цікаво:
28 коментарів:
Друг ти знову врятував мене, тільки з твоєї статті зрозумів що якщо PULLUP включаємо підтягуючий резистор треба кидати контакт датчиків на землю. Весь російськомовний інтернет перешерстив. Дякую. Відповісти Видалити
Дізнався про підтягуючі з курсу універу в PIC16, використовувати в ардуїно почну сьогодні 😀 Видалити
Отримав Raspberry Pi і користуюся готовими рішеннями з інтернету, але не можу зрозуміти принципів роботи, що дуже напружує (швидше дратує). Ваш пост дуже допоміг, хоча все ще ніяк не можу зрозуміти дві речі:
1. Хіба резистор на 10к Ом не повинен знижувати напругу до нульових значень, що при підведенні до введення повинен перетворюватися на 0?
2. Чому при натисканні кнопки сигнал не поділяється і не надходить одночасно і на заземлення та на введення?
Відповісти Видалити
А чому резистор має знижувати напругу?
Подивіться на наведену вище схему включення резистора, що підтягує. Коли кнопка розімкнена струм тече від VCC через резистор до мікроконтролера – цифровий вхід підтягнутий до живлення, на ньому сигнал високого рівня.
Опір порту мікроконтролера (в режимі INPUT) дуже великий і при натисканні на кнопку струм піде по ланцюгу з меншим опором через кнопку. Через цифровий вхід струм не потече, на ньому буде сигнал низького рівня. Видалити
Дякую за відповідь, нарешті все зрозумів. Дивно, що все це добре знав коли був школярем, а зараз не розумію, як усе це працює. Добре, що ви продовжуєте підтримувати пост і читачів (особливо таких як я). Відповісти Видалити
Доброго дня.
Із задоволенням читаю ваші статті.
Запитання. Як впливають на енергоспоживання підключення кнопки через стягуючий та підтягуючий резистори? Відповісти Видалити
Доброго дня!
Загалом збільшують, адже через них протікає струм. Тим більший, що менше опір резистора. Але з цього приводу не варто морочитися, якщо ви працюєте з Ардуїно: на її тлі підтяжка не впливає на споживання. А от коли ви пересядете з Ардуїно на окремі мікроконтролери і почнете вважати мікроампери, тоді можна звернути на це питання увагу.
Nick Gammon на сторінці http://www.gammon.com.au/power навів результати своїх вимірювань струму, споживаного ATmega328P у режимі SLEEP_MODE_PWR_DOWN (BOD та ADC відключені) для різних станів висновків:
Усі піни у режимі OUTPUT, LOW: 0.35 мкА.
Усі піни у режимі OUTPUT, HIGH: 1.86 мкА.
Всі піни в режимі INPUT, LOW (внутрішні резистори, що підтягують, не задіяні): 0.35 мкА.
Усі піни в режимі INPUT, HIGH (задіяні внутрішні підтягуючі резистори): 1.25 мкА.
Різниця в останніх двох результатах – це і є втрати на підтяжку всіх висновків. Видалити
Доброго дня, Володимире велике спасибі за огляди та пояснення, вже кілька днів посилено штудирую інтернет, з усього, що довелося перечитати та переглянути – Ваші матеріал мабуть найвиразніше.
Я зараз в одному великому ступорі, якщо не складно допоможіть будь ласка визначитися, який контролер (або систему) краще взяти за основу. Я біолог, але так вийшло, що вже давно, крім іншого, відповідаю за збір, зберігання та обробку даних. Зізнаюся відразу – програмування як таке викликає параліч мозку, але є таке слово ТРЕБА, тому вже 14 і 2 роки відповідно у мене успішно працюють дві бази зібрані на VB в Exel, із записів вбудованого рідера, уроків "Планети EXEL" і всякого різного не завжди цензурного….
Загалом, спершу почитав захоплення на рахунок Ардуїно, подивився FLProg (з душі начебто не поверне, як XOD ID), у процесі Arduino IDE мелькає – теж начебто явного відторгнення не викликає. Не подобатися два моменти – ціна кусається, і їсти все-таки любить вона, а з моїм зором боюся навіть світлодіод відпаяти буде проблематично. Другий погляд був на STM32L0 – тут начебто і енергоспоживання смачне і годинник реального часу тобі вбудований і. зайшов ще на один ресурс Млин, вуха в трубочку згорнулися. і мізки народу ардуїною зс$р@ни і всі ці ваші таблетки і примочки гірші ніж інваліди на все життя бейсиком покалічені і нижче -10 вже не працює і взагалі … ЙДІТЕ ВИ. Не заважайте народу НОРМАЛЬНІ мови програмування вивчати, нехай навчають, а не це ваше всяке-різне!
Загалом апаратна частина STM32 якщо чесно подобатися, але як її програмувати і з якого боку прошивати, поки навіть образно, якщо чесно погано розумію, в той час як по Ардуїно і в скетчах вже покопався і бібліотеки подивився, логічного шоку начебто немає. . От і думаю має сенс заглиблюватися в Ардуїне середовище чи все ж таки на якісь інші контролери подивитися? Наприклад, MSP430 ще розглядав, але це я так розумію ще одне середовище і вже інше, значить і скетчі для датчиків не факт, що будуть і бібліотеки теж, тобто всі руками через регістри, що це таке я начебто (хоча не факт), а ось як руками робити поки що на жаль не уявляю.
Саме завдання через що весь сир-бор виглядає так, є необхідність зробити просту, але гнучку метеосистему. Гнучку в тому плані, що ось треба зараз зробити реєстратор температури та вологості повітря, що б прокидався, допустимо кожні 10 хвилин, знімав дані, писав на SD і засинав, але при цьому з автономним терміном роботи хоча б півроку і МАЛЕНЬКИЙ (грибники тирають млинець ) і все це в кількості штук 5-10 за не дуже астрономічну суму (до речі подивився ціни дуже хороших датчиків SHT35 і приємно офігел, з модулями не порівняти). А завтра треба теж саме, але плюс завмер світла і щогодини продування камери вентилятором (для обліку транспірації), тобто вже не таке автономне (пара тижнів), не таке маленьке (може з сонячною батареєю або навіть з виведенням даних по wi-fi /sim/радиоканалу), але що б не з нуля і в тій самій системі?
Про енергозбереження читав до речі дуже уважно, для переривання теж.Головний головний біль на даний момент, дуже багато інформації про те, що з глибокого сну добре виходити по зовнішньому перериванню, наприклад з годинника реального часу (вибрав DS3231), знайшов навіть зв'язок блоків сон / пробудження для FLProg, бібліотеки начебто теж є. АЛЕ. ніде не знайду, хоч скільки не будь, виразного пояснення куди в цьому випадку прописувати або ставити у візуальне середовище цей самий внутрішній будильник годинника реального часу, як програмувати його, чи здатна сама програма після пробудження його перепрограмувати на новий час і як запрограмувати ногу SQW на модулі, щоб вона видавала цей самий жаданий сигнал на пробудження плати.
Буду дуже вдячний, якщо хоча б за загальним напрямом зорієнтуєте – куди дивитися і що шукати.
Відповісти Видалити
Доброго дня!
З STM я не працював, тож порівняти з AVR не можу. Може, воно було б і краще. Але Ардуїно однозначно популярніше, для неї купа бібліотек, прикладів – на ній буде простіше зробити. І якщо використовувати не саму Ардуїну, а окремо мікроконтролер, споживання буде реально низьким. Пропрацювати автономно рік, періодично прокидаючись для опитування датчиків – запросто.
Що стосується flprog, то мені здається, для серйозних проектів він не дуже. Краще використовувати нормальну IDE, у якій сам все контролюєш.
Тому мені бачиться таке рішення: AVR (ATmega328P) + DS3231 + датчики + на що писати показання (flash). Годинник програмується на генерацію сигналу з потрібним інтервалом (10 хвилин), вони будуть видавати його на SQW. Мікроконтролер при включенні переводимо в режим PowerDown, дозволивши пробудження по зовнішньому перериванню від DS3231.Прокинувшись, запитуємо датчики та пам'ять, читаємо показання, пишемо їх на згадку, відключаємо всіх і знову спати до наступного сигналу будильника.
Ціна ATmega328P на Алі менше 100р. Споживання, як сказав, низьке: спати – хоч кілька років; з урахуванням пробуджень – потрібно мати уявлення про загальне споживання системи, але батареї 1Ач на рік має вистачити. Температурний діапазон -40..105С. Цілком нормальний МК для цього завдання. Видалити
На ютубі є кілька зрозумілих відео на запит "Метеостанція на Ардуїно", можете спочатку на ардуїно повторити, зрозуміти логіку роботи, потім перекочуватися на інші апаратні платформи. Видалити
Для розуміння суті теми, що розкривається, проведемо невеликий експеримент — зберемо невелику схему з кнопкою і напишемо скетч, який у Serial видаватиме значення стану кнопки:
Запустивши скетч і не натискаючи кнопку, переконуємося в тому, що стан піна 8 змінюється навіть від звичайного дотику до дроту абсолютно непередбачуваним чином.
Стабільність з'являється лише при натисканні кнопки.
Так відбувається тому, що коли кнопка знаходиться в віджатому стані, схема набуває вигляду:
Виходить, що 8 пін знаходиться в невизначеному "підвішеному" стані і при зчитуванні його значення не можна точно сказати, в якому він стані – HIGH або LOW. Такий стан ще називається високоомним станом чи станом Z. А провід, що з'єднує пін плати з кнопкою, виконує роль антени для різних електромагнітних наведень. Саме ці наведення і змушують контакт поводитись непередбачуваним чином. Для того, щоб усунути цю ситуацію, необхідно зробити так, щоб у будь-якому стані кнопки на 8 піні було однозначне значення.Для цього скоригуємо схему наступним чином – підключимо пін 8 до землі через резистор номіналом 10 КОМ:
Тепер, коли кнопка віджата, можна зі 100% впевненістю говорити про те, що стан на піні 8 – LOW, так як він підключений до землі. Але якщо натиснути кнопку, то струм піде шляхом найменшого опору і значення на піні 8 стане HIGH . Ось цей доданий до схеми резистор і називається стягуючимтому, що в невизначеному стані «стягує» потенціал до землі, роблячи його певним – LOW.
Номінал резистора розраховується виходячи з максимально протікає струму. Максимальний струм, який здатний видати цифровий пін Arduino – 40 мА (0,04 А). При напрузі 5В, згідно із законом Ома, знаходимо опір ділянки ланцюга:
Таким чином мінімально допустимий для використання номінал резистора – 125 Ом.
У той же час, щоб резистор, що стягує/підтягує, не впливав на інші ділянки ланцюга при замиканні (ефект дільника напруги), рекомендується вибирати набагато більший номінал 1-10 кОм.
Якщо поміняти місцями резистор і кнопку вийде схема з підтягуючим резистором.