Собрал простейшую схему гальванического изолятора для USB UART преобразователя. Для этой задачи есть специализированные микросхемы вроде ADUM1201, но был спортивный интерес попробовать максимально доступный вариант с использованием оптопар. Под рукой нашлись только оптопары PC817C производства UMW (Китай).
Первый вариант схемы показал время реакции около 200 мкс, хотя документация обещает около 18 мкс. Вдумчивое чтение даташита вывело на график "Response Time vs. Load Resistance" из которого следует что чем меньше сопротивление нагрузки транзистора оптопары, тем быстрее она срабатывает.
Уменьшил номинал сопротивлений R4 и R5 с 10k на 330 и время реакции стало около 20 мкс. В итоге схема выглядит так
Поскольку оптопары не блещут скоростью работы, то набросал скрипт который передаёт данные через два USB UART преобразователя постепенно увеличивая скорость передачи и сравнивает контрольную сумму. Если она не сходится, то тестирование прекращается
#!/bin/bash set -euo pipefail dd if=/dev/urandom of=test.bin bs=1k count=100 SHA256SUM=$(sha256sum test.bin | sed -e 's/test.bin/test.out/') for BAUDRATE in 9600 19200 38400 57600 115200 do echo "### Testing $BAUDRATE ###" stty -F /dev/ttyUSB0 $BAUDRATE raw stty -F /dev/ttyUSB1 $BAUDRATE raw dd if=/dev/ttyUSB1 of=test.out & RECV_PID=$! dd if=test.bin of=/dev/ttyUSB0 echo -n "Wait for transmission end " SRC_SIZE=$(du -b test.bin | awk '{print $1}') for i in $(seq 1 60) do SIZE=$(du -b test.out | awk '{print $1}') if [ $SIZE -eq $SRC_SIZE ]; then echo break fi echo -n . sleep 1 done echo kill $RECV_PID echo "$SHA256SUM" | sha256sum -c - if [ $? != 0 ]; then break fi done
В итоге 38400 бод это максимальная скорость на которой данные передаются без ошибок. И это не удивительно, т.к. теоретические 18мкс времени реакции оптопары это 55555 бод максимум.
Такой скорости недостаточно чтобы использовать штатный загрузчик Arduino для обновления прошивки - там нужна скорость передачи 57600 или 115200 в более новых платах. А ещё нужно добавить передачу сигнала DTR для автоматического сброса микроконтроллера.
Комментариев нет:
Отправить комментарий