|
AVR, измерение частоты по INT0 |
|
|
|
Nov 12 2010, 05:33
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Есть интересный девайс http://www.avrhobby.ru/index.php?option=co...k&Itemid=53 Интересно, какая максимальная частота, которая может быть "поймана" таким способом? Я думаю так, если частота процессора 16Мгц, то 1/16000000 = 6,25*10^8 с. Тогда период измеряемого сигнала должен быть больше 4*6,25*10^8 с (4 такта на обработку прерывания). Тогда выходит что измеряемая частота может принимать значения до 4 Мгц. По-моему жирновато... что я упустил?
|
|
|
|
|
Nov 12 2010, 06:20
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата(Zelepuk @ Nov 12 2010, 08:33)  (4 такта на обработку прерывания).
По-моему жирновато... что я упустил? Как это у Вас получилось 4 такта? "По-моему жирновато". зы: тем более там делайла.. Да еще обработку события в майне сколько тиков. 200-300кГц наверное это максимум, если не меньше.
|
|
|
|
|
Nov 12 2010, 07:33
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Zelepuk @ Nov 12 2010, 10:50)  Вообще как производить такие расчёты производительности? Возможно какая-то метода есть? Поделитесь или распишите, если не сложно, для конкретно моего примера.
Заранее спасибо. 1. Составляете программу на ассемблере - самый быстрый кусок + минимальная оболочка 2. Смотрите в симуляторе количество циклов при разных значениях port stimulus, или в протеусе. Вот и вся метода. Либо альтернатива - то же самое в голове, но для этого надо все помнить. Далее по схеме - непонятно, можно измерительный сигнал заводить одновременно на Т0 и ICP и без шума и пыли получать те самые 4 мгц.
|
|
|
|
|
Nov 12 2010, 10:18
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Цитата(Палыч @ Nov 12 2010, 10:59)  Всё зависит от того, что же и каким методом Вы желаете измерить? Если сигнал периодический и его период (частота) не изменяется за некоторый интервал времени (время измерения), то можно подсчитать число импульсов и затем время измерения разделить на подсчитанное число импульсов. При необходимости, можно предусмотреть пределитель, внешний по отношению к МК, и при расчетах учитывать. Способ указан в старте. Да, просто считаем кол-во импульсов за время 5 сек. Но, меня сейчас очень интересует вот что. Мы считаем кол-во импульсов за 5 сек. Тогда, для частоты в 50Гц мы получим 250 импульсов (250/5 = 50), несложно посчитать, что погрешность измерения составит 0,1 Гц (дробное значение) Тоже самое для напряжения. При точности в 10 (значащих 8) бит мы получаем погрешность в 0.86 вольта (при амплитуде в 220) - опять дробное. Как можно записывать и выводить данные на экран в вормате десятичной дроби (используя float) ?
|
|
|
|
|
Nov 12 2010, 13:16
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(Палыч @ Nov 12 2010, 15:03)  "Крохотный fft" - это float? О float в подобной задаче лучше забыть. Использование плавающей запятой "сожрет" кучу ресурсов МК (и памяти, и времени), которых и так не богато. Память - да ни фига подобного, "базовая" 32-битная плавучка (четыре действия и преобразование форматов) сожрала у меня где-то полтысячи слов программной памяти и чуть-чуть на аккумуляторы. Вот с быстродействием - под вопросом, в реальном времени целочисленная будет быстрее. Цитата(Zelepuk @ Nov 12 2010, 13:18)  Способ указан в старте. Да, просто считаем кол-во импульсов за время 5 сек.
Мы считаем кол-во импульсов за 5 сек. Тогда, для частоты в 50Гц мы получим 250 импульсов (250/5 = 50), несложно посчитать, что погрешность измерения составит 0,1 Гц (дробное значение) А если посчитать еще разок, чуть внимательнее ? А вообще-то такие вещи делаются через ICP, и тогда хоть тысячные Hz десять раз в секунду (тут раньше упрется в джиттер, и младшие разряды начнут мельтешить). Цитата Как можно записывать и выводить данные на экран в вормате десятичной дроби (используя float) ? Умножаем на целую степень 10, округляем, выводим целое число, устанавливая точку в соответствующей позиции вывода.
|
|
|
|
|
Nov 12 2010, 13:40
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(Zelepuk @ Nov 12 2010, 16:26)  Но я немного не понимаю каким образом AVR работает с "неформатными" данными. Скажем как работает с 32 битными данными, если его регистры 8 битные? Точнее физика понятно, но как это отражается в коде? Или парится ненадо, если пишешь на С, и всё делает компилятор? Компилятор сам разберется. А я пишу на asm, тут тоже не сложно - разрядность прекрасно масштабируется (перенос-заем, это работает и на 4-битных, и на 32-битных, и на на деревянных счетах).
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|