Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVR
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Zelepuk
Есть интересный девайс 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 Мгц.

По-моему жирновато... что я упустил?
add
Цитата(Zelepuk @ Nov 12 2010, 08:33) *
(4 такта на обработку прерывания).

По-моему жирновато... что я упустил?

Как это у Вас получилось 4 такта? "По-моему жирновато".
зы: тем более там делайла.. Да еще обработку события в майне сколько тиков. 200-300кГц наверное это максимум, если не меньше.
_Pasha
Цитата(Zelepuk @ Nov 12 2010, 09:33) *
(4 такта на обработку прерывания).

Ага, а в прерывании, конечно же, ничего делать не надо? И возвращаться из него - тоже biggrin.gif
Ладно, возвращаться необязательно, но стек подправить придеццо.
Zelepuk
Вообще как производить такие расчёты производительности? Возможно какая-то метода есть?
Поделитесь или распишите, если не сложно, для конкретно моего примера.

Заранее спасибо.
_Pasha
Цитата(Zelepuk @ Nov 12 2010, 10:50) *
Вообще как производить такие расчёты производительности? Возможно какая-то метода есть?
Поделитесь или распишите, если не сложно, для конкретно моего примера.

Заранее спасибо.

1. Составляете программу на ассемблере - самый быстрый кусок + минимальная оболочка
2. Смотрите в симуляторе количество циклов при разных значениях port stimulus, или в протеусе.
Вот и вся метода.
Либо альтернатива - то же самое в голове, но для этого надо все помнить.
Далее по схеме - непонятно, можно измерительный сигнал заводить одновременно на Т0 и ICP и без шума и пыли получать те самые 4 мгц.
Палыч
Цитата(Zelepuk @ Nov 12 2010, 08:33) *
Тогда выходит что измеряемая частота может принимать значения до 4 Мгц. ... что я упустил?
Всё зависит от того, что же и каким методом Вы желаете измерить?
Если сигнал периодический и его период (частота) не изменяется за некоторый интервал времени (время измерения), то можно подсчитать число импульсов и затем время измерения разделить на подсчитанное число импульсов. При необходимости, можно предусмотреть пределитель, внешний по отношению к МК, и при расчетах учитывать.
Zelepuk
Цитата(Палыч @ Nov 12 2010, 10:59) *
Всё зависит от того, что же и каким методом Вы желаете измерить?
Если сигнал периодический и его период (частота) не изменяется за некоторый интервал времени (время измерения), то можно подсчитать число импульсов и затем время измерения разделить на подсчитанное число импульсов. При необходимости, можно предусмотреть пределитель, внешний по отношению к МК, и при расчетах учитывать.

Способ указан в старте. Да, просто считаем кол-во импульсов за время 5 сек.



Но, меня сейчас очень интересует вот что.
Мы считаем кол-во импульсов за 5 сек. Тогда, для частоты в 50Гц мы получим 250 импульсов (250/5 = 50), несложно посчитать, что погрешность измерения составит 0,1 Гц (дробное значение)
Тоже самое для напряжения. При точности в 10 (значащих 8) бит мы получаем погрешность в 0.86 вольта (при амплитуде в 220) - опять дробное.

Как можно записывать и выводить данные на экран в вормате десятичной дроби (используя float) ?
Палыч
Цитата(Zelepuk @ Nov 12 2010, 13:18) *
Как можно записывать и выводить данные на экран в вормате десятичной дроби (используя float) ?

Плавающая запятая в МК - большая проблема, но, во многих случаях от плавающей запятой можно отказаться в пользу фиксированной.
Пример. Пусть за теже 5 секунд мы насчитали 248 импульсов. Вычисляем частоту до десятых Гц (т.е. значение получаем умноженным на 10) F= 248 * 10 /5 + 5/2= 248*2 + 3 = 499 . Т.е. измерели частоту и получили 49,9 Гц. Работать с целыми числами гораздо удобнее - нужно лишь при выводе учитывать, что последняя цифра - это десятые доли, а не единицы; предпоследняя - единицы и т.д.
Zelepuk
спасибо огромное.
Стало быть о fft (крохотном) на AVR можно забыть?
Палыч
Цитата(Zelepuk @ Nov 12 2010, 13:58) *
Стало быть о fft (крохотном) на AVR можно забыть?
"Крохотный fft" - это float? О float в подобной задаче лучше забыть. Использование плавающей запятой "сожрет" кучу ресурсов МК (и памяти, и времени), которых и так не богато.
Zelepuk
Цитата(Палыч @ Nov 12 2010, 15:03) *
"Крохотный fft" - это float? О float в подобной задаче лучше забыть. Использование плавающей запятой "сожрет" кучу ресурсов МК (и памяти, и времени), которых и так не богато.

я имел ввиду Фурье...
Палыч
Цитата(Zelepuk @ Nov 12 2010, 15:21) *
я имел ввиду Фурье...
Зачем же отказываться? Только рассчеты, наверное, лучше производить с массштабированными числами - умноженными на 10^N или 2^N (фиксированная запятая). В этом случае тоже проблемы будут... Например, при умножении таких чисел результат умножения нужно будет делить на множитель (сдвигать), при делении - умножать (сдвигать) делимое... При необходимости - использовать long или даже long long (если транслятор позволяет).
rx3apf
Цитата(Палыч @ 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, округляем, выводим целое число, устанавливая точку в соответствующей позиции вывода.
Zelepuk
Большое спасибо всем за ответы!

Но я немного не понимаю каким образом AVR работает с "неформатными" данными. Скажем как работает с 32 битными данными, если его регистры 8 битные?
Точнее физика понятно, но как это отражается в коде? Или парится ненадо, если пишешь на С, и всё делает компилятор?
rx3apf
Цитата(Zelepuk @ Nov 12 2010, 16:26) *
Но я немного не понимаю каким образом AVR работает с "неформатными" данными. Скажем как работает с 32 битными данными, если его регистры 8 битные?
Точнее физика понятно, но как это отражается в коде? Или парится ненадо, если пишешь на С, и всё делает компилятор?

Компилятор сам разберется. А я пишу на asm, тут тоже не сложно - разрядность прекрасно масштабируется (перенос-заем, это работает и на 4-битных, и на 32-битных, и на на деревянных счетах).
Zelepuk
А всё таки интресно.

При организации обработки сигналов на AVR как можно расчитывать быстродействие той или иной реализации алгоритма, программируя на Си?

Или просто посчитать мипсы (+- туды сюды грубо) и всё?
alexeyv
Цитата
При организации обработки сигналов на AVR как можно расчитывать быстродействие той или иной реализации алгоритма, программируя на Си?


На входе функции что-то типа PORTD |= 0x01;
На выходе функции что-то типа PORTD &= ~0x01;
И осциллографом смотришь потраченное время на обработку функции
Палыч
Цитата(alexeyv @ Nov 13 2010, 12:24) *
смотришь потраченное время
Это - когда есть что смотреть. Человек же желает оценить ещё до того, как что-то сделать...
IMHO, оценивается по результатам проектирования прошлых похожих проектов, либо как автор вопроса выше написал: "посчитать мипсы (+- туды сюды грубо)", но при этом предусмотреть "вариант №2, №3,...", либо пути переделки "варианта №1", если с оценкой "промахнулся".
Zelepuk
Собираюсь измерять с помощью AVR сетевое напряжение.
Интересно, как заранее примерно вычислить погрешность вычисления сетевого напряжения.
Я вот думаю так (для 8 значащих битов) 220/255 = 0,8627 В. Стало быть погрешность в 0.4%

Можно ли смело утверждать такое. Или там ещё есть нюансы?
demiurg_spb
То что Вы назвали - это разрешающая способность.
Цитата(Zelepuk @ Nov 15 2010, 16:23) *
Или там ещё есть нюансы?
Да есть.
Погрешность опорника,
погрешность делителя напряжения,
плюс у АЦП есть заявленные погрешности, помимо погрешности квантования (см. datasheet на конкретное АЦП).

Ну и немного смешно что Вы приводите 220В к 255 дискретам, а как же запас сверху минимум 10% (по ГОСТу на качество электроэнергии).
Zelepuk
Цитата(demiurg_spb @ Nov 15 2010, 18:32) *
То что Вы назвали - это разрешающая способность.
Да есть.
Погрешность опорника,
погрешность делителя напряжения,
плюс у АЦП есть заявленные погрешности, помимо погрешности квантования (см. datasheet на конкретное АЦП).

Ну и немного смешно что Вы приводите 220В к 255 дискретам, а как же запас сверху минимум 10% (по ГОСТу на качество электроэнергии).


Запас сверху это вы говорите о том, что напряжение само по себе плавает в районе +-10%? Если да, то это не имеет значения. Так как напряжение измеряется с выхода эталонного генератора.
demiurg_spb
удачи...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.