Дискретные входы Ардуино
- Войдите на сайт для отправки комментариев
Втр, 10/11/2020 - 11:17
Народ, проблема!
Мучаю Ардуино Micro. В частности, попытался работать с интерфейсом SPI, и поскольку не все получалось, стал смотреть осциллографом сигналы на её соответствующих выводах -
и вот что у меня получается: на выходах интерфейса SPI - MOSI и SCK - все в порядке - качественный чистый меандр с крутыми фронтами и спадами импульсов. А вот на входе MISO
оказались очень затянутые фронты входящих импульсов - порядка 6 мкс. (пин сконфигурирован как вход с включенным внутренним подтягивающим резистором).
Отсоединил и проверил источник входных импульсов (на выходе источника сигнала полевик с открытым стоком) - при подключенном к +5v стоковом резисторе 40 кОм все отлично - <20нс фронты и спады. Стал проверять входные пины Ардуино, и наткнулся на неожиданное: при конфигурировании любого пина на вход с подключенным внутренним подтягивающим резистором - pinMode (.., INPUT_PULLUP), и замыкании его тупо кнопкой на землю получается, как и положено, крутой спад на этом входе, а вот когда кнопка размыкается - ужасно затянутые фронты - время нарастания порядка 4...8мкс, и график соответствует тупо графику заряда конденсатора. Померил ток нуля этого пина - 130 мка, что дает значение внутреннего подтягивающего резистора порядка 40 кОм. Если предположить, что этот фронт обусловлен зарядом конденсатора RC-цепочки, образованной сопротивлением внутреннего подтягивающего резистора и входной емкостью пина Ардуинки, то это дает приближенно значение входной емкости пина C~=6 мкс/40кОм = 150пф (!), во что с трудом можно поверить.
Провел контрольный эксперимент: отключил внутренний подтягивающий резистор, и подключил внешний - с сопротивлением 2кОм. Время нарастания фронта сигала при размыкании кнопки сразу резко уменьшилось - до 500нс приблизительно - что хорошо согласуется с предположением просто о наличии существенной емкости пинов Ардуино. Если прикинуть значение входной емкости в этом случае - это дает С~=500нс/2кОм =250пф - порядок тот-же, что и при подключенном внутреннем подтягивающем резисторе!
Поскольку с трудом могу поверить в наличие настолько больших входных емкостей у пинов этих микроизделий, прошу совета у сообщества: правильно ли я все понимаю? И как вообще тогда может работать этот интерфейс SPI в Ардуино на больших скоростях, ведь борьба за малое время нарастания на входах Ардуино при наличии источника с ОК или ОС тогда может вестись только через уменьшение сопротивления внешних подтягивающих резисторов на этих входах, а я и так уже экспериментировал с небольшими!
Уважаемые, смотрел ли кто-нибудь, что там делается физически на входах осциллографом? B что у Вас наблюдается? Как боретесь?
Спасибо всем!
Внутренний подтягивающий резистор у Дуни от 20 до 50 кОм, поэтому, на шины SPI и I2C надо всегда ставить внешние, и чем больше длина линии, тем меньше резистор надо ставить.
Ёмкость входов по даташиту - 10pF. Я когда измерял, получил практически 20pF, но списал это на ёмкость щупа и общую сопливость собранной на макетке схемы для измерений.
Я в курсе, оттого и удивление. У меня две одинаковые ардуинки - одна совершенно новая, и обе ведут себя совершенно одинаково.
Практически, Вы какие ставите?
Спасибо. Про стандартно емкость входов я тоже так всегда и предполагал.
У меня по всем входам и на двух одинаковых - но из разных партий Arduino Micro (одна вообще новая), совершенно одинаковые картины по фронтам сигналов. Длина линии несколько сантиметров. Подтягивающие резисторы маленького номинала ситуацию исправляют, но за счет резкого увеличения тока потребления. Просто ничего не пойму, потому что понимаю, что такого быть не может!
Минимум, что я ставил, на удалённый DS18B20 правда, не на SPI, был 1 кОм.
SPI у меня всегда в пределах одной платы работали со стандартными 4.7 кОм
> Минимум, что я ставил, на удалённый DS18B20 правда, не на SPI, был 1 кОм.
> SPI у меня всегда в пределах одной платы работали со стандартными 4.7 кОм
А на скорости, на какой? У меня на тесте, когда очень низкую скорость ставил - раз в 50 меньше номинальной, все тоже работало. Проблемы начались уже когда в spi settings частоту 1000000 поставил.
Очень интересно все-таки осциллограмму перехода сигнала из нуля в единицу на любом из пинов Ардуино - как это у других выглядит, посмотреть. Свою без проблем выложу, если кому интересно.
вот и выложи свою. Давай простой стенд - одна ардуинка генерит меандр различной частоты, другая просто его слушает. И смотрим jсциллограмму. Или ты хочешь именно SPI? тоже можно. Одна передает, другая принимает и печатает в Serial.
>вот и выложи свою. Давай простой стенд - одна ардуинка генерит меандр различной частоты, другая просто его >слушает. И смотрим jсциллограмму. Или ты хочешь именно SPI? тоже можно. Одна передает, другая принимает и >печатает в Serial.
Чуть попозже - сегодня вечером, или, возможно, завтра выложу. Сейчас просто перепаиваю плату, в составе которой эта Ардуино. Как успею - сразу выложу. Но там, правда, источником будет выступать не вторая Ардуино, а микросхема электронного потенциометра. Ну, или просто генератор меандра на той-же Ардуино, на выходе на каком-нибудь организую, и подам его на другой вход. Здесь, правда, не удастся выход открытого стока организовать - но я уверен в аналогичности прежнему результату!
А, кстати, чем Вам не нравится мой опыт просто с кнопкой, как я описал в своем первом посте? Куда уже более надежно и доказательно касательно входов Ардуино?
А, кстати, чем Вам не нравится мой опыт просто с кнопкой
Да тем и не нравится, что никогда не знаешь, что там за контакты, что там за дребезг ... может виноваты контакты кнопки?
По мне, так с кнопкой ни грамма не
надежно и доказательно
Да тем и не нравится, что никогда не знаешь, что там за контакты, что там за дребезг ... может виноваты контакты кнопки?
По мне, так с кнопкой ни грамма не
надежно и доказательно
Цифровой осциллограф полностью запоминает, и потом подробнейшим образом развертывает все происходившие как до, так и после события. Эти дребезги, даже если бы они были, никак не влияют на результирующий вид кривой. Обычно дребезг контактов - это какое-то кол-во повторяющихся в течении нескольких микросекунд импульсов, но никак не кривая напряжения заряда конденсатора RC цепочки. И никакого дребезга контактов и сверхдлинного спада не наблюдается при замыкании кнопки - это первое. Характер фронта импульса был совершенно одинаков в том числе при обмене данными с микросхемой цифрового потенциометра, где никакого дребезга в принципе невозможно: и по форме одинаково, и по длительности - это во вторых. Я все это уже описывал в начале своего первого поста.
Если же я буду проверять обмен между двумя Ардуинками (или между разными пинами одной Ардуинки), - там этого эффекта затянутых фронтов вообще может не наблюдаться - в связи с тем, что выходы этих пинов - это не открытый сток, нагруженный на подтягивающий резистор - а, скорее всего, выход на комплементарных моп-транзисторах. И паразитный конденсатор, который я предполагаю на входах пинов Ардуино, будет просто мгновенно перезаряжаться через открытый транзистор одного из (в данном случае верхнего) плеч!
ну я, со своей стороны показываю картинку с совершенно нормальными фротами. ;))) между двумя Нанками на 328 МК. На одной генератор произвольного ШИМ, на другой одна строка: pinMode(8,INPUT_PULLUP);
смоделировал ситуацию ТС. От генератора поставил NPN (2N4401 - если интересно) ключ, в базу 1К, эмиттер на землю. С коллектора снимаем в двух вариантах: только внутренний пулап и дополнительно внешний на 10К.
Мораль - в его ситуации с открытым коллектором нужен внешний пулап, и чем выше частота - тем он нужен меньше ;))))) (...примеряю фуражку капитана Очевидность!)
Только внутренний:
Внешний 10К:
Ну вот и внутренний посчитали - около 60кОм.
Огромное спасибо wdrakula! Всё по делу, и никакой воды!!
Посмотрел твои осциллограммы - все совпадает с такими-же моими, и с моими выводами! Теперь не мучаюсь сомнениями, и точно понимаю, как действовать дальше. Есть несколько путей решения, но дальше это уже моя забота.
Еще раз огромное спасибо за то, что ты просто взял и проверил!
Всем также большое спасибо за участие!
И еще - я все прекрасно знаю и понимаю, что там может происходить при таком виде осциллограммы, и эксперименты с кнопочкой, с измерением тока и подсчета сопротивления внутреннего резистора подтяжки проводились просто для того, чтобы убедится в его целостности, и не надо было бы здесь уже гадать на эту тему. Кнопочка - она также устраняет всякие предположения о чертовщине в недрах p-n переходов. :) (cлишком простой элемент. -:) ).
Что-то я нигде не услышал о входной емкости осциллографа. Какова она согласно документации? Какие автор предпринял шагни, чтобы ее учесть в измерениях, а еще лучше - исключить? Может, применить буферный ОУ с малой входной емкостью, расположенный непосредственно вблизи исследуемых пинов?
Входная емкость моего осциллографа по документации 18pF, и она давала бы на порядок меньший завал фронтов. Её учитывать имело бы смысл, если бы суммарная подсчитанная выше емкость входов Ардуино и осциллографа не отличалась в большую сторону на порядок от этих 18pF. Подсчет проводился прикидочно, точное знание этих пикофарадов сути дела не меняет.
Результирующая величина эквивалентной емкости пина неожиданно оказалась почти на порядок выше имеющихся сведений о типовых значениях емкости входов подобных устройств, что и вызывает удивление и вопросы!
Ну так и возникает вопрос: откуда эта "неожиданная" емкость там появилась.
Для начала неплохо бы убедиться, что она оценивается верно. Я бы попытался подключить параллельно входу емкость известной величины, а затем проверить, на такую же величину изменилось расчетное значение или нет. Второй эксперимент я уже описывал - поставить буфер на ОУ с низкой входной емкостью.
Можно на щупе переключить в 1:10 ипосмотреть что будет. Как то кажется что так емкость щупа меньше. Если делитель правильно скомпенсирован.
Ну так и возникает вопрос: откуда эта "неожиданная" емкость там появилась.
так резистор внутренней подтяжки- интегральный и тоже имеет свою паразитную емкость.
можно почитать тут - https://pandia.ru/text/78/242/92718-3.php
4.7.3 Эквивалентная схема.
Характерной особенностью любого интегрального резистора является наличие у него паразитной емкости относительно подложки или изолирующего кармана. В простейшем диффузионном резисторе такой паразитной емкостью является барьерная емкость перехода между рабочим р-слоем и эпитаксиальным n-слоем кармана.
Строго говоря, совокупность резистора и паразитной емкости представляет собой распределенную RС-линию. Однако для приближенных расчетов удобнее пользоваться эквивалентными схемами с сосредоточенными постоянными: П-образной или Т-образной (рисунок 4.17е). На этой схеме R - сопротивление резистора, СП - усредненная емкость перехода. RC - цепочка снижает частотные свойства и увеличивает переходные процессы в схеме.
Ну так и возникает вопрос: откуда эта "неожиданная" емкость там появилась.
Она там не появилась, она там просто живет... :)
Это проверено мною на множестве пинов двух имеющихся Ардуино из разных партий, и подтверждено только что уважаемым wdrakula! Совпадения формы кривой с формой кривой заряда конденсатора на всех осциллограммах абсолютное. Также практически полное совпадение значений в мкс, на которые затягиваются фронты - у всех трех ардуинок.
Ломать голову над тем, откуда она там появилась имело бы смысл только в том случае, если бы это могло привести к возможности её оттуда "убрать".... )) В данном случае это будет простое бесперспективное теоретизирование.
Для начала неплохо бы убедиться, что она оценивается верно.
Я уже писал выше, что точные цифры абсолютно не интересны.
Я бы попытался подключить параллельно входу емкость известной величины, а затем проверить, на такую же величину изменилось расчетное значение или нет. Второй эксперимент я уже описывал - поставить буфер на ОУ с низкой входной емкостью.
Я не думаю, что входная емкость пинов Ардуино - это некая статичная паразитная емкость между выводом самого пина, и логической землей. Физический вход пина - это некий универсальный вход/выход, схемотехнически состоящий из защитных диодов, входов (база, затвор) и выходов (сток, исток, база, коллектор) транзисторных элементов. И, может, резисторы какие ограничивающие там есть. И емкость эта входная у пина - она, скорее всего, нелинейная, т.е. зависит от состояния (открыт/закрыт) этих транзисторных элементов в том числе (например, подключение внутреннего подтягивающего резистора - по документации это просто подача на пин, работающий как вход, значения High - т.е. открытие соответствующего транзистора, и закрытие комплементарного). И эта нелинейность явно проявляется даже при прикидочном подсчете этой емкости для подтягивающих резисторов встроенного и внешнего (можно посмотреть у меня в первом посте). Если бы она была постоянной - то так сильно - в два раза почти, не отличалась бы хотя бы и в таких примитивных расчетах! Можете проверить дополнительно по осциллограммам и описанию экспериментов у wdrakula чуть выше. Nik_an в предыдущем посте тоже касается этого.
Поэтому я считаю проведение подобных эксперимента излишним и тем более абсолютно бесперспективным в практическом плане.
Если есть какие-либо другие соображения, будет очень интересно узнать. :)
так резистор внутренней подтяжки- интегральный и тоже имеет свою паразитную емкость.
Вопрос в том, учитывается ли эта емкость при указании емкости входа в дэйташите. Или добавляется к ней.
Во втором случае эффективным способом борьбы является отключение внутренней подтяжки при наличии внешней.
Это, опять же, легко проверить экспериментально. Разумеется, при наличии желания. Но ТС, похоже, полагает, что вопрос закрыт.