Я уже писал об этой системе. Теперь я сосредоточу свои вопросы на направлении «защита от электростатического разряда».
У меня есть система на основе SPI, в которой Raspberry разговаривает с устройством расширения GPIO, используя связь SPI. Чип читает и/или записывает «0»/«1» и отправляет их на Raspberry по шине.
Схема экспандера GPIO — очень простая схема, но иногда после нескольких часов правильной работы случайным образом срабатывает опасное перерасход/перегрев (он почти сгорает). Это прекращается, когда я перезагружаю устройство. После этого устройство имеет нормальное поведение и нормальное потребление. В настоящее время система подключается и тестируется на макетной плате. Таким образом, проводка или лабораторный материал могут влиять немного или сильно.
Некоторые люди предполагают, что такое поведение похоже на «защелкивание», вызванное электростатическим разрядом. В противном случае это может быть вызвано скачками напряжения, положительными скачками или отрицательными GND. Так вот, мне сказали, что мои GPIO нужно защищать резисторами, диодами и конденсаторами. Но я не вижу ни одного примера с диодами, Cs и Rs, защищающими входы/выходы в других проектах, основанных на микроконтроллерах или микропроцессорах. Максимум, что я видел, это последовательные резисторы на некоторых контактах GPIO.
Моя схема намного проще тех, что я видел:
8 контактов расширителя будут входами. Остальные будут выходами.
Выходы расширителя будут записывать '0', а не '1'.
Входы расширителя имеют внутренний Rpull up, который выдает входное напряжение 3,3 В, когда он не подключен.
Я поставил провод на каждый выход, и этот провод мог быть подключен напрямую к входам или нет. Таким образом, при чтении 8 входных контактов те, кто подключен к входам, будут читать «0», а остальные будут читать «1».
Ввод будет читать эти 3 сценария:
Особенностью этой системы является то, что GPIO не будут настроены как входы или выходы в остальное время. Таким образом, во время одного выполнения вывод может быть настроен как вход во время инициализации, но при следующем выполнении тот же самый вывод может быть настроен как выход.
Это явление перегрева не происходит более одного или двух раз в день. Но боюсь, что одного раза будет достаточно, чтобы разрушить систему.
При окончательном проектировании печатной платы контакты GPIO будут проложены через плату, получив 64-контактный разъем. Вход и выход будут соединены через провод, который соединит или не соединит два контакта 64-контактного разъема с помощью человеческого соединения во время выполнения. Таким образом, цепь между одним входом и одним выходом может быть замкнута. Но также могут быть разомкнутые цепи между остальными входами и выходами.
Я добавил 10 000 рупий на каждый GPIO устройства и использую 100 нФ между VDD и GND. Кажется, два дня назад этого больше не произошло, но я хотел бы обеспечить свои GPIO, если схема действительно нуждается.
Эта схема нуждается в защите GPIO? Достаточно ли этих резисторов?
Вопрос
Почему мой расширитель GPIO MCP23S17 сильно нагревается и сходит с ума?
/ продолжать, ...
Отвечать
Часть 1. Тестовая установка
Я бы предложил начать с меньшей версии пользовательских требований. Например, вместо того, чтобы делать вещи очень гибкими, любой контакт может быть входом или выходом, вы можете на этапе тестирования позволить только 8 контактам вводить, а другим контактам - только выход.
PA0~7 установлен в режим ввода
PB0~7 установлен в режим вывода
Только когда при тестировании вы обнаружите, что фиксированный режим ввода/вывода контактов в норме, вы обобщаете программу.
mcp23017_test_v0.2_2020aug0101 ОБЩЕСТВЕННЫЙ
Часть 2. Разъяснение по ESD и фиксации
Вы могли заметить, что продавцы обычно отгружают комплектующие в металлических пластиковых пакетах, а также на металлических губках. Это для антистатика.
Операторы сборочных и испытательных заводов носят такие антистатические повязки:
Я любитель играть с дешевыми компонентами, и я никогда не заморачиваюсь, потому что шансы подхватить вирус ESD очень и очень малы.
Это в старые времена, когда электронные компоненты стоили дорого, люди заморачивались. Или вы остаетесь в очень засушливой стране, носите одежду из поли / пластика / нейлона, тогда вам нужно побеспокоиться. Конечно, у всех есть шанс быть пораженным молнией. Возможно, вам следует погуглить дальше для ума.
(См. A.2) Электростатическое оборудование, повышающее безопасность и защиту рабочего места — AntiStat
Часть 3 - Рекомендации по использованию внешнего источника питания для MCP23S17
Я всегда рекомендую новичкам НЕ использовать 5-вольтовую или 3-вольтовую шину Rpi для питания MCP23S17 или других периферийных устройств, а использовать внешний источник питания, по крайней мере, для стадии прототипирования.
Таким образом, если MCP23S17 сойдет с ума, Rpi все еще будет сидеть спокойно. Поэтому я просто вручную сбрасываю MCP23S17, и мне не нужно сбрасывать Rpi, шоу продолжается.
Часть 4 - Возможные причины перегрева
То, что вы говорите о перегреве, немного беспокоит.
MCP23S17 не может работать с большими токами. Я обычно использую буферные чипы для обработки больших токов. Если вы перегрузите все 16 выходных контактов GPIO большим током, у вас будут большие проблемы.
Я просмотрел таблицу и сделал резюме:
(1) Общая мощность = 700 мВт
(2) Максимальный ток на выводе VSS = 150 мА
(3) Максимальный ток на выводе VDD = 25 мА.
(4) Входной ток фиксации = ±20 мА
(5) Выходной ток фиксации = ±20 мА
(6) Максимальный выходной ток, потребляемый любым выходным контактом = 25 мА.
(7) Максимальный выходной ток, создаваемый любым выходным контактом = 25 мА.
Итак, вы видите, если вы нагрузите 6 контактов GPIO 25 мА, то общий ток превысит ограничение вывода Vss в 150 мА. Обычно я использую 8 больших чипов ULN2803A, чтобы выполнять всю тяжелую работу. Каждый из 8 больших парней может обрабатывать 500 мА, ...
Кажется, вы используете 10 Ом для последовательного ограничивающего/защитного резистора. Возможно, вы захотите выполнить расчеты, чтобы убедиться, что индивидуальный предел тока GPIO и общий предел тока Vcc не превышен.
Часть 5. Тестирование и программирование пары/свопа
Часто бывает полезно использовать более двух образцов для тестирования пары/перестановки. Часто компонент может быть неисправен по прибытии или поврежден из-за небрежного подключения или тестирования. Так часто только путем сравнения и сравнения местами вы находите ошибки небрежного подключения. Вы можете использовать MCP23s08 или MCP23017 для перекрестного тестирования. В версиях I2C и SPI MCP23x17 отличается только часть настройки. Основные рабочие функции идентичны для MCp23SS17 и MCP23017 017. Время от времени делать снимки — хорошая документация для дальнейшего использования.
/ продолжать, ...
Рекомендации
Часть A. Спецификации и статьи
(A.1) Техническое описание MCP23S17/MCP23017 — MicroChip
(A.2) Электростатическое оборудование, повышающее безопасность и защиту рабочего места — AntiStat
(A.5) Adafruit I2C 16-канальный 12-разрядный ШИМ/серводрайвер — 15 долларов США
(A.6) Техническое описание ШИМ-контроллера PCA9685 — NXP
(A.7) mcp23s17 Технический паспорт - Микрочип
(A.8) Модуль AliExpress MCP23S17
(A.9) Модуль TaoBao MCP23S17
(A.10) Преобразователь логического уровня (ULN2803, TBX/TSX0102/4/6/8 и т. д.) 1/2
(A.11) Преобразователь логического уровня (ULN2803, TBX/TSX0102/4/6/8 и т. д.) 2/2
(A.12) Зажимной диод TVS, MOV - Лиз Лондон, 2019март16
(A.13) (TVS) Диод подавления переходного напряжения — Википедия
(A.14) Диоды для защиты от электростатических разрядов (диоды TVS) — Toshiba
(A.16) ESD (электростатический разряд) — Википедия
Часть B - Обсуждения на форуме
Часть C. Схемы
(C.1) mcp23s17_test_2020jul3002 Схема CircuitLab — tlfong01 2020jul3001
(C.2) mcp23017_test_v0.2_2020aug0101 ПУБЛИЧНЫЙ tlfong01 2020aug01
Приложения
Приложение A — Байпасные и развязывающие конденсаторы — Роберт Кейм, AAC
Введение
Не исключено, что целеустремленный, успешный студент-инженер закончит колледж, почти ничего не зная об одном из самых распространенных и важных компонентов, встречающихся в реальных схемах: шунтирующем конденсаторе. Даже опытные инженеры могут не до конца понять, почему они включают керамические конденсаторы емкостью 0,1 мкФ рядом с каждым выводом питания каждой микросхемы на каждой печатной плате, которую они проектируют.
В этой статье содержится информация, которая поможет вам понять, зачем нужны шунтирующие конденсаторы и как они улучшают характеристики схемы, а в следующей статье основное внимание будет уделено деталям, связанным с выбором шунтирующих конденсаторов и методами компоновки печатных плат, которые максимизируют их эффективность.
Решение
удобно, что такую серьезную проблему можно эффективно решить с помощью простого, широко доступного компонента. Но зачем конденсатор? Простое объяснение состоит в следующем: конденсатор накапливает заряд, который может подаваться на ИС с очень низким последовательным сопротивлением и очень малой последовательной индуктивностью.
Таким образом, переходные токи могут подаваться от шунтирующего конденсатора (через минимальное сопротивление и индуктивность), а не из линии электропередачи (через сравнительно большое сопротивление и индуктивность). Чтобы лучше понять это, нам нужно рассмотреть некоторые основные понятия, связанные с тем, как конденсатор влияет на цепь.
Однако сначала краткое примечание о терминологии: компоненты, обсуждаемые в этой статье, обычно называют как « шунтирующими конденсаторами », так и « развязывающими конденсаторами ».
Здесь есть тонкое различие: «развязка» относится к уменьшению степени влияния одной части схемы на другую, а «обход» относится к обеспечению пути с низким импедансом, который позволяет шуму «обходить» ИС на своем пути. к наземному узлу.
Оба термина можно использовать правильно, потому что шунтирующий/развязывающий конденсатор выполняет обе задачи. Однако в этой статье предпочтение отдается термину «шунтирующий конденсатор», чтобы избежать путаницы с последовательным развязывающим конденсатором, используемым для блокировки постоянной составляющей сигнала.
Стандартный подход
Приведенный выше анализ помогает нам понять классическую схему обхода:
конденсатор 10 мкФ в пределах одного или двух дюймов от микросхемы, и
керамический конденсатор емкостью 0,1 мкФ как можно ближе к выводу питания:
Конденсатор большего размера сглаживает низкочастотные колебания напряжения питания, а конденсатор меньшего размера более эффективно отфильтровывает высокочастотные помехи в питающей сети.
Если мы включим эти шунтирующие конденсаторы в описанную выше симуляцию с 8 инверторами, звон будет устранен, а величина возмущения напряжения уменьшится с 1 мВ до 20 мкВ , ...
Приложение B – Проблема с заземлением и ее решение
(1) Проблемы с контуром заземления и как от них избавиться - Томи Энгдаль, 2013 г.
(2) Блок питания RpiZero через 40-контактный разъем питания/GPIO или разъем microUSB
(3) Проблема заземления цепи кнопки Rpi GPIO
Приложение C. Старая плата прототипа MCP23S17/MCP23017 для тестирования
Я думаю использовать свой старый MCP23S17 или MCP23017, чтобы провести некоторые тесты. Глядя на запутанную проводку моей старой платы MCP23017, я теперь вспоминаю, почему в прошлый раз я отказался от работы с SPI MCP23S17 и переключился на I2C MCP23017, потому что проводка, сделанная своими руками, очень запутана, и ее трудно устранять аппаратными неполадками. Для I2C MCP23S17 есть дешевые прорывные платы, которые говорят, что я много времени занимаюсь проводкой.
Приложение D. Заметки по настройке макетной платы MCP23s17
Приложение E. Тестирование SPI 00, 01, 10, 11, 12 Зацикливание и повторная отправка одного байта OK
# Program:
# spi_loopback_v55.py tlfong01 2020aug03hkt1220
#
# Function:
# 1. SPI one byte loopback
# 2. SPI repeatedly send one byte
#
# System Config:
# Rpi4B buster (r2020may23), python 3.7.3 (r2019dec20), thonny v3.2.7 (r2020jan22)
# $ date Thu 25 Jun 2020 04:36:13 PM HKT
# $ uname -a Linux raspberrypi 4.19.118-v7l+ #1311 SMP Mon Apr 27 14:26:42 BST 2020 armv7l GNU/Linux
# $ ls /dev/ttyUSB* /dev/ttyUSB0
# $ ls /dev/ttyS0 /dev/ttyS0
# $ ls /dev/ttyAMA0 /dev/ttyAMA0
# Test Function Definitions:
#
# Test 1 - loopBackTest() - SPI port send and receive one byte.
# Function - Send one byte to MSOI and read it back from MISO.?
# Setup - Connet MOSI pin to MISO pin to form a loop.
#
# Test 2 - repeatSendByte() - SPI port repeatedly send out single bytes. ?
# Function - Repeat many times sending a byte, pause after each byte.
# 1. SPI ports setup notes
# To enable SPI and setup SPI 10, 11, 12 ports, add these two lines to /boot/config.txt
# dtparam=spi=on
# dtoverlay=spi1-3cs
# To list SPI devices
# pi@raspberrypi:~ $ ls /dev/spi*
# /dev/spidev0.0 /dev/spidev0.1 /dev/spidev1.0 /dev/spidev1.1 /dev/spidev1.2
# 2. Notes of loopback function
# Call example - testLoopbackOneByte(spiPort00)
# Function - send byte 0x5b to SPI MOSI and read byte from MISO
# Setup - must connect MOSI pin to MISO pin to loop back
# Note - 1. Only checks if MISO echoes MOSI, CS0, CS1, CS2 is not checked
# 2. To check if SPI 0, CS0, CS1, or SPI1 CS0, CS1, CS2, need a scope to display repeat send bytes
from time import sleep
import spidev
# *** Setup SPI Ports ***
spiPort00 = spidev.SpiDev()
spiPort00.open(0,0)
spiPort00.max_speed_hz = 100000
spiPort01 = spidev.SpiDev()
spiPort01.open(0,1)
spiPort01.max_speed_hz = 100000
spiPort10 = spidev.SpiDev()
spiPort10.open(1,0)
spiPort10.max_speed_hz = 100000
spiPort11 = spidev.SpiDev()
spiPort11.open(1,1)
spiPort11.max_speed_hz = 100000
spiPort12 = spidev.SpiDev()
spiPort12.open(1,2)
spiPort12.max_speed_hz = 100000
# *** Define SPI Functions ***
def spiSendRecvOneByte(spiPort, sendByte):
sendByteArray = [sendByte]
recvByteArray = spiPort.xfer(sendByteArray)
return recvByteArray
def loopBackOneByte(spiPort, sendByte):
recvByteArray = spiSendRecvOneByte(spiPort, sendByte)
recvByte = recvByteArray[0]
print('\nBegin testLoopbackOneByte(),....')
#print('')
print(' sendByte = ', hex(sendByte))
print(' recvByte = ', hex(recvByte))
#print('')
print('End testLoopbackOneByte(),....')
return
def repeatSendOneByte(spiPort, sendByte, pauseTimeBetweenBytes, repeatCount):
print('\nBegin repeatSendByte(),....')
print(' Now use a scope to display the SPI signals, MOSI, MISO, CSn, ...')
for i in range(repeatCount):
spiSendRecvOneByte(spiPort, sendByte)
sleep(pauseTimeBetweenBytes)
print('End repeatSendByte().')
return
# *** Test Funtions ***
def testLoopbackOneByte(spiPort, dataByte):
loopBackOneByte(spiPort, dataByte)
return
def testRepeatSendOneByte(spiPort, dataByte, pauseSeconds, repeatTimes):
repeatSendOneByte(spiPort, dataByte, pauseSeconds, repeatTimes)
return
# *** Main ***
# *** Test SPI Loopback Functions, Comment out not required tests ***
print('\n*** testLoopbackOneByte(spiPort00, 0x5b) ***', end = '')
testLoopbackOneByte(spiPort00, 0x5b)
#print('\n*** testLoopbackOneByte(spiPort01, 0x5b) ***', end = '')
#testLoopbackOneByte(spiPort01, 0x5b)
#print('\n*** testLoopbackOneByte(spiPort10, 0x5b) ***', end = '')
#testLoopbackOneByte(spiPort10, 0x5b)
#print('\n*** testLoopbackOneByte(spiPort11, 0x5b) ***', end = '')
#testLoopbackOneByte(spiPort11, 0x5b)
#print('\n*** testLoopbackOneByte(spiPort12, 0x5b) ***', end = '')
#testLoopbackOneByte(spiPort12, 0x5b)
# *** Test SPI Repeat Send One Byte Functions, Comment out not required tests ***
# *** SPI 00, 01 Repeat Send One Byte ***
#print('\n*** testRepeatSendOneByte(spiPort00, 0x5b, 0.001, 200000) ***', end = '')
#testRepeatSendOneByte(spiPort00, 0x5b, 0.001, 200000)
#print('\n*** testRepeatSendOneByte(spiPort01, 0x5b, 0.001, 200000) ***', end = '')
#testRepeatSendOneByte(spiPort01, 0x5b, 0.001, 200000)
# *** SPI Repeat Send One Byte 10, 11, 12 ***
#print('\n*** testRepeatSendOneByte(spiPort10, 0xb5, 0.001, 200000) ***', end = '')
#testRepeatSendOneByte(spiPort10, 0xb5, 0.001, 200000)
#print('\n*** testRepeatSendOneByte(spiPort11, 0xb5, 0.001, 200000) ***', end = '')
#testRepeatSendOneByte(spiPort11, 0xb5, 0.001, 200000)
#print('\n*** testRepeatSendOneByte(spiPort12, 0xb5, 0.001, 200000) ***', end = '')
#testRepeatSendOneByte(spiPort12, 0xb5, 0.001, 200000)
# End of program
''' Smple output tlfong 01 2020aug03hkt1219
>>> %Run spi_loopback_v54.py
*** testLoopbackOneByte(spiPort00, 0x5b) ***
Begin testLoopbackOneByte(),....
sendByte = 0x5b
recvByte = 0x5b
End testLoopbackOneByte(),....
*** testLoopbackOneByte(spiPort01, 0x5b) ***
Begin testLoopbackOneByte(),....
sendByte = 0x5b
recvByte = 0x5b
End testLoopbackOneByte(),....
*** testLoopbackOneByte(spiPort10, 0x5b) ***
Begin testLoopbackOneByte(),....
sendByte = 0x5b
recvByte = 0x5b
End testLoopbackOneByte(),....
*** testLoopbackOneByte(spiPort11, 0x5b) ***
Begin testLoopbackOneByte(),....
sendByte = 0x5b
recvByte = 0x5b
End testLoopbackOneByte(),....
*** testLoopbackOneByte(spiPort12, 0x5b) ***
Begin testLoopbackOneByte(),....
sendByte = 0x5b
recvByte = 0x5b
End testLoopbackOneByte(),....
>>>
Python 3.7.3 (/usr/bin/python3)
>>> %Run spi_loopback_v54.py
*** testRepeatSendOneByte(spiPort00, 0x5b, 0.001, 200000) ***
Begin repeatSendByte(),....
Now use a scope to display the SPI signals, MOSI, MISO, CSn, ...
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Python 3.7.3 (/usr/bin/python3)
>>> %Run spi_loopback_v54.py
*** testRepeatSendOneByte(spiPort01, 0x5b, 0.001, 200000) ***
Begin repeatSendByte(),....
Now use a scope to display the SPI signals, MOSI, MISO, CSn, ...
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Python 3.7.3 (/usr/bin/python3)
>>> %Run spi_loopback_v54.py
*** testRepeatSendOneByte(spiPort10, 0xb5, 0.001, 200000) ***
Begin repeatSendByte(),....
Now use a scope to display the SPI signals, MOSI, MISO, CSn, ...
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Python 3.7.3 (/usr/bin/python3)
>>> %Run spi_loopback_v54.py
*** testRepeatSendOneByte(spiPort11, 0xb5, 0.001, 200000) ***
Begin repeatSendByte(),....
Now use a scope to display the SPI signals, MOSI, MISO, CSn, ...
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Python 3.7.3 (/usr/bin/python3)
>>> %Run spi_loopback_v54.py
*** testRepeatSendOneByte(spiPort12, 0xb5, 0.001, 200000) ***
Begin repeatSendByte(),....
Now use a scope to display the SPI signals, MOSI, MISO, CSn, ...
End repeatSendByte().
>>>
'''
# *** End ***
Приложение F. Повторите снимки экрана области байтов отправки
Приложение G. Настройка двух плат MCP23S17 Proto
Конец ответа
Только я
Suvi_Eu
Suvi_Eu
тлфонг01
тлфонг01
тлфонг01
тлфонг01
тлфонг01
тлфонг01
тлфонг01
тлфонг01
тлфонг01
Suvi_Eu
Suvi_Eu
Suvi_Eu
Suvi_Eu
тлфонг01
тлфонг01
тлфонг01
тлфонг01
тлфонг01