Страница 1 из 2
Алгоритм подсчета оборотов из периода
Добавлено: Ср июн 09, 2010 22:29:09
FlySnake
Всем привет
Задача: подсчет кол-ва оборотов в минуту некоего вращающегося девайса. Диапазон измерений
от 15 до 199 об/мин т.е. всего
184 значения отобразить на индикаторе. Датчик - геркон. Мерить желатьельно быстро, за 1-2 оборота поскольку обороты меняются часто. Первое и единственное что приходит на ум - прерывание по изменению уровня и выгрузка значения из таймера с дальнейшим преобразованием. Вот тут и проблема. Периоды импульсов в пределах
0.302 - 4 сек. Контроллер PIC16F631 со встроеным кварцем на 31кГц. Получается машинный цикл
0.000126 cек. Если использовать 16-битный таймер без предделителя, то этого достаточно чтобы покрыть весь диапазон измерений. НО это будет 16 бит причем всего 184 уникальных значений, а нужно уместить это в 8 бит причем последовательно, т.е. примерно так:
Код: Выделить всё
15 об/мин = FF
16 об/мин = FE
17 об/мин = FD
и т.д.
Нужно это для табличной конвертации и вывода на дисплей. Памяти у этого контроллера мало и гигантские таблицы с конвертированием 2-байтных чисел не лезут, к тому же нет абсолютной уверенности что
0x11E2 соответствующий по расчетам
104 об/мин будет именно таким значением, а не
0x11E3 и т.д. из-за погрешности (в расчетах, отклик на прерывание и т.д.) что усложняет работу с таблицами. График период-обороты нелинейный, поэтому просто подгоняя частоту таймеров, предделители или програмные постделители ничего не выйдет. Гляжу в алгоритмы тахометров, но там принцип чуток другой и никак не соображу как же это реализовать в моём случае. В голову лезут только безумные и ошибочные мысли, даже не скажу какие - самому жутко что вроде простая задача, а сообразить не получается

Подскажите плз алгоритм преобразования значения таймера либо какой другой вариант
Заранее спасибо
Re: Алгоритм подсчета оборотов из периода
Добавлено: Чт июн 10, 2010 05:37:57
Digikey
T - период вращения (сек)
n - значение из таймера
N - частота вращения (об/мин)
T = 0.302 - 4.0
n = 2396 - 31746
N = 199 - 15
----------
I)
T = n*0.000126
N = 60/T = 60/(n*0.000126) = 476190/n
Выполняете целочисленное деление 476190/n и округляете по остатку.
Получаете N - число оборотов в минуту в диапазоне 199-15.
Теперь, чтобы получить нужное соответствие (15 об/мин = FF, 16 об/мин = FE,..) делаете преобразование: R = 255 - (N-15)
II)
Если использовать табличный метод, то нужно на чем-либо написать программу, которая сгенерирует таблицу а[i], в которую будут записаны значения таймера (n), соответствующие границам частоты вращения через 1 об/мин.
Т.е.:
n <= a[1] - 199 об/мин
a[1] < n <= a[2] - 198 об/мин
a[2] < n <= a[3] - 197 об/мин
........ и т.д до 15 об/мин
Далее, получив значение таймера нужно с помощью метода дихотомии найти номер ячейки таблицы k, который будет удовлетворять неравенству:
a[k-1] < n <= a[k]
Соответственно это значение k и будет искомой частотой вращения.
Re: Алгоритм подсчета оборотов из периода
Добавлено: Чт июн 10, 2010 11:28:40
FlySnake
Спасибо огромное!
1-й вариант по идеи то что надо, всё вокруг да около ходил не мог додуматся до такого

Re: Алгоритм подсчета оборотов из периода
Добавлено: Сб июн 12, 2010 23:47:28
TechMike
Вот тут хорошо написано как мерить обороты кулера:
http://atlab.narod.ru/articles/particle7.htm
Re: Алгоритм подсчета оборотов из периода
Добавлено: Вс июн 13, 2010 10:42:40
FlySnake
Угу, как раз формула подсчета стала камнем преткновения

В остальном проблем нет. Жаль там выложены только хексы без исходников с человеческими каментами, ну да ладно, вроде как и так всё получилось. Одно не айс - частота встроеного некалиброваного (LFINTOSC) кварца врёт жуть как. По даташиту должно быть 31кГц, ну раз анкалибрэйтед то думаю ну максимум +/-1кГц, ага, хрен там. Включил клокаут Fosc/4 и померил 2-мя осцилами и частотомером 28кГц +/-0.5. А второй калиброваный (HFINTOSC) даже с максимальным делителем даёт 125кГц и повышает энергопотребление (критично). Придётся каждый экземпляр мерить и корректировать значения для расчетов, благо всего 4 штуки
Re: Алгоритм подсчета оборотов из периода
Добавлено: Вс июн 13, 2010 15:37:10
Murav
FlySnake писал(а):Одно не айс - частота встроеного некалиброваного (LFINTOSC) кварца врёт жуть как. По даташиту должно быть 31кГц, ну раз анкалибрэйтед то думаю ну максимум +/-1кГц, ага, хрен там.
Там встроен не кварц, а RC-генератор, значения R и C которого ещё и неслабо плавают от температуры(и разброс у них тоже немаленкий). Лучше использовать внешний кварц на небольшую частоту.
Re: Алгоритм подсчета оборотов из периода
Добавлено: Вс июн 13, 2010 16:42:05
FlySnake
Хмм... в даташите пишут просто oscillator
• Internal clock sources are contained internally
within the Oscillator module. The Oscillator
module has two internal oscillators: the 8 MHz
High-Frequency Internal Oscillator (HFINTOSC)
and the 31 kHz Low-Frequency Internal Oscillator
(LFINTOSC).
и ни слова про его тип

Вот я и подумал что кварц
Внешний кварц не прокатит - все ноги знаняты.
Интересно, второй который 8мГц Precision Internal Oscillator:- Factory calibrated to ± 1% даёт честную частоту без вмешательства в OSCTUNE
От температуры, кстати, не очень сильно плывёт. Пробовал греть паяльником и охлаждать перевёрнутым балоном со сжатым воздухом

Плывёт буквально +/- сотня герц.
Ну да фиг с ними, эта погрешность утонет в остатке от деления
Re: Алгоритм подсчета оборотов из периода
Добавлено: Вт авг 30, 2011 20:55:43
vlad145
Доброго времени суток. Интересует алгоритм подсчёта оборотов кулера. Перерыл кучу сайтов, нашёл несколько проектов, но они большинство написаны либо на BasCom либо на ASM -е. Задача заключается в подсчёте оборотов двух кулеров и выводе показаний на LCD lph8836. На данный момент пытаюсь запустить код с форума
KAZUS -
http://kazus.ru/forums/showthread.php?t ... C%F1%EE%E2К сожалению результатов пока не добился, показания скачут как обкуренные. Кто нибудь пробовал использовать данный код?
Re: Алгоритм подсчета оборотов из периода
Добавлено: Ср авг 31, 2011 04:44:32
vlad145
Что есть формулы - это хорошо, но вот были бы исходники, было бы вообще здорово. Охота посмотреть на реализацию данных формул в коде а то у меня ничего не получается.
Re: Алгоритм подсчета оборотов из периода
Добавлено: Ср авг 31, 2011 09:58:58
FlySnake
Так что конкретно не получается? Не тот это случай чтобы "запустить чужой код". Подсмотреть - ага, но целиком передирать только жизнь усложнять.
Re: Алгоритм подсчета оборотов из периода
Добавлено: Ср авг 31, 2011 15:54:43
vlad145
Да нет, не целиком, только часть отвечающую за подсчет. Пытаюсь подсчитать, но показания скачут как сумасшедшие.
Re: Алгоритм подсчета оборотов из периода
Добавлено: Ср авг 31, 2011 17:28:11
vlad145
Всё дело в том, что опыта программирования нет вообще. Чистый самоучка. Вот теперь пытаюсь разобраться с таймерами. Задача следующая. Есть мега32 с подключенным к ней дисплеем S65. Подключен термодатчик DS18b20. Температура выводится на LCD. Кварц на 12Мгц. В планах реализовать индикацию оборотов кулера, но как это осуществить - засада. Пошарив по инету я нашол форму подсчёта. Но вот как настроить таймер для данной функции не могу разобраться. Пишу в CodeVisiom. Что посоветуете? Может есть какие то проекты или наброски. Надеюсь на поминание.
Re: Алгоритм подсчета оборотов из периода
Добавлено: Ср авг 31, 2011 19:18:08
Аlex
Где-то примерно год назад, чисто ради интереса, пробовал для АВР написать програмку. Вроде-бы что-то получилось.
На одном таймере реализовано 2 16-ти битных ШИМа и мереется 2 частоты с выводм на ЛСД. Может чем-то поможет.
Re: Алгоритм подсчета оборотов из периода
Добавлено: Чт сен 01, 2011 06:19:01
vlad145
Большое спасибо за пример, думаю с помощью его разобраться. Есть вопрос. У Вас задействованы пины 4,5 порта D, для чего?
Re: Алгоритм подсчета оборотов из периода
Добавлено: Чт сен 01, 2011 09:51:59
Аlex
У Вас задействованы пины 4,5 порта D, для чего?
Это ПИНы внешних прерываний. Мереется период между двумя прерываниями и из него вычисляется частота.
Что бы узнать обороты нужно, предварительно, поделить период на 60.
Re: Алгоритм подсчета оборотов из периода
Добавлено: Чт сен 01, 2011 11:01:55
vlad145
При изменении тактовой частоты контроллера на 12Мгц какие изменения нужны в настройках таймеров?
Re: Алгоритм подсчета оборотов из периода
Добавлено: Чт сен 01, 2011 11:06:28
Аlex
В таймере никаких.
Нужно посчитать кол-во тактов таймера за период между двумя прерываниями. Потом основную частоту (у Вас она 12000000) умножить на 60 и поделить на период (то, что насчитали таймером). И получатся об/мин.
Re: Алгоритм подсчета оборотов из периода
Добавлено: Чт сен 01, 2011 11:36:12
vlad145
Аlex писал(а):В таймере никаких.
Нужно посчитать кол-во тактов таймера за период между двумя прерываниями....
Не совсем понял, теоретически понимаю что нужно, но на практике - ступор.
Re: Алгоритм подсчета оборотов из периода
Добавлено: Чт сен 01, 2011 12:07:39
Аlex
vlad145 писал(а):Не совсем понял,
Нам, по сути, нужно измерить частоту. Мы знаем, что частота - это велечина обратная периоду.
Т.е. F=1/T
где F - частота колебаний, Т - период колебаний.
Значит, для нахождения частоты, нам нужно узнать период. Период - это промежуток времени от определённого состояния до ближайшего такого-же. В нашем случае это фронты импульсов.
Для обнаружения фронта, мы используем внешнее прерывание ( возможность контроллера прерывать выполнение программы и выходить на обработчик внешнего прерывания). В этом обработчике мы запускаем таймер, а в следующем - считываем его. Тем самым мы узнаём время периода, выраженного в тактах таймера. Т.е. весь период будет поделен на дискреты, равные времени одного такта таймера.
Так вот, период мы выразили в тактах, осталось выразить еденицу (которая в формуле). Она, для частоты в 12Мгц, будет равна 12 000 000 тактов. Т.е. за 1 сек. пройдёт 12 000 000 таких дискрет.
Теперь осталось подставить наши значения в формулу.
F = 12000000 / кол-во подсчитанных дискрет за период.
И получаем частоту в герцах. Т.е. колебаний в секунду.
Ну и естественно, если нам нужно посчитать за 1 минуту, умножаем 12 000 000 на 60 сек. В минуте этих дискрет в 60 раз больше.
Ну вот, как то так, если своими словами

Можно конечно мерить частоту. Например кол-во колебаний в секунду, но т.к. частота слишком маленькая, будет большая погрешность. Можно взять не секунду, а например минуту. Но ждать очень долго

По этому, самый оптимальный способ - измерять период.
Re: Алгоритм подсчета оборотов из периода
Добавлено: Чт сен 01, 2011 12:12:40
vlad145
Большое спасибо за разъяснение, пойду осмысливать.