Как определить тактовую частоту микроконтроллера? Печать
Добавил(а) microsin   

Тактовая частота, на которой работает микроконтроллер AVR, определяет скорость его работы. Для некоторых realtime приложений (например для библиотеки V-USB) тактовая частота критически важный параметр, от которого зависит - будет программа работоспособна или нет. Поэтому важно уметь определять тактовую частоту, на которой работает микроконтроллер.

[На что влияет тактовая частота микроконтроллера?]

Ответ на этот вопрос прост - на скорость работы. Длительность каждого такта микроконтроллера AVR обычно соответствует времени выполнения одной инструкции на языке ассемблера (хотя есть инструкции ассемблера, время выполнения которых составляет 2, 3, и даже 4 такта). То есть чем выше тактовая частота, тем быстрее микроконтроллер работает, тем точнее его реакция на внешние события. Для приложений реального времени (например для программной работы с протоколом USB через библиотеку V-USB) бывает нужно очень точно знать длительность выполнения каждой инструкции программы.

Кроме того, в ядро AVR встроено множество периферийных аппаратных устройств - АЦП, UART, SPI, I2C и многое другое. Работа всех этих узлов зависит от тактовой частоты. Например, Вы не сможете точно задать скорость работы UART (RS-232), если не знаете его тактовую частоту.

Для вычисления задержек в программе часто используют удобные макросы-функции delay_us и delay_ms. Корректность их работы напрямую зависит от того, насколько рабочая частота микроконтроллера AVR соответствует программной константе F_CPU.

Таким образом, важно знать, как формируется тактовая частота, и уметь определять её действительное значение. Давайте разберем самые популярные варианты тактирования микроконтроллера AVR, чтобы научиться определять рабочую тактовую частоту.

[Кварцевый резонатор]

Очень часто (и это относится к макетным платам AVR-USB-MEGA16, AVR-USB162, AVR-USB162MU, metaboard, userial [1]) рабочая тактовая частота AVR точно равна частоте кварцевого резонатора (или просто кварца), который подключен к микроконтроллеру. В этом случае фьюзами (или программно) выключен встроенный предделитель тактовой частоты (prescaler). Ниже представлены примеры внешнего вида кварцевых резонаторов с маркировкой, где цифрами указана рабочая частота кварцевого резонатора.

ATmega16-16MHz ATmega32A-12MHz    

На фотографии слева показан фрагмент старого варианта макетной платы AVR-USB-MEGA16 с кварцевым резонатором на 16 МГц. Многие примеры программ и готовые прошивки скомпилированы именно для этой частоты кварца. Справа показан новый вариант AVR-USB-MEGA16 с кварцем на 12 МГц.

Приложения, работающие с USB на макетной плате AVR-USB-MEGA16, обязательно должны учитывать тактовую частоту микроконтроллера, т. е. должны быть скомпилированы точно на ту частоту кварца, который установлен на макетной плате, иначе программа работать не будет. Причина проста - интерфейс USB имеет строгие параметры по времени, т. е. параметры сигналов D+, D- по длительности логических уровней 0 и 1 должны быть очень точно выдержаны. Эти параметры для макетных плат AVR-USB-MEGA16 контролируются библиотекой V-USB, когда программно на низком уровне обрабатывается протокол USB. Точность выдерживается за счет виртуозно написанного кода на языке ассемблера, где длительности сигналов подобраны нужным количеством команд NOP. Поэтому работа программы жестко привязана к частоте кварцевого резонатора, и прошивка микроконтроллера должна быть скомпилирована точно на рабочую тактовую частоту. Для библиотеки V-USB эти частоты могут быть 12, 15, 16, 16.5, 20 МГц (чаще всего используются частоты 12 и 16 МГц).

В программе тактовая частота задается специальными константами (например F_CPU), которые потом проверяются препроцессором компилятора - чтобы правильно подключить нужный модуль кода. Константа F_CPU часто задается в makefile, и передается компилятору через опции командной строки. Константа может быть также задана в заголовочном файле программы на языке C (так называемом хедере, файле с расширением *.h).

Будьте внимательны, когда выбираете в программе тактовую частоту для микроконтроллера - если Вы случайно запрограммируете микроконтроллер, который работает на частоте 12 МГц, не той прошивкой (например, которая рассчитана на работу с частотой 16 МГц), то получите неработоспособное устройство USB, которое не будет определяться операционной системой. Очень много вопросов пользователей (почему мое устройство USB не работает?..) связано с некорректной тактовой частотой прошивки.

ATmega328-PU-16Mhz

На этом фото показана макетная плата metaboard с микроконтроллером ATmega328-PU и кварцевым резонатором на 16 МГц. Здесь тоже для приложений USB используется программная обработка протокола на основе библиотеки V-USB. Поэтому все, что было сказано по поводу частоты кварца для макетной платы AVR-USB-MEGA16, в равной степени относится и к metaboard.

AT90USB162-16MHz

На этой фотографии показан фрагмент макетной платы AVR-USB162 с установленным кварцем на 16 МГц. Здесь используется микроконтроллер AT90USB162 с аппаратным интерфейсом USB, поэтому он намного быстрее справляется с задачей обработки протокола USB, чем обычный микроконтроллер AVR. Здесь тоже важна тактовая частота, на которой работает микроконтроллер - для приложений USB можно использовать кварцы на частоты 8 или 16 МГц, но программа очень строго должна это учитывать.

[Работа микроконтроллера от внутреннего тактового генератора]

Для приложений, где не нужно точно генерировать нужные интервалы времени, или когда не надо получить максимальное быстродействие микроконтроллера AVR, можно использовать встроенный в микроконтроллер RC-генератор. Частота этого генератора равна 8 МГц, по умолчанию она поделена на 8, и в результате микроконтроллер работает на частоте 1 МГц. Делитель может быть запрограммирован на разные коэффициенты деления, и также может быть отключен, так что максимальная рабочая тактовая частота микроконтроллера может быть 8 МГц. Достоинство такого генератора в том, что не нужно использовать внешний кварцевый резонатор, схема упрощается, конечное радиоэлектронное устройство можно сделать дешевле в производстве. Недостаток в том, что неточность RC-генератора ограничивает область применения такого варианта получения тактовой частоты.

Вариант работы генератора (RC-генератор, внешний кварц, коэффициент деления частоты) определяется фьюзами микроконтроллера AVR. Фьюзы микроконтроллера AVR могут быть изменены только с помощью внешнего программатора (интерфейсы ISP, JTAG, или может быть применен так называемый "параллельный" интерфейс программирования). Большинство микроконтроллеров AVR, которые выходят с заводов Atmel, поставляются настроенными на работу от внутреннего генератора, с включенным делителем на 8, т. е. при подаче питания они сразу заработают на частоте 1 МГц. В некоторых пределах тактовую частоту можно подстраивать программно с помощью записи значений констант в специальный настроечный регистр. Подробнее про фьюзы и настройку тактирования микроконтроллера AVR Вы можете узнать из даташита на Ваш микроконтроллер.

[Использование PLL]

Некоторые микроконтроллеры позволяют для получения тактовой частоты использовать PLL. Эта аббревиатура расшифровывается как Phase Locked Loop, что означает фазовая автоподстройка частоты, ФАПЧ. Смысл этого всего в том, что микроконтроллер работает от внутренней тактовой частоты, которая генерируется путем умножения и деления частоты внутреннего RC-генератора, причем частота RC-генератора подстраивается программно. Хороший пример использования такого генератора - приложения V-USB с микроконтроллером ATtiny45 (или ATtiny85), например USBrelay [2]. Микроконтроллер работает на частоте 16.5 МГц, которая получена с помощью RC-генератора и PLL. Частота точно подстраивается программно по синхросигналам начала фрейма USB (так называемый сигнал SOF, Start Of Frame), которые имеют очень точную периодичность 1 мс. Подробнее про PLL см. даташит микроконтроллера и исходный код USB-Relay [2].

[Определение тактовой частоты с помощью осциллографа]

В некоторых сложных случаях трудно заранее знать, на какой частоте работает микроконтроллер. Например, не промаркирован внешний резонатор, или Вы сомневаетесь в том, как запрограммировали фьюзами внутренний RC-генератор.

Если используется внешний резонатор (кварцевый или керамический), то тактовую частоту можно определить, подключившись к выходной ножке тактового генератора - коснувшись щупом одного из ножек резонатора. Будьте внимательны, подключиться надо именно к выходу генератора, и щуп осциллографа должен иметь малую входную емкость (чем меньше, тем лучше, желательно не более 20 пФ). Обычно малая входная емкость щупа получается, когда щуп осциллографа переключен на коэффициент деления 1:10). Чтобы точно узнать, какая ножка микроконтроллера является выходом, обратитесь к даташиту микроконтроллера. Осциллограф покажет тактовую частоту на выходе генератора, и рабочая тактовая частота микроконтроллера будет равна этой частоте с учетом коэффициента предделителя (если он включен фьюзами или программно).

Когда используется внутренний RC-генератор, и когда Вы не уверены в том, насколько правильно запрограммировали фьюзы предделителя, может помочь измерение длительности выполнения команд программы. Для этого случае Вы можете вставить в главный цикл main программы две простые команды установки и сброса любого выбранного порта микроконтроллера, и потом осциллографом измерить полученную длительность выходного сигнала на этом порте. Вот простой пример такой программы (приведен только фрагмент кода, управляющей ножкой порта PB0):

#include < avr/io.h >
...

void main (void)
{
   ...
   DDRB |= (1 << PB0);
   while (1)
   {
      PORTB |=  (1 << PB0);
      PORTB &= ~(1 << PB0);
      ...
   }
}

Принцип определения тактовой частоты прост. В этом примере кода Вы видите две команды, управляющие разрядом 0 порта B, которые следуют друг за другом (запись константы в регистр PORTB). Первая команда устанавливает выходной уровень ножки PB0 в состояние лог. 1, вторая команда в лог. 0. Это измерение уровней можно проконтролировать осциллографом, подсоединив щуп к ножке порта PB0. Каждая команда записи в регистр PORTB компилируется в одну команду ассемблера, длительность которой можно узнать из даташита на микроконтроллер. В данном примере будут использоваться команды ORI и ANDI, имеющие длительность выполнения 1 цикл. Таким образом, между первой и второй командой пройдет время одного цикла, одного периода тактовой частоты микроконтроллера, т. е. длительность импульса лог. 1 будет равна длительности периода рабочей тактовой частоты. На рисунке упрощенно показана форма сигнала на выходе порта PB0 и соответствующая ей тактовая частота.

measure-AVR-clock-freq

Длительность импульса лог. 1 на выходе порта PB0 можно измерить с помощью осциллографа, и по ней определить тактовую частоту, на которой работает микроконтроллер.

[Ссылки]

1. Макетные платы с интерфейсом USB.
2. usb-Relay - маленькое USB-устройство, управляющее включением и выключением реле.
3. AVR: как рассчитать время выполнения команды