К вопросу о задержках и длительностях

в 14:28, , рубрики: микроконтроллеры, программирование микроконтроллеров, Производство и разработка электроники, электроника

«и доказал, что поскольку… то схема на частотах требуемого диапазона работать не будет» Савченко «Открытие себя»

Поводом к написанию данного опуса послужило, как всегда и бывает у меня, стечение обстоятельств. Размышляя над особенностями возможной реализации интерфейса от микроконтроллера (МК) к WS2812, наткнулся, причем совершенно случайно, на нечто аналогичное на сайте одной фирмы, называть которую не буду, поскольку намерен ее слегка (а может и сильно, пока не знаю, будет видно по ходу изложения) поругать. Даю подсказку — она занимается продажей в нашей стране Arduino плат и шилдов к ним, название начинается с первой буквы русского алфавита, заканчивается на нее же, и товар, сподвигший меня на данный пост, расположен на последней позиции четвертой страницы в разделе «Платы и модули», на странице этого товара можно найти схему устройства и ссылку на программу, о которых я и хотел бы рассказать кое-что интересное, в особенности для молодых инженеров (ну я так думаю). Не знаю, как у других обитателей Хабра, а у меня бывает такое, что читаю текст и вижу, что какое-то слово в нем неправильное. То есть сразу понимаю, что оно неправильное, но потом нужно некоторое время, чтобы в него вчитаться и понять, что именно в нем неправильно и где ошибка. К сожалению, данное правило действует только в отношении чужих текстов, когда я вычитываю свой, то частенько читаю не то, что реально написано, а то, что собирался написать (я то ведь твердо знаю, что тут должно быть). Ну так вот, при первом же взгляде на схему мне она показалась неправильной, и при внимательном рассмотрении первое мнение подтвердилось.

Сначала общие предпосылки к разработке данной схемы и некоторые теоретические положения.
При разработке различных электронных устройств мы часто сталкиваемся с необходимостью визуализации результатов обработки входящей информации, как с целью отладки, так и для реализации необходимого функционала. Один из наиболее часто используемых способов являются светоидные излучатели оптического диапазона (набившее всем оскомину мигание светодиодом — один из примеров), причем как в виде отдельных элементов, так и в виде сборок излучателей, из которых весьма распостраненными являются семисегментные индикаторы (на самом деле в наше время они восьмисегментные, но, видимо, так было не всегда).
Управление подобным прибором не представляет собой особо сложной задачи, особенно если не прибегать к мультиплицированию, но прямое управление (то есть одна ножка на один сегмент) представляет 2 трудности в реализации: во-первых, количество задействованных ножек равняется количеству сегментов, то есть в случае четырехразрядного индикатора нам потребуется 4*8=32 ножки МК, что не всегда возможно, и во-вторых, если мы решим первую проблему, то нас ждут неприятности по втекающему (вытекающему) току, 32*(пусть даже и)4 = 128ма, что очевидно превышаете характеристики обычных МК (обычно регламентируется ток на одной ноге (от 4 до 20 ма), но есть и ограничение по сумме одновременно протекающих токов (от 100ма до 300ма)) и хотя, скорее всего, МК не выйдет из строя и даже будет функционировать в таких условиях, выходить за рамки ТУ (в настоящее время их именуют даташитами) я бы категорически не рекомендовал (мы об этом поговорим подробно позже).
Поэтому широкое распространение получили разного рода буферные схемы, которые позволяют путем различных ухищрений снизить количество задействованных ног МК и распределить ток светодиодов по нескольким корпусам, существенно улучшив условия функционирования как МК, так и буферов.

Из богатого разнообразия буферных схем авторами вышеупомянутого устройства были выбраны сдвиговые регистры типа 74НС595, которые широко известны среди радиолюбителей. Данные приборы позволяют при помощи трех входов управлять восьмью выходами (естесственно, не бесплатно, усложняется алгоритм управления, но мы ничего другого и не ожидали), но, кроме того, данные приборы можно включать последовательно, что позволяет при помощи все тех же трех ножек управлять теоретически неограниченным количеством выходных сигналов (практически, конечно, ограничения есть, но об этом чуть позже).

Немного подробностей о регистрах вообще и 595 в частности
Сюда я буду выносить то, что для меня очевидно, но может быть не вполне понятно некоторым из читателей.
Упомянутая микросхема представляет собой сдвиговый регистр с дополнительным стробируемым регистром на выходе. Попробуем перевести эту фразу на русский язык.

Прежде всего, что такое регистр. Это устройство, которое позволяет зафиксировать его выходы в некоторый момент времени в зависимости от состояния входов в этот момент и в дальнейшем, т.е. до наступления другого такого момента выходы не меняются вне зависимости от изменения входов. При этом наступление такого момента определяется некоторыми из входов, которые выполняют специальные функции (вот такое непростое выражение у меня получилось для короткого слова строб).

Что нам дают регистры как таковые для решения обозначенных проблем — мы можем поставить несколько регистров, их информационные входы объединить, для каждого из них сделать отдельный строб и, затратив N+n выходов МК, получить N*n независимых выходных сигналов, для нашего примера с N=8 и n=4 потребуется 12 ножек МК вместо 32. Эта схема легко масштабируется, но все равно для ряда МК даже и 12 выходов — недопустимая роскошь.

И тут на помощь приходят сдвиговые регисты, которые позволяют при помощи всего лишь двух ножек огранизовать сколь угодно много выходов на управляемое устройство (иникатор). Принцип работы сдвигового регистра аналогичен обычному регистру (он состоит из множества одновыводных регистров, или триггеров) и заключается в фиксации выходного значения в момент подачи строба, а изюминкой является то, что выход одного триггера является входом другого (но еще и выходом устройства в целом) и входной сигнал подключается только к первому триггеру. При этом мы сначала подаем вход для последнего триггера в цепочке, фиксируем его на первом триггере при помощи строба, затем подаем сигнал для предпоследнего триггера в цепочке, очередным стробом фиксируем его в первом триггере, при этом то, что было записано в первый триггер предыдущим стробом, переносится во второй триггер цепочки, и сели мы продолжам данную процедуру требуемое количество стробов, то вся необходимая информация окажется в нужнах триггерах на всем протяжени цепочки. Нетрудно видеть, что схема является масштабируемой, то есть увеличения длинны цепочки триггеров не приводит вообще к увеличению количества необходимых выводов МК.

У этой схемы есть один важный недостаток (на самом деле их не один, но нам важен именно он) — в процессе продвижения информации выходы всех триггеров в цепочке неоднократно меняют свое зачение, прежде, чем получить предназначенные именно им данные. Если мы будем записывать информацию достаточно быстро, а потом в течении длительного (по сравнению с записью) времени оставлять ее неизменной, то исполнительное устройство может и не заметить этих быстрых смен значений, особенно если он достаточно медленное. К сожалению, сведотиоды к подобным медленным устройствам не относятся, и Вы будут удивлены, если проведете эксперименты с целью посмотреть, какой длительности импульсы приведут к наблюдаемым вспышкам света (с кратковременными отключениями все намного лучше, наблюдать их Вы едва ли сможете, но это слабое утешение).

Поэтому прибор 595 состоит из двух частей — сдвигового регистра длинной 8 и включенного вслед за ним обычного регистра шириной 8 бит, информация в котором фиксируется по специальному входу. При этом мы производим запись в сдвиговый регист при помощи строба сдвига, но информация на выходах не меняется, а вот по заверешению сдвиговых операций мы выдаем строб переписи и информация на всех выходах синхронно обновляется и опять остается неизменной, позволяя нам осуществлять следующую процедуру записи в сдвиговый регистр.

Вот такое у меня получилось описание регистра, наверное, я все таки преувеличиваю степень неподготовленности аудитории, но Вы можете спойлер и не открывать. Кстати, там внизу будем опрос, не поленитесь ответить, пожалуйста, это для меня, как для автора, действительно важно.

Итак, мы получаем возможность при помощи всего лишь трех ножек МК управлять произвольным количеством выходов, предназначенных, в нашем случае, для включения/выключения сегментов светодиодного индикатора. То есть наш выигрыш очевиден, в чем же проигрыш, он точно должен быть, ибо «ДарЗаНеБы»? Проигрыш состоит в более длительном времени, необходимом для передачи информации, по сравнению с методом прямого управления, причем составит он ориентирочно N*n раз. Для относительно медленных устройств (а светодиоды, несомненно, к ним относятся, так как конечным потребителем является человек с его ограниченными, и весьма, скоростями обработки информации), такой проигрыш не столь существеннен, но тем не менее он имеет место, и забывать об ограничениях того либо иного метода не следует, если Вы не любитель ходить по граблям.

Но, как известно, совершенству нет предела, и пытливая мысль разработчиков стала искать способы сократить еще больше количество необходимых ножек. Для этого нам необходимо объединить функции, выполняемые некоторыми из наших трех ножек, или даже всех. Объединять будем как минимум в одну, я все-таки плохо себе представляю интерфейс к устройству из менее чем одного сигнала (обратите внимание, я написал сигнала, а не провода — это по поводу беспроводных систем). Какие мы имеем возможности в этом направлении? Их не так много, а всего-лишь две — манипуляция амплитудой сигнала и манипуляция временными параметрами. В сторону амплитуды мы можем даже не смотреть, движение в этом направлении весьма затруднено, а вот с временем можно и поиграться. Например, мы можем заменить два сигнала — данные и строб на один, примем факт наличия сигнала эквивалентен приходу строба, а вот временные параметры (длительность, как вариант) может нести информацию о состояниии данных.
По такому пути пошли многие, в том числе и разработчики вышеупомянутого устройства, логику их решения можно представить следующим описанием: передаем по одной линии сигнал в виде импульсов различной длительности — короткий, подлиннее и длинный. Один из них будет означать передачу единицы, другой — нуля, а третий — завершение передачи и фиксацию информации в выходном регистре. Выбор конкретного распределения длительностей определяется нашим стремлением (вполне естественным) передавать информацию как можно быстрее, поэтому для наименее редко встречающегося сигнала (признака завершения передачи) применим наиболее длительный импульс, оставшиеся два можно распределить произвольно, но, исходя из логики функционирования 595, удобнее для записи единицы применять короткий импульс, так что для нуля ничего, кроме среднего по длительности, не осталось.

Теперь для работы нашего устройства нам необходимы аппаратные решения, способные отличить один сигнал от другого (провести селекцию по временным параметрам). Вот почему мы выбрали длительность, поскольку селектор по данному параметру сигнала намного проще в реализации, чем по иным параметрам, для чего может быть с успехом применена схема, состоящая из последовательно соединенных резистора и конденатора на землю, так называемая RC цепочка, известная также как интегрирующая цепочка или фильтр низких частот первого порядка.
Если мы посмотрим на схему описываемого устройства, то мы увидим на ней две таких цепочки, одна из которых предназначена для различения короткого и подлиннее импульса (тут прячется засада, но об этом позже), а вторая — для разделения импульса подлиннее и длинного. Вот о расчете параметров этих цепочек мы с Вами и поговорим.

Идея селектора такого типа очень проста — конденсатор не позволяет напряжению на нем изменяться скачкообразно, поэтому при подаче на интегрирующую цепочку импульса напряжение в конце этого импульса будет зависеть от его длительности (по непростой формуле, но это неважно), и если сам момент окончания импульса принять за строб, то напряжения на конденсаторе в этот момент может быть рассмотрено, как данные, и зафиксированно на выходе регистра (сдвига). Отсюда требования к длительности импульса — короткий импульс должен создавать на конденсаторе напряжения, воспринимающееся входом регистра, как высокий уровень, а длинный — как низкий.

Здесь мы имеем дело сразу с множеством неизвестных — длительности двух видов импульсов, амплитуда импульсов (она входит в формулу), параметры цепочки, высокий и низкий уровни входные уровни. Начнем сокращать их количество. Сразу определимся, что импульсы принимают два значения по амплитуде — высокий, равный напряжению питания (U), и низкий, равный земле(0). Строго говоря, это совершенно не обязательно, но так получается намного проще и, поверьте, выбор других значений нам жизнь не упростит, а совсем наоборот.
Следующие данные — входные уровни, здесь нам поможет ТУ на микросхему, которое утверждает, что для 74НС595 любое напряжение, превосходящее 0.7*U, будет считаться высоким, а любое напряжение, не превосходящее 0.3*U, будет считаться низким, здесь U — нарряжение питания регистра и пусть оно совпадает с U для параметров импульса, опять таки так проще сделать и проще считать. Обратим внимание, что распространенное мнение о пороговом значении в 0.5*U авторами ТУ не поддерживается.

Небольшое отвлечение в сторону, по Вашему, что больше: 4.2В или 3.2В? Не торопитесь с ответом, подумайте, ведь Ваш совершенно естественный ответ придет с противоречием с мнением известной фирмы NXP, в ТУ которой на данный прибор на странице 7 приведено минимальное значение 4.2В, а типовое 3.2В (лично мне казалось, что типовое должно быть между минимальным и максимальным и максимальное должно быть больше минимального, а тут так никак не получится, ну да век живи, век учись). К счастью, не менее уважаемая фирма TI в своем ТУ приводит минимальное значение входного напряжения 4.2В, на которое и будем ориентироваться. Все эти данные приведены для U = 6В, то есть выполняется 4.2=6*0,7.
Вообще то, позволю себе легкое фе в сторону NXP (они все равно Хабр не читают, а из Вас им никто не настучит, что я их поругал, так что я ничем не рискую), а что такое вообще типовое значение порога и на кой леший оно сдалось? Большинство микросхем переключаются при этом значении во всем диапазоне? Все микросхемы переключаются при этом значении в нормальных условиях? Я могу придумать еще с десяток подобных определений, но смысл в том, что типовое значение никому не нужно, ну разве что в целях общего развития, если мы проектируем устройство, которое работает без подбора компонентов, что, кстати, прямо запрещено ГОСТ, ну да эта аббревиатурой, видимо, в наше время многие пренебрегают, а ведь их неглупые люди придумывали.

Возвращаясь к нашей задаче, мы определили 4 неизвесных, осталось еще две — длительности имрульсов и параметры цепочки. С последним легко — поведение интегрирующей цепочки описывается уравнением U(t)=Uo+(U-Uo)*(1-exp(-t/T)), где Uo-напряжение на конденсаторе в момент изменения прилагаемого к резистору напряжения, U-значение прилагаемого напряжения, T=R*C-постоянная времени цепочки, t-время.
Тогда напряжение в момент окончания импульса длительностью Tx составит Ux=U0+(U-Uo)*(1-exp(-Tx/T)).
Если мы зададимся значением Tx, то время, за которое напряжение достигнет такого значения, мы получим по формуле
Tx=-T*ln(1-(Ux-Uo)/(U-Uo)), или, если мы подставим выбранные значения, то Tx=-T*ln(1-(Ux-U)/(0-U)) и очевидно, что Tx=-T*ln(Ux/U).
Подставим конкретные значения и получим Tx(Ux=0.7*U)=0.35*T и Tx(Ux=0.3*U)=1,2*T.

Какие практические выводы мы может сделать из этих двух цифр? Прежде всего 1.2/0.35=3,43, это означает, что длительности импульсов, распознаваемые нашим селектором, должны различаться минимум в 3,43 раза. Усилим данное требование путем учета возможного разброса компонентов, который положим для резистора 10%, а для конденсатора 20% (с последним не все так хорошо, обычно в ТУ указывают -20%/+50%, но мы взяли конденсаторы с хорошими показателями), тогда получаем 3,43*1,1/0,9*1,2/0,8=6.29, и это есть отношение длительностей импульсов, которые будут гарантированно распознаваться при любом (в рамках ТУ) изменении параметров схемы. Конечно, это предельные значения, и в практике весьма маловероятно одновременное отклонение параметров в одну сторону, но мы обязаны учитывать наихудший случай. «Конечно, всего этого можно и не делать, если Вас не интересует конечный результат» — Жванецкий.

Аналогичные цифра у нас получаются для отношения постоянных времени двух селекторов, которые должны по разному реагировать на один импульс, оно должно превосходить 6.29 для удовлетворения критерия надежного срабатывания. Теперь мы можем переходить к выбору оставшихся неизвестных, а именно длительности импульсов и параметрам селекторов.

Для начала определим дополнительный критерий выбора — мы стараемся спроектировать схему с максимальным быстродействием, поэтому, по возможности, длительности импульсов должны быть минимальными. В качестве длительности короткого импульса (t1) выберем ту, которую имеет минимально возможный в силу аппаратных ограничений (скорость работы МК и выбранный способ формирования импульса) импульс. Вслед за этим определяем длительность импульcа подлиннее (to) в 6.29*t1 и, соответственно, длительность длиного импульса (t2) определяем в 6,29*6,29*t1=39,51*t1.

Тогда постоянная времени первого селектора должна быть T1>=t1/0.35/0.9/0.8=t1*3.96 и одновременно T1<=t0/1.2/1.2/1.1=t0*1.15=t1*3.97, то есть значение T=3.96*t1 удовлетворяет обоим критериям, ну так и должно быть. Аналогично получаем, что постоянная времени второго селектора T2=3.96*t2=156.5*t1. Осталось выбрать значение t1 и задача выбора длительности импульсов решена полностью.

Но посмотрим, не осталось ли еще каких-нибудь вопросов? Выясняется, что остались, а именно вопрос об интервалах между импульсами. Поскольку мы в расчетах предполагали, что начальное значение напряжения на конденсаторе составляло U — напряжение питания, а в конце импульса оно существенно от этого значения отклоняется, поэтому мы должны принять меры к тому, чтобы вернуть напряжение на конденсаторе к напряжению питания.
Если мы догадались параллельно резистору включить диод (лучше Шотки и лучше с небольшим токоограничивающим резистором параллельно), то напряжение будет во время паузы между импульсами возрастать с существенно меньшей постоянной времени и эта проблемма теряет актуальность, хотя тогда мы должны учитывать прямое падение напряжения на диоде при определении начального значения.
Если же мы этого не сделали (ну так получилось), то нам потребуется довольно таки значительный интервал между импульсами, и все равно, если посмотреть на формулу поведения напряжения от времени, мы значение высокого уровня не получим НИКОГДА, хотя со временем приблизимся к нему на пренебрежимо малую величину. Ну да теория пределов имеет к реальным разработкам весьма отдаленное отношение, и мы должны задаться некоторой устраивающей нас точностью. Расчеты показывают, что если для восстановления напряжения мы выберем значение временного интервала в 3*(T1,T2), то напряжение на конденсаторе перед очередным импульсом составит не менее 0.95*U, что является достаточно хорошим приближением.

Таким образом, мы получили все необходимые данные для построения схемы и для реализации программы, данные схему обслуживающую, необходимо только определить t1, а все остальные параметры получаются автоматом.Остался еще один заслуживающий внимания вопрос — о том, как мы будем реализовывать постоянные времени T1,T2, ведь они определяются соотношением T=R*C, а это означает, что требуемое значение может быть получено множеством способов. Решения обычно принимают исходя из различных факторов, иногда просто из наличия того либо иного номинала либо его применимости в других местах устройства, но мы подойдем к этому вопросу научно.

Для начала рассмотрим резистор, на который накладываются ограничения сверху — ток, протекающий через резистор в селекторе, должен быть существенно (на порядок и более) выше, нежели входной ток цепей приборов, к нему подключенных, иначе наши исходное предположение о зависимости напряжения от времени подлежат корректировке. Обращаемся к ТУ и видим, что входной ток составляет 1мкA, тогда получаем Ir=U`/R >> i=i1*n, где U` — минимальное напряжение в конце импульса, i1 — входной ток прибора, n — количество приборов. Отсюда R << U`/i1/n, подставляя значения R << 0.3*3.3/(1*10-6)/4=247 Ком.
Но есть и ограничение снизу, помимо того, что для маленького резистора может потребоваться слишком большая емкость, а именно мощность, на резисторе выделяемая. Для нее верно соотношение Pr=U*Ir=U*U/R<=Pmax, откуда получаем R>=U*U/Pmax=3.3*3.3/0.125=87 ом (для малогабаритных резисторов). Не то чтобы это было сильное ограничение, требования по разумной емкости все равно заставят нас резистор увеличить, но помнить о нем никогда не вредно.
Тем не менее наши расчеты привели нас к диапазону 247Ком >> R >=87 ом, что лишний раз подтверждает эмпирическое правило — если лень считать номинал резистора, ставь 10Ком, не ошибешься. Ну а задавшись номиналом резистора, номинал конденсатора рассчитывается в одно действие.

Но тут нас подстерегает одна опасность — полученный расчетом номинал конденсатора может оказаться недоступным (ну нет его в стандартном ряду), поэтому в расчеты отношений длительностей импульсов и постоянных времени следовало бы добавить еще 10% расстройки, оставляю это для пытливого читателя. И еще одно соображение, которое в реальной схеме вряд ли проявится, но помнить о нем надо — выбранный номинал конденсатора должен существенно (на порядок и более) превосходить входную емкость прибора, которая согласно ТУ составляет 10 пФ, что приводит к ограничению снизу C >> 10пФ*4 =40 пФ, иначе мы должны учитывать ее в своих расчетах, а я этого категорически не рекомендовал бы, поскольку мы знаем только ее верхнюю границу.

Теперь, когда мы знаем, как надо рассчитывать элементы подобной схемы, обратим внимание на конкретную реализацию, с которой все и началось. Там применены в первой селектирующей цепочке резистор 3.3Ком и конденсатор 2.2нФ, что определяет t1=7,26 мксек, а для второго селектора t2=72.6 мксек, что удовлетворяет критерию t2>6.29*t1. Номиналы обоих резисторов удовлетворяют условиям выбора, конденсатор тоже проходит по ограничению снизу, тут все хорошо. Правда, мы несколько снизили возможное быстродействие, но это не так критично.

Далее, определяем длительности импульсов. Длительность импульса записи единица должна быть t1<=0.38*T1=2.54 мксек, длительность импульса записи нуля должна быть 0.35*T2=25.4>=t0>=1.2*T1=8.71 мксек и длительность импульса фиксации данных должна быть t3>=1.2*T2=87.12 мксек. Пауза после t1 должна быть более 3*T1=21 мксек, пауза после t0 — более 3*Т1=21 мксек и пауза после t3 — более 3*T2=210 мксек.

Посмотреть длительости подаваемых импульсов на схеме мы, естественно, не сможем, поэтому обратимся к тексту скетча, доступного по ссылке на странице описания товара. И вот тут нас ожидате некоторое расхождение, а именно мы видим в тексте программы следующие значения:
импульс t1 — длительность по тексту определить не удается, используются функции из стандартных библиотек, но для быстродействия в 16 мГц количество команд в 2.54*16=40 команд для записи 1 в выходной регистp должно быть достаточно — удовлетворяет требованиям;
пауза после t1 — 30 мксек >= 21 мксек — удовлетворяет требованиям;
длительность t0 — 15 мксек >= 8.71 мксек, 15 мксек =< 25.4 мксек — удовлетворяет требованиям;
пауза после t0 — 60 мксек >= 21 мксек — удовлетворяет требованиям;
длительность t2 — 60 мксек >=87.12 — не удовлетворяет требованиям;
пауза после t2 — 300 мксек>=210 мксек — удовлетворяет требованиям.

То есть мы видим, что длительность импульса фиксации не обеспечивает надежного срабатывания второго селектора и работа устройства в целом не гарантирована. Как же так может быть, ведь данное устройство предлагается к реализации и такая ошибка должна быть сразу обнаружена? Объяснение этому возможно разное — мы рассчитывали пределы для наихудших случаев, а в типовом случае все хорошо, поскольку информация меняется не так часто, по пропуски обновления могут быть незаметны, если иногда устройство все-таки будет срабатывать, на самом деле пауза после t1 должна быть не 21 мксек, а 3*72=210 мксек, поэтому при передачи нулей наблюдается понижение начального уровня и, соответственно, облегчаются условия срабатывания, ну и, наконец, мы (я) просто где-то чего-то недоучли.

Для проверки некоторых из этих предположений проводим эксперимент по моделированию данной схемы в программе Proteus (кстати, пользуюсь случаем ее порекомендовать, действительно очень неплоха, хотя и не без странностей) и видим, что эксперимент подтверждает правильность наших рассчетов — при длительности t2 в 60 мксек фиксации данных не происходит, а при наличии в информационном потоке нулей перед импульсом фиксации длительность импульса достаточна в 75 мксек, а не в 87 мксек, как было по расчетам, и как есть при наличии единиц перед импульсом фиксации. Тем не менее, 60 мксек недостаточно никогда.

Внимательное изучение репозитория приводит к еще одному обяснению — если мы смотрим релиз библиотеки в архиве, то там стоит 100 мксек, что вполне удовлетворяет требованиям, а вот если мы смотрим непосредственно доступные файлы, то видим 60 мксек и сообщение о том, что это фикс двухмесячной давности. Я не очень хорошо разбираюсь в GitHub, может быть, там так положено, но, по моему, это просто признак небрежности.

Итак, я показал, что программа не будет устойчиво работать с данными на схеме номиналами селективной цепочки, однако внимательный читатель сразу заметит, что такое несоответствие я не мог обнаружить, только посмотрев на схему (как я заявил в начале поста), без текста программы, да еще и проделав все необходимые вычисления в уме. «Не верю» — воскликнет внимательный читатель и будет абсолютно прав. Кроме данного несоответствия, которое может и не проявляться на конкретных экземплярах устройств (ведь есть, кроме максимального, еще и типовое значение, и с ним все будет хорошо), в схеме есть и другой недостаток, который гораздо более существенен.

Заключается он в том, что импульс фиксации, помимо своей основной функции, совершит еще и запись в сдвиговый регистр, поскольку его прекращение будет расценено прибором, как строб. В результате в первый разряд цепочки запишется 0, а все остальные данные будут сдвинуты и мы увидим совсем не то, что ожидали. К длительностям импульсов данное обстоятельство не имеет никакого отношение и является неустранимым. Вот это мне и бросилось в глаза.

Несколько снизить остроту проблеммы можно, если при записи данных учесть это обстоятельство и для первого индикатора передавать не все 8 бит, а только 7. Тогда при передаче импульса фиксации все данные сдвинутся и окажутся на своих местах, а последний бит, который строго равен нулю, мы не будем выводить на индикатор, чтобы его не было заметно. Именно по этому пути разработчики и пошли, если обратить внимание на то, что на схеме первый выход первого прибора не подключен к индикатору. Подтверждение также можно найти в тексте программы, где вывод информации осуществляется функцией

static void sendByte(uint8_t pin, byte data, byte n = 8)

с дефолтным параметром 8, причем вывод последней секции можно было бы сделать с явным параметром 7, но почему то этого не сделано.
Следует также отметить, что такое решение все равно оставляет нас без возможности зажечь точку в первом индикаторе и было бы неплохо где нибудь об этом прямо указать.

Резюмируя, можно с уверенностью заявить, что приведенная разработчиком программа что в архивном, что в развернутом варианте с приведенной разработчиком схемой правильно работать не может и не будет. Какие можно было бы сделать минимальные изменения в схеме (очевидно, что никакие изменения в программе управлять первым разрядом первого индикатора нам не позволят), чтобы данная программа могла функционировать без ошибок? К счастью, таки изменения возможны. Достаточно всего лишь добавить в цепь второго селектора инвертор, либо в виде прибора, либо в виде инвертирующей транзисторной схемы (в этом случае придется пересчитать длительности, исходя из параметров транзистора), и вышеуказанная проблема будет успешно решена. При этом во время передачи импульса t2 (а не по его окончанию) будет сформирован сигнал перезаписи, который зафиксирует правильную информацию, а после окончания импульса прибор примет строб, исказив информацию в регистре, но на выходах, в силу особенностей функционирования прибора, это не скажется. Надеюсь, разработчики так и сделали, просто забыли обновить схему на своем сайте (что опять таки говорит о небрежности) и выпускаемые ими устройства продолжают радовать любителей электроники своей безупречной работой.

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

Автор: GarryC

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js