Как работает калькулятор ошибки бодрейта
Модуль UART внутри микроконтроллера не умеет выдавать произвольную скорость напрямую: он делит тактовую частоту периферии на целое число и получает опорную частоту приёмопередатчика. Из-за этого точно попасть в стандартную скорость (9600, 115200 бод и т. д.) удаётся далеко не с любым кварцем. Калькулятор берёт тактовую частоту, требуемую скорость и коэффициент овердискретизации, находит ближайший целый делитель, восстанавливает реальную скорость на линии и показывает, насколько она отклоняется от заданной. Величина этого отклонения и решает, будет связь работать или начнёт сыпать битыми кадрами. Родственную арифметику самого кадра — старт-бит, данные, паритет, стоп-биты и время передачи — считает калькулятор кадра UART.
Делитель div = округлить( fтакт / (OS · baud) )
Факт. скорость = fтакт / (OS · div) Ошибка = (факт − нужная) / нужная · 100%
Здесь fтакт — тактовая частота, питающая модуль UART, baud — желаемая скорость в бодах, а OS (oversampling) — во сколько раз внутренний счётчик работает быстрее битового потока, чтобы сэмплировать бит в его середине. Идеальный делитель fтакт/(OS·baud) почти всегда дробный, а в регистр можно записать только целое, поэтому его округляют. Именно округление и порождает ошибку: чем крупнее делитель, тем мельче шаг между соседними достижимыми скоростями и тем меньше отклонение. На высоких скоростях делитель становится маленьким (единицы), шаг — грубым, и ошибка резко растёт.
Сколько ошибки можно терпеть
UART асинхронный: у приёмника и передатчика нет общего тактового провода, они лишь договорились о номинальной скорости. Приёмник ловит спад старт-бита и дальше сэмплирует каждый следующий бит по своему таймеру. Если его частота чуть отличается от передатчика, точка выборки медленно уползает от центра бита к краю. За типовой кадр из десяти бит накопленный уход не должен вытолкнуть выборку последнего бита за его границу, иначе стоп-бит прочитается неверно и появится framing error. Отсюда практический порог: суммарная ошибка двух сторон должна укладываться примерно в ±5%, а на каждую сторону закладывают запас ±2%. Значение от 2 до 3% — пограничное: в одиночку ещё работает, но встретившись с такой же ошибкой партнёра, уже рвёт связь. Выше 3% канал считают ненадёжным. Калькулятор подсвечивает эти зоны цветом на шкале: зелёная точка — ошибка в пределах ±2%, оранжевая — на грани, красная — за порогом.
На запас влияет и сама овердискретизация. При 16× приёмник делит битовый интервал на шестнадцать отсчётов и берёт выборку около восьмого — то есть у него есть половина бита, чтобы «переждать» накопленный сдвиг. При 8× шагов вдвое меньше, точка выборки грубее и допустимая ошибка сокращается; режим 1× (прямой BRG без передискретизации) вообще не даёт запаса на дрожание фронтов, поэтому применяется редко и только на коротких надёжных линиях. Поэтому одну и ту же тактовую при 16× можно считать приемлемой, а при 8× — уже рискованной, и калькулятор честно пересчитывает делитель под выбранный режим.
«Удобные» кварцы и выбор тактовой
Стандартный ряд скоростей UART кратен 1200, поэтому нулевую ошибку дают тактовые частоты, нацело делящиеся на эти числа с учётом овердискретизации. Классика — кварцы 1,8432; 3,6864; 7,3728; 11,0592 и 14,7456 МГц: все они кратны 921600 = 8·115200, и на любой стандартной скорости при OS = 16 делитель получается целым, а ошибка равна нулю. Именно поэтому такие «некруглые» номиналы десятилетиями стоят в платах с последовательными портами: производитель заранее заложил их так, чтобы деление на стандартный ряд скоростей давало целый результат без остатка. «Круглые» же 16 или 20 МГц удобны для ядра и таймеров, но для UART дают заметную ошибку на верхних скоростях. Выхода два: поставить специальный кварц под UART либо снизить рабочую скорость до той, где ошибка приемлема. Если частоту задаёт не кварц, а внутренний RC-генератор, добавьте его собственный разброс (обычно ±1…2%) к расчётной ошибке — калькулятор считает идеальную тактовую, а реальный RC гуляет с температурой. Подобрать делители и предделители под нужную частоту помогает расчёт таймера и прескейлера МК, а кварцевую обвязку — калькулятор конденсаторов кварца.
Ошибка стандартных скоростей при 16 МГц
В таблице — что получается на популярной тактовой 16 МГц при овердискретизации 16×. Видно, как до 38400 бод ошибка исчезающе мала, а начиная с 57600 округление делителя резко её раздувает.
| Скорость, бод | Делитель | Факт., бод | Ошибка |
| 9600 | 104 | 9615 | +0,16% |
| 19200 | 52 | 19231 | +0,16% |
| 38400 | 26 | 38462 | +0,16% |
| 57600 | 17 | 58824 | +2,12% |
| 115200 | 9 | 111111 | −3,55% |
| 230400 | 4 | 250000 | +8,51% |
Где применяют — и где не годится
Расчёт нужен всякий раз, когда настраивают последовательный порт микроконтроллера, USB-UART мост, модуль GPS, GSM или Bluetooth: перед прошивкой полезно убедиться, что выбранная пара «кварц + скорость» вообще стыкуется. Та же логика делителя работает в промышленных линиях RS-485, где несколько устройств на одной шине должны попадать в общую скорость с запасом на разброс. Модель применима только к асинхронному UART с целочисленным делителем: она не описывает синхронные интерфейсы с отдельным тактовым проводом и не годится для шин с битовым таймингом и сегментами выборки — там своя арифметика, например битовый тайминг CAN. Не путайте бодрейт (символы в секунду на линии) с полезной пропускной способностью: реальный поток данных за вычетом старт-, стоп- и служебных бит оценивает калькулятор битрейта потока. Наконец, некоторые современные UART умеют дробный делитель (fractional baud) — для них эта простая формула даёт пессимистичную, завышенную ошибку.
Пример
На значениях по умолчанию (fтакт = 16 МГц, скорость = 115200 бод, овердискретизация 16×) идеальный делитель равен 16·10⁶/(16·115200) = 8,68, округляем до 9. Реальная скорость получается 16·10⁶/(16·9) = 111111 бод, а отклонение (111111 − 115200)/115200 · 100% = −3,55% — за порогом надёжности, калькулятор красит точку красным и выдаёт предупреждение. Если взять «удобный» кварц 14,7456 МГц, делитель выйдет ровным (14745600/(16·115200) = 8), реальная скорость совпадёт с заданной, и ошибка станет 0%. Это наглядно показывает, почему для скоростного UART предпочитают некруглые тактовые. Поменяйте в полях частоту, скорость или овердискретизацию — и калькулятор мгновенно пересчитает делитель, реальную скорость и ошибку, а цветная шкала подскажет, остаётесь вы в безопасной зоне или уже вышли за неё.
См. также: кадр UART · таймер/прескейлер МК · битовый тайминг CAN · битрейт потока · RS-485 линия · все калькуляторы
|