Правила: заголовок темы должен кратко и понятно отражать ее суть, нельзя писать латиницей или заглавными буквами. Сообщение, ник, аватар не должны выделяться своими размерами или стилем написания от остальных, быть читабельными, написаны литературно и достаточно грамотно.
Если Вас интересуют -темы точного времени применительно к микроконтроллерам -возможность быстро собрать качественные часы -понимание алгоритмов внутренней синхронизации устройств на МК Здесь Вы найдёте полезную информацию и возможность обменяться опытом
Один из основных моментов, который влияет на точность хода следующий:
При использовании недорогого кварцевого резонатора производитель гарантирует его работу на заданной частоте в пределах небольших отклонений. Например кварц на 4 МГц на самом деле генерирует частоту 4000150 Гц. В PIC контроллере длительность одного такта(время выполнения одной команды) - это 1/4 частоты резонатора. То есть за секунду контроллер отсчитает 4000150/4 = 1000037,5 тактов. Допустим, что алгоритм программы отсчитывает миллион тактов, то есть расчитан на то, что частота генерации резонатора точно соответствует паспортной. В результате получается, что секнда, получаемая при отсчёте миллиона тактов короче на 37,5 микросекунд. Итог - часы собраны программа написана, а идут неточно. Насколько они спешат в рассматриваемом примере?
- За одну минуту 60*37,5 = 2250 микросекунд - За один час 3600*37,5 = 0,135 секунды - За одни сутки 24*0,135 = 3,24 секунды - За неделю 7*3,24 = 22,68 секунды - За месяц 30*3,24 = 97,2 секунды, или 1 минута и 37,2 секунды - За год 365*3,24 = 1182,6 секунды, или 19 минут и 42,6 секунды
То есть за год эти часы "уходят" на 20 минут. Для некоторых практических задач(особенно при отсчёте коротких временных интервалов) достаточно и такой точности. Но таких применений явно меньше, чем тех, где нужна лучшая точность...
... В программе для timer_a ( таймер для аквариума ) применён алгоритм, котроый отсчитывает за одну секунду 1'001'032 - kor(значение корректирующей константы по умолчанию = 1032). http://www.radiokot.ru/circuit/digital/home/11/source.rar - исходник с этим алгоритмом
За одну секунду программа уходит в прерывание 256 раз. Каждое прерывание в таймер TMR1 загружается константа, значение которой 0F0C6 hex , что вызывает переполнение таймера через 1/256 секунды (3900 тактов) . Механизм коррекции срабатывает каждое 0-е прерывание, увеличивая константу, загружаемую в таймер на величину kor(1032). Таким образом интервал одного прерывания из 256-ти короче остальных на величину корректирующего значения. Вопрос решён самым простым путём, но как со временем выяснилось, такое решение не лишено недостатков. Индикатор единиц минут в результате работы корректирующего алгоритма подмигивает с частотой 1 Гц, так как длительность включения каждого разряда индикатора привязана к длительности прерывания...
... Ещё один существенный момент: - это задержка начала счёта после включения или загрузки таймера
Эта задержка описана в даташите на PIC16F628 для таймера TMR0, (но оказалось присутствует так-же в TMR1) и составляет по описанию в документации 2 машинных цикла. В процессе отладки timer_a в MP_LAB это не отслеживается, и основное секундное тактирование показало ровно миллион тактов. При запуске готовой конструкции часы показали отставание на 318 микросекунд в секунду, что гораздо больше допустимых отклонений. Решился этот вопрос подстройкой корректирующей константы до значения 1350 микросекунд в секунду. То есть константа увеличена на (1350-1032) 318 микросекунд в секунду. Большую часть этой коррекции составила задержка начала счёта таймера TMR1.
Все даты в формате GMT
3 час. Хитов сегодня: 6
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет