Измерение частоты кварца Arduino без частотомера

Материал по статье автор Виталий Чубатый

Подарили мне на день рождения Arduino Mega 2560. Вещь хорошая, но, как и у большинства этих плат, частота кварца отличается от номинальной. В моём случае написано было 12 МГц, по факту чуть меньше 16. Встал вопрос – как измерить с приемлемой точностью без частотомера.

Для некоторых программ частота кварца имеет большое значение, поэтому нужно было сделать измерение частоты подручными средствами.

Выход был найден самый простой и логичный – заставить плату считать интервалы времени, а после 4 часов отсчёта посмотреть реальное количество этих интервалов. Зная продолжительность интервала, можно вычислить частоту.

Забегая немного вперёд, скажу, что предварительная оценка после 20 минут счёта практически совпала с итоговым результатом после 4 часов работы.

Код для настройки таймера и работы с индикатором брался из другого проекта с вырезанием ненужных частей, поэтому он местами не оптимален, но это всё работает.

Поскольку уже был готовый образец кода, значение частоты тоже не менялось. После предделителя для таймера в 8 раз делим таймером ещё на 40 тысяч, в результате на выходе получаем 50 герц. Отмечу, что это значение очень удобно параллельно использовать для динамического обновления индикатора.

Уточнение! Фактически для таймера надо указывать коэффициент деления на единицу меньший, поэтому в коде указывается не 40000, а 39999.

Индикатор использовался обычный, 7-сегментный HS420561-C30 с общим катодом. Данные для включения сегментов выводились через регистр 74HC5959N, что позволило сэкономить 5 выводов платы. К аноды индикаторов были подключены к регистру через резисторы по 330 ом, а катоды через транзисторные ключи (npn, использовал 8 штук 2N2222) на землю. Два таких индикатора дали 8 разрядов, что было более чем достаточно для отображения количества отсчётов.

Для минимизации погрешности, связанной с фиксацией времени отсчёта (Arduino при включении любит «подумать» секунду-полторы), я использовал кнопку – отпускание для начала отсчёта и нажатие для прекращения.

Немного теории

Отсчёт продолжался 4 часа, что составляет 14400 секунд. При частоте 50 герц за это время в идеальном случае должно быть ровно 720 тысяч отсчётов. Фактически может быть разница в десяток-другой из-за чуть более раннего или позднего нажатия и отпускания кнопки, но при таком количестве отсчётов эта погрешность будет уже несущественна. Реальная частота определяется просто:

Fx = 16000 * n / 720000,

где n – реальное количество отсчётов.

Большое время счёта нужно именно для минимизации погрешности при нажатии и отпускании кнопки.

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

Замечания по схеме

Важный момент. Включать схему или же делать сброс надо уже при нажатой кнопке, [bolt]иначе отсчёт начнётся сразу[/bolt]. Такой способ в моём случае достаточно удобный, поскольку я использовал провод с коннектором для макетной платы. После первого замыкания отсчёт приостанавливается и дальнейшие изменения состояния входа уже не имеют значения. Это сделано для удобства фиксации показаний. Новый отсчёт возможен только после выключения/включения питания или после нажатия кнопки сброса на плате.

Два индикатора дают в сумме 8 разрядов, нумерация ведётся с нуля слева направо, то есть, единицы отображаются в 7-м разряде, десятки в 6-м, сотни в 5-м и т. д.

Управляющие сигналы для включения разрядов подаются на выводы со 2 по 9 (слева направо, вывод 2 – крайний левый разряд, вывод 9 – крайний правый), для вывода в регистр сегментов используются выводы 10-12, а 13-й вывод был использован как вход кнопки. Также вход кнопки был подтянут к земле резистором на 10 килоом и к питанию подключался через диод.

Для изменения яркости индикатора можно менять задержку между включением и выключением. В моём случае оптимальная яркость (хорошо читается, но не давит на глаза) была достигнута при задержке в две трети миллисекунды, то есть 666 микросекунд. Для увеличения можно увеличить примерно до 1500 микросекунд, для уменьшения яркости задержку можно уменьшать почти до нуля. Если при 1500 микросекундах задержки яркость недостаточна – уменьшаем постепенно сопротивление резисторов между выводами регистра и анодами индикаторов. Вначале вместо 330 ом вначале ставим 270, если не хватает и этого — делаем ещё меньше.

Числа в массиве digits поданы в двоичной форме только для облегчения восприятия, они отвечают за отображение сегментов цифр на индикаторах. Старший бит – сегмент A, младший – сегмент H (десятичная точка).

Итоги измерений. За 4 часа наблюдений плата отсчитала 714079 интервалов времени вместо положенных 720000, соответственно, частота кварца составила примерно 15868 килогерц.