Как посчитать время одного тика на микроконтроллере

Я был в Embedded системе в течение 8 месяцев. Я проработал прикладную часть больше по сравнению с низким уровнем. У меня есть основные вопросы по системным галочкам,

  1. Как рассчитать системный тик таймера, если я запускаю аппаратный таймер контроллера для генерации какой-либо задержки. Например, если у меня есть 16-битный таймер, и я настроил системные часы на 8 МГц. Насколько мне известно, один тик будет T=1/f. Тогда один тик займет 0,125 микросекунды. Это верно? или любую другую зависимость для его расчета. Будет ли этот расчет меняться от контроллера к контроллеру?
  2. Есть ли способ настроить часы (например, 1 МГц) только для таймера или любого другого периферийного устройства без изменения системных часов (например, 8 МГц)
  3. Если контроллер переходит в режим пониженного энергопотребления (обычно это изменение режима энергопотребления). Разрешение таймера тоже изменится? нужно ли мне изменить настройку таймера для каждого режима питания.

Ответы (3)

Чтобы ответить на ваш первый вопрос.

В принципе со всеми микроконтроллерами все одинаково и ваш расчет был верным. В вашем примере с 16-битным таймером и

ф Системные часы "=" ф таймер "=" 8 М ЧАС г

Как вы сказали, у нас есть галочка в каждом,

Т таймер "=" 1 ф Системные часы "=" 1 ф таймер "=" 1 8 М ЧАС г "=" 0,125 мю с

С 16-битным таймером это означает,

т я с к с Макс "=" ( 2 16 1 ) "=" 65535

клещи. Таким образом, таймер будет переполняться каждый раз,

т переполнение "=" т я с к с Макс × Т таймер "=" 65535 × 0,125 мю с "=" 8.191875 м с

Вы можете подсчитать переполнения, чтобы получить конкретную задержку. Теперь, если вы хотите изменить значение t overflow

  • Вы можете разделить f SystemClock , как упоминалось в других ответах, и запустить свой таймер с частотой, отличной от f SystemClock . Таким образом, у вас будет больше времени между двумя тиками таймера, и переполнение t будет выше.
  • Или вы можете установить максимальное значение для таймера , чтобы он переполнялся раньше и t переполнялся меньше.

Таким образом, может быть достигнуто большое значение задержки.

@BenceKaulics Хэй, поэтому я использую 32-битный таймер с тактовой частотой PLL = 80 МГц в качестве источника => У меня будет тик каждые 0,0125 мкс. И переполнение будет 4294967295 * 0,0125 мкс = 53,6 сек, что очень много и мне кажется нелогичным. Что вы думаете ? Спасибо
@Frankenstein Если это действительно 32-битный таймер с частотой 80 МГц, то это правильно. Он насчитывает более 4 миллиардов, что требует времени.
@BenceKaulics Спасибо. Однако при измерении времени я получаю 280 тиков, что дает нам 3,5 мкс. Однако с помощью утилиты GHS: «целевой таймер» он дает 20 мкс (это означает, что каждый тик составляет 0,0714 мкс => 1/x = 14 МГц: странно:). Итак, мои расчеты неверны, но я пытаюсь понять, почему ??!! Я также использую 1 в качестве прескалера, так что это 80 МГц не меньше. Даже если я использую прескалер 2,4,8, у меня будет 40Mhz, 20Mhz... Так что вы думаете? Большое спасибо Вам
@Frankenstein Эта проблема стоит того, чтобы опубликовать новый вопрос и включить ссылку на этот вопрос. Это становится слишком сложным для обсуждения в комментариях, а также некоторые другие пользователи могут внести свой вклад в случае возникновения нового вопроса.
@BenceKaulics Я правильно понял ваш комментарий, но я торопился! Пожалуйста, посмотрите мой пост здесь: electronics.stackexchange.com/questions/279013/… спасибо
@ Франкенштейн, я посмотрю на это. Также добавьте, пожалуйста, даташит контроллера, многим будет интересна документация по таймеру. Рассмотрите возможность добавления кода.
@BenceKaulics Боюсь, я не могу. Я использую автомобильный микроконтроллер, где образцы технических данных/кода недоступны в открытом доступе. Однако я включу часть кода.

1. тактовая частота инструкций / системная тактовая частота

тактовая частота команд отличается в разных семействах микроконтроллеров. микроконтроллер PIC имеет тактовую частоту команд 1/4 тактовой частоты. и каждая (в основном) инструкция (кроме goto) занимает 1 такт инструкции, goto занимает 2 такта.

на Atmel µC тактовая частота команд такая же, как и тактовая частота.

2. другие часы только для одного таймера

на различных микроконтроллерах вы можете установить множество разделителей и настроек переполнения, пожалуйста, проверьте спецификацию вашего конкретного микроконтроллера почти на каждом PIC, вы можете установить делители, такие как 1/8, поэтому каждые 8 ​​тактов инструкции таймер увеличивается на один. поэтому таймер работает на частоте 1 МГц, если ваша инструкция Clock равна 8 МГц (генератор работает на частоте 32 МГц)

или делитель 1/2, чтобы ваш таймер работал на частоте 1 МГц, если системные часы были на частоте 2 МГц, а осциллятор - на частоте 8 МГц.

3. режим низкого энергопотребления

некоторые микроконтроллеры имеют несколько внутренних генераторов, например: 8 МГц, 4 МГц и 32,786 кГц, и если вы переключаетесь между этими частотами, вы можете снизить энергопотребление. но вы меняете часы инструкции и, следовательно, также таймер

Это довольно запутанно, потому что вы использовали кавычки - не могли бы вы отредактировать и удалить их?

Это может зависеть от регистра предварительного делителя. Назначение предварительного делителя состоит в том, чтобы позволить таймеру тактироваться с желаемой скоростью. Для более коротких (8- и 16-разрядных) таймеров часто возникает компромисс между разрешением (высокое разрешение требует высокой тактовой частоты) и диапазоном (высокие тактовые частоты вызывают более быстрое переполнение таймера).

Например, вы не можете (без некоторых ухищрений) получить разрешение 1 мкс и максимальный период 1 секунду, используя 16-битный таймер. Если вы хотите разрешение 1 us, вы ограничены максимальным периодом около 65 мс. Если вам нужен максимальный период в 1 секунду, вы ограничены разрешением около 16 мкс. Предделитель позволяет вам манипулировать разрешением и максимальным периодом в соответствии с вашими потребностями.

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

Я думаю, что это ответит на ваш 1-й и 2-й вопрос

Повлияет ли использование разных таймеров на измерение прошедшего времени или оно будет одинаковым при использовании любого таймера. Также мы можем повысить точность, выбрав более высокий n-битный таймер и более высокую тактовую частоту в источнике ?. Спасибо