Точность часов.

Итак, насколько точные часы (тактовый сигнал) нужны для работы УАПП (UART)? Сперва посмотрим на идеальную пару часов, которые работают на одной и той же частоте.

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

Посмотрим на график слева, изображающий часы, которые отличаются всего на 6%, легко заметить, когда появится первая проблема — полностью пропущен бит 9! Используя эти часы, мы не сможем переслать даже один кадр данных! (Кстати, этот тип ошибки передачи данных классифицируется как ошибка ошибка кадра!). Мой выбор 6% для этого графика неслучаен; такие ошибки указаны в характеристиках msp430 для калиброванной тактовой частоты (заметьте, калиброванной, а не просто основной!), плюс возможное отклонение 3% при воздействии температуры и других возможных факторов (сильно влияет напряжение питания и его стабильность. прим.перев.) Если мы будем использовать калиброванный тактовый сигнал в качестве часов для отправителя и получателя, мы могли бы получить реальную ошибку в 6%, что сделало бы нашу передачу по УАПП (UART) абсолютно ненадёжной!

На самом деле не всё так печально, так как этот случай — наихудший сценарий, и вероятно, что часы в вашем компьютере (если вы хотите его использовать для общения его вместо другого msp430) более точны. В общей сложности отклонения в 5% между часами в среднем приводят к ошибке кадра на 11 бите, 4% отклонения — на 13 бите, так что у нас пока отклонение вполне допустимо для того, чтобы в короткий промежуток между кадрами можно было «синхронизироваться» для продолжения общения по протоколу. Обратите внимание, это означает, что мы ограничены размером буфера для надёжной связи, и наша фактическая скорость передачи данных будет намного меньше, так как нам нужно будет восстановление между кадрами. Если вы хотите быструю связь, — необходимы очень точные часы!

Кварцевые генераторы.

Лучший вариант повысить точность часов — использование кристаллов (кварцевых резонаторов, или просто кварцев). Часовой кристалл (кварц), который поставляется с лончпадом, достаточно точный в широком диапазоне температуры, до 20ppm (0,002%)! Однако есть у него и определённые недостатки — кристаллу нужно некоторое время, чтобы стабилизироваться, так же он потребляет некоторое количество энергии. Кроме того, на частоте 32 768 Гц мы не сможем достичь высокой скорости передачи. Обычно нам нужно около 16 тактов на бит, чтобы точно определить стартовый бит и начать отбор битов точно в середине каждого. Используя это правило, самая высокая скорость передачи, которую мы могли бы достичь с часовым кристаллом (кварцем) — это 2048 бод. Большие микроконтроллеры msp430 позволяют установку высокочастотных кварцевых резонаторов, но несовместимы с Launchpad серий G2xx. Однако, если мы будем аккуратны, вполне возможно получить скорость  передачи данных до 9600 бод и с часовым кварцем.

Пайка кристалла к вашему launchpad может показаться сложной задачей, однако это на самом деле не так уж и трудно сделать. Немного терпения (и небольшого кусочка липкой ленты — скотча) — это всё что нужно. Ну это кроме паяльника и припоя, конечно. Если вы ещё не установили кристалл на ваш launchpad и хотите это сделать, то есть ряд хороших демонстраций техники пайки кристаллов на плату, доступных на YouTube. На данный момент я буду считать, что вы уже успешно припаяли кристалл.

Вы могли заметить несколько пустых мест около кристалла для конденсаторов. Для кристалла (кварца) чтобы работать на правильной частоте необходима определённая ёмкость на землю. Если ёмкости не будет, колебания могут не работать, или кристалл не заработает вообще. Кристалл (кварц), включённый в комплект launchpad, требует ёмкость 12,5 пФ. На входах msp430 для кристалла уже есть конденсаторы, которые можно выбирать самостоятельно. Пользователь может выбрать из 1, 6, 10 и 12,5 пФ, в зависимости от указанной на кристалле ёмкости. (По умолчанию включены 6пФ). Выбор ёмкости осуществляется установкой двух битов XCAPx регистра BCSCTL3.

Если по каким-то причинам вам нужны ёмкости кроме одной из этих, вы можете припаять другие конденсаторы к контактным площадкам на внешней стороне. К сожалению это не так просто, как установить конденсаторы 12,5пФ; параллельно с конденсаторами будет ещё и сам чип. Формула для расчёта правильной ёмкости нагрузочных конденсаторов: C1 = C2 = 2 * C_Load — (Cp + Ci), где

C_Load — ёмкость, обозначенная на кристалле (кварце),

Cp — любые паразитные ёмкости (например дорожек платы),

Ci — внутренняя ёмкость msp430.

Последние два слагаемых могут быть установлены битами XCAPx. Так, кристалл, который требует 18пФ, придётся установить на плату конденсаторы ёмкостью 30пФ (используя внутреннюю ёмкость по-умолчанию на 6пФ).

В большинстве случаев использования кристаллов устанавливают значения по-умолчанию в модуле BCS+. Чтобы использовать поддерживаемый кристалл, вам реально нужно только две строчки:

BCSCTL3 | = XCAP_3 // 12,5 пФ для кварца LaunchPad
__delay_cycles (55000) // задержка для стабилизации колебаний кварца

В первой строке устанавливается ёмкость конденсатора соответственно вашему кристаллу, при использовании кристалла другой ёмкости должна быть изменена. Вторая строка устанаваливает задержку для стабилизации работы кварцевого генератора на рабочей частоте. Как долго на самом деле необходимо ждать? Обычно нужно несколько сотен миллисекунд. В приведённом примере задержка — 55000 тактов; по умолчанию тактовый генератор работает на частоте около 1,1Мгц — это составляет примерно 50 миллисекунд. В зависимости от вашего приложения при необходимости можно сделать задержку больше.

Самокалибровка внутреннего генератора.

Если вы обратили внимание, то возможно заметили ещё одну проблему при использовании часового кварца: Какой частоты сигнал тактового генератора может быть получен от кристалла? 9600 бод — это 3,41 тактовых циклов. 1200 бод использует больше тактов, поэтому эта скорость более надёжна, но она по-прежнему составляет 27,31 тактов. Ближайший делитель — это 27 тактов, которое соответствовало бы 1213,6 бод с погрешностью 1,1%. Кажется, что мы потеряли в точности, используя кварцевый резонатор! Существуют резонаторы, делители для которых составляют отличные стандартные скорости. Для 7,3728МГц кристалл, например, выходит 768 на бит для 9600 бод. Если вы используете контроллер msp430 с высокочастотным кварцевым резонатором, это отличный выбор для соединения по последовательному интерфейсу на стандартных скоростях. Другой вариант — это использование внутреннего тактового генератора.

Но, погодите-ка, мы ведь утверждали, что погрешность калиброванных значений внутреннего тактового генератора слишком высока,чтобы её применять? Да, это так, но в определённых случаях мы можем сделать её меньше. С одной стороны, погрешности, указанные в технической документации, охватывают весь диапазон температуры, при котором msp430 может работать, а это — от -40°С до +85, и весь диапазон напряжений, при которых сохраняется стабильная работа, — это от 1,8 до 3,6В. Как правило, мы не будем достигать таких крайностей. Даже если и так, то пока температура и напряжение питания достаточно стабильны и не собираются меняться слишком сильно во время работы, то можно откалибровать внутренний тактовый генератор в этой конкретной конфигурации! В итоге погрешность генератора будет намного лучше, чем указанные 3%; В даташите указано, что уже при диапазоне температур от 0 до 85°, калибровка соответствует 0,5% отклонений при питании от 3В.  (Очевидно, что стабильное напряжение питания — это ключ к стабильности тактового генератора).

Калибровка внутреннего тактового генератора достаточно проста, но процесс требует точных часов для сравнения частоты, это как раз работа для кварцевого резонатора. Идея очень проста — использовать резонатор для задания точного временного интервала (к примеру — 1 с). Мы знаем, сколько колебаний должно произойти при заданной частоте в этот интервал времени, так что мы можем регулировать тактовый генератор, пока не получим максимально приближенное значение к тому, какое должны получить. Тогда мы сохраним значения для DCOCTL и BCSCTL, и у нас будет точная калибровка наших часов! Вот как происходит такое волшебство:

void Set_DCO(unsigned int Delta) { // Установка DCO на выбранную частоту
unsigned int Compare, Oldcapture = 0;
BCSCTL1 |= DIVA_3; // ACLK = LFXT1CLK/8
TACCTL0 = CM_1 + CCIS_1 + CAP; // CAP, ACLK
TACTL = TASSEL_2 + MC_2 + TACLR; // SMCLK, режим непрерывного счёта, очистка
while (1) {
while (!(CCIFG & TACCTL0)); // Ждём захвата
TACCTL0 &= ~CCIFG; // Захват произошёл, сброс флага
Compare = TACCR0; // получение текущего значения SMCLK
Compare = Compare - Oldcapture; // разница SMCLK
Oldcapture = TACCR0; // Сохраняем текущее значение SMCLK
if (Delta == Compare)
break ; // Если совпадают, - выходим "while(1)"
else if (Delta < Compare) {
DCOCTL--; // DCO слишком быстр, уменьшаем
if (DCOCTL == 0xFF)
if (BCSCTL1 & 0x0f)
BCSCTL1--; // уменьшаем RSEL
}
else {
DCOCTL++; // DCO слишком медленный, увеличиваем
if (DCOCTL == 0x00)
if ((BCSCTL1 & 0x0f) != 0x0f)
BCSCTL1++; // Увеличиваем RSEL
}
}
TACCTL0 = 0; // Останавливаем TACCR0
TACTL = 0; // Остановка таймера_A
BCSCTL1 &= ~DIVA_3; // ACLK = LFXT1CLK
}

Этот код пришёл из dco_flashcal.c — пример кода, имеющегося на большинстве девайсов msp430. Файла примера кода для устройств g2xx1 кажется не было, поэтому я скопировал его из примеров для серии F21x2, изменив TACCTL2 на TACCTL0 для совместимости с launchpad.

Это немного кода для разбора, но всё оказывается очень просто. ACLK настраивается на использование часового кварца, с делителем на 8 — это 4096Гц. Таймер устанавливается в режим захвата, срабатывая по отпусканию CCI0B. (Из документации на G2231 или G2211 это соответствует ACLK). Если это условие кажется запутанным, посмотрите урок по измерителю ёмкости, в котором использовался режим захвата.) Таймер работает SMCLK, источником для него — внутренний тактовый генератор (DCO). Если мы хотим откалибровать 2МГц, то в один тактовый цикл ACLK мы ожидаем, что получим 2МГц / 4096 = 488,3Гц (циклов). Мы передаём значение 488 процедуре, которая запускает часы и таймер. Когда происходит захват, она проверяет, больше или меньше количество циклов SMCLK прошло, и соответственно регулирует DCO и RSEL регистры. Эта процедура повторяется, пока не найдётся конфигурация, которая возвращает только 488 циклов в интервале времени. Значения в регистрах DCO и RSEL, которые затем получаются калибровочными, и мы хотим сохранить, мы просто берём из регистров DCO и BCSCTL1, сохраняя их значения для дальнейшего использования.

Эта процедура используется в примере DCOcalibrate.c Попробуйте его (конечно же, с припаянным кристаллом), и посмотрите, какие значения получаются для DCOCTL, BCSCTL1, для каждой частоты при калибровке. Если вам посчастливилось иметь осциллограф, измерьте их на выходе P1.4, чтобы убедиться в их верности. (Код заканчивается на последней калибровке, вы можете модифицировать код в конце, чтобы добавить код для измерения, или добавить код для изменения частоты, которую хотите наблюдать.) Вы можете сохранить их для следующих уроков, в следующий раз мы кратко рассмотрим, как записать во флэш-память msp430, так чтобы потом можно было это использовать.

Упражнение для читателя:

  • Насколько хорошо выполнена калибровка на заводе? Измените код программы, чтобы найти калибровочные значения для частоты 1МГц. Как они соотносятся со значениями, хранящимися в CALDCO_1MHZ и CALBC1_1MHZ? Похоже, что у многих читателей калибровка на 1МГц с завода, по крайней мере для ранних экземпляров msp430, ближе к 980 кГц.
  • Насколько сильно изменение температуры влияет на результат? Поместите launchpad на какое-то время в тёплое место, или наоборот, в холодильник; лучше бы, конечно в морозильник, но есть опасность образования конденсата! Затем повторно выполните код программы. Насколько отличаются калибровочные значения?
  • Возможно ли пойти в обратном направлении калиброванную частоту, — для измерения частоты кварцевого резонатора? Проведите эксперимент, чтобы посмотреть, как настройки XCAPx могут влиять на кварц. При каких из них происходят колебания? Как изменится частота, если использовать 10пФ вместо 12,5 пФ? Не забывайте, вы можете написать программу, чтобы узнать это!

Дополнение к уроку:

Как я уже писал, я начал думать о том, как бы мне проверить мои высказывания, обсуждаемые в уроках, о необходимости точных часов в UART. Недавно я приобрёл логический анализатор, который очень быстро оказался весьма полезным моим интрументом! Вероятно я использую его в ближайшее время, пытаясь разобрать и отладить некоторые из моих проектов, над которыми буду работать в конце концов.

В любом случае, я считаю, это может быть интересным, если использовать анализатор для того, чтобы показать, что происходит, когда часы незначительно отличаются. Четыре канала, показанные здесь, измеряют один и тот же сигнал, красный — в норме (9600), жёлтый — погрешность 3% (фактически — 9888 бод), зелёный — ошибка уже 6% (теоретическая ошибка с использованием двух часов с точностью +/- 3%, эффективно — 10176 бод) и синий канал — 10% ошибки (эфф. 10560 бод).

На второй картинке увеличенное изображение первого символа, на котором можно лучше видеть ошибку кадра. Точка, помещённая на каждый график, показывает в каком месте происходит семплирование каждого потока данных. При 6% ошибке программа достаточно умна, чтобы декодировать символ, но стоп-бит оказывается пропущен из-за ненадёжной связи. На практике необходимо иметь лучше, чем 5% в сочетании для надёжной связи. (используя одинаковые системы, каждая из которых имеет часы с точностью лучше 2,5%).

Отметим, что это верно не совсем для всех случаев; здесь я использую кодирование 8N1. Если я использовал бы кадр больше 10 бит, использумых для 8N1, к ошибке кадра могут привести гораздо меньшие ошибки часов. Если вы используете протокол для отправки данных больше 10 бит, вам необходимы более точные часы.

Это был просто интересный небольшой тест, который я провёл, чтобы испытать мой классный логический анализатор.

источник

дополнение