среда, 8 января 2025 г.

Гальванический изолятор для UART на оптопарах

Собрал простейшую схему гальванического изолятора для 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 для автоматического сброса микроконтроллера.

Комментариев нет:

Отправить комментарий