Алгоритм подсчета оборотов из периода

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
FlySnake
Мучитель микросхем
Сообщения: 429
Зарегистрирован: Пт ноя 20, 2009 20:38:12
Откуда: Калининград (Koenigsberg)
Контактная информация:

Алгоритм подсчета оборотов из периода

Сообщение 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 и т.д. из-за погрешности (в расчетах, отклик на прерывание и т.д.) что усложняет работу с таблицами. График период-обороты нелинейный, поэтому просто подгоняя частоту таймеров, предделители или програмные постделители ничего не выйдет. Гляжу в алгоритмы тахометров, но там принцип чуток другой и никак не соображу как же это реализовать в моём случае. В голову лезут только безумные и ошибочные мысли, даже не скажу какие - самому жутко что вроде простая задача, а сообразить не получается :( Подскажите плз алгоритм преобразования значения таймера либо какой другой вариант
Заранее спасибо
Digikey
Встал на лапы
Сообщения: 90
Зарегистрирован: Пн мар 08, 2010 02:59:04

Re: Алгоритм подсчета оборотов из периода

Сообщение 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 и будет искомой частотой вращения.
FlySnake
Мучитель микросхем
Сообщения: 429
Зарегистрирован: Пт ноя 20, 2009 20:38:12
Откуда: Калининград (Koenigsberg)
Контактная информация:

Re: Алгоритм подсчета оборотов из периода

Сообщение FlySnake »

Спасибо огромное!
1-й вариант по идеи то что надо, всё вокруг да около ходил не мог додуматся до такого :)
TechMike
Прорезались зубы
Сообщения: 247
Зарегистрирован: Сб дек 15, 2007 23:00:54
Откуда: Moscow
Контактная информация:

Re: Алгоритм подсчета оборотов из периода

Сообщение TechMike »

Вот тут хорошо написано как мерить обороты кулера:
http://atlab.narod.ru/articles/particle7.htm
FlySnake
Мучитель микросхем
Сообщения: 429
Зарегистрирован: Пт ноя 20, 2009 20:38:12
Откуда: Калининград (Koenigsberg)
Контактная информация:

Re: Алгоритм подсчета оборотов из периода

Сообщение FlySnake »

TechMike писал(а):Вот тут хорошо написано как мерить обороты кулера:
http://atlab.narod.ru/articles/particle7.htm

Угу, как раз формула подсчета стала камнем преткновения :) В остальном проблем нет. Жаль там выложены только хексы без исходников с человеческими каментами, ну да ладно, вроде как и так всё получилось. Одно не айс - частота встроеного некалиброваного (LFINTOSC) кварца врёт жуть как. По даташиту должно быть 31кГц, ну раз анкалибрэйтед то думаю ну максимум +/-1кГц, ага, хрен там. Включил клокаут Fosc/4 и померил 2-мя осцилами и частотомером 28кГц +/-0.5. А второй калиброваный (HFINTOSC) даже с максимальным делителем даёт 125кГц и повышает энергопотребление (критично). Придётся каждый экземпляр мерить и корректировать значения для расчетов, благо всего 4 штуки
Murav
Опытный кот
Сообщения: 877
Зарегистрирован: Чт фев 18, 2010 13:51:56

Re: Алгоритм подсчета оборотов из периода

Сообщение Murav »

FlySnake писал(а):Одно не айс - частота встроеного некалиброваного (LFINTOSC) кварца врёт жуть как. По даташиту должно быть 31кГц, ну раз анкалибрэйтед то думаю ну максимум +/-1кГц, ага, хрен там.

Там встроен не кварц, а RC-генератор, значения R и C которого ещё и неслабо плавают от температуры(и разброс у них тоже немаленкий). Лучше использовать внешний кварц на небольшую частоту.
FlySnake
Мучитель микросхем
Сообщения: 429
Зарегистрирован: Пт ноя 20, 2009 20:38:12
Откуда: Калининград (Koenigsberg)
Контактная информация:

Re: Алгоритм подсчета оборотов из периода

Сообщение 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).
и ни слова про его тип :shock: Вот я и подумал что кварц :oops:
Внешний кварц не прокатит - все ноги знаняты.
Интересно, второй который 8мГц Precision Internal Oscillator:- Factory calibrated to ± 1% даёт честную частоту без вмешательства в OSCTUNE
От температуры, кстати, не очень сильно плывёт. Пробовал греть паяльником и охлаждать перевёрнутым балоном со сжатым воздухом :) Плывёт буквально +/- сотня герц.
Ну да фиг с ними, эта погрешность утонет в остатке от деления
vlad145
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган
Контактная информация:

Re: Алгоритм подсчета оборотов из периода

Сообщение vlad145 »

Доброго времени суток. Интересует алгоритм подсчёта оборотов кулера. Перерыл кучу сайтов, нашёл несколько проектов, но они большинство написаны либо на BasCom либо на ASM -е. Задача заключается в подсчёте оборотов двух кулеров и выводе показаний на LCD lph8836. На данный момент пытаюсь запустить код с форума KAZUS - http://kazus.ru/forums/showthread.php?t ... C%F1%EE%E2

К сожалению результатов пока не добился, показания скачут как обкуренные. Кто нибудь пробовал использовать данный код?
Владимир
vlad145
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган
Контактная информация:

Re: Алгоритм подсчета оборотов из периода

Сообщение vlad145 »

TechMike писал(а):Вот тут хорошо написано как мерить обороты кулера:
http://atlab.narod.ru/articles/particle7.htm



Что есть формулы - это хорошо, но вот были бы исходники, было бы вообще здорово. Охота посмотреть на реализацию данных формул в коде а то у меня ничего не получается.
Владимир
FlySnake
Мучитель микросхем
Сообщения: 429
Зарегистрирован: Пт ноя 20, 2009 20:38:12
Откуда: Калининград (Koenigsberg)
Контактная информация:

Re: Алгоритм подсчета оборотов из периода

Сообщение FlySnake »

Так что конкретно не получается? Не тот это случай чтобы "запустить чужой код". Подсмотреть - ага, но целиком передирать только жизнь усложнять.
vlad145
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган
Контактная информация:

Re: Алгоритм подсчета оборотов из периода

Сообщение vlad145 »

Да нет, не целиком, только часть отвечающую за подсчет. Пытаюсь подсчитать, но показания скачут как сумасшедшие.
Владимир
vlad145
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган
Контактная информация:

Re: Алгоритм подсчета оборотов из периода

Сообщение vlad145 »

Всё дело в том, что опыта программирования нет вообще. Чистый самоучка. Вот теперь пытаюсь разобраться с таймерами. Задача следующая. Есть мега32 с подключенным к ней дисплеем S65. Подключен термодатчик DS18b20. Температура выводится на LCD. Кварц на 12Мгц. В планах реализовать индикацию оборотов кулера, но как это осуществить - засада. Пошарив по инету я нашол форму подсчёта. Но вот как настроить таймер для данной функции не могу разобраться. Пишу в CodeVisiom. Что посоветуете? Может есть какие то проекты или наброски. Надеюсь на поминание.
Владимир
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Алгоритм подсчета оборотов из периода

Сообщение Аlex »

Где-то примерно год назад, чисто ради интереса, пробовал для АВР написать програмку. Вроде-бы что-то получилось.
На одном таймере реализовано 2 16-ти битных ШИМа и мереется 2 частоты с выводм на ЛСД. Может чем-то поможет.
pwm_frec.rar
(138.26 КБ) 205 скачиваний
vlad145
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган
Контактная информация:

Re: Алгоритм подсчета оборотов из периода

Сообщение vlad145 »

Большое спасибо за пример, думаю с помощью его разобраться. Есть вопрос. У Вас задействованы пины 4,5 порта D, для чего?
Владимир
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Алгоритм подсчета оборотов из периода

Сообщение Аlex »

У Вас задействованы пины 4,5 порта D, для чего?
Это ПИНы внешних прерываний. Мереется период между двумя прерываниями и из него вычисляется частота.
Что бы узнать обороты нужно, предварительно, поделить период на 60.
vlad145
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган
Контактная информация:

Re: Алгоритм подсчета оборотов из периода

Сообщение vlad145 »

При изменении тактовой частоты контроллера на 12Мгц какие изменения нужны в настройках таймеров?
Владимир
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Алгоритм подсчета оборотов из периода

Сообщение Аlex »

В таймере никаких.
Нужно посчитать кол-во тактов таймера за период между двумя прерываниями. Потом основную частоту (у Вас она 12000000) умножить на 60 и поделить на период (то, что насчитали таймером). И получатся об/мин.
vlad145
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган
Контактная информация:

Re: Алгоритм подсчета оборотов из периода

Сообщение vlad145 »

Аlex писал(а):В таймере никаких.
Нужно посчитать кол-во тактов таймера за период между двумя прерываниями....


Не совсем понял, теоретически понимаю что нужно, но на практике - ступор.
Владимир
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Алгоритм подсчета оборотов из периода

Сообщение Аlex »

vlad145 писал(а):Не совсем понял,

Нам, по сути, нужно измерить частоту. Мы знаем, что частота - это велечина обратная периоду.
Т.е. F=1/T
где F - частота колебаний, Т - период колебаний.
Значит, для нахождения частоты, нам нужно узнать период. Период - это промежуток времени от определённого состояния до ближайшего такого-же. В нашем случае это фронты импульсов.
Для обнаружения фронта, мы используем внешнее прерывание ( возможность контроллера прерывать выполнение программы и выходить на обработчик внешнего прерывания). В этом обработчике мы запускаем таймер, а в следующем - считываем его. Тем самым мы узнаём время периода, выраженного в тактах таймера. Т.е. весь период будет поделен на дискреты, равные времени одного такта таймера.
Так вот, период мы выразили в тактах, осталось выразить еденицу (которая в формуле). Она, для частоты в 12Мгц, будет равна 12 000 000 тактов. Т.е. за 1 сек. пройдёт 12 000 000 таких дискрет.
Теперь осталось подставить наши значения в формулу.
F = 12000000 / кол-во подсчитанных дискрет за период.
И получаем частоту в герцах. Т.е. колебаний в секунду.
Ну и естественно, если нам нужно посчитать за 1 минуту, умножаем 12 000 000 на 60 сек. В минуте этих дискрет в 60 раз больше.
Ну вот, как то так, если своими словами :dont_know:

Можно конечно мерить частоту. Например кол-во колебаний в секунду, но т.к. частота слишком маленькая, будет большая погрешность. Можно взять не секунду, а например минуту. Но ждать очень долго :)
По этому, самый оптимальный способ - измерять период.
Последний раз редактировалось Аlex Чт сен 01, 2011 12:18:09, всего редактировалось 1 раз.
vlad145
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган
Контактная информация:

Re: Алгоритм подсчета оборотов из периода

Сообщение vlad145 »

Большое спасибо за разъяснение, пойду осмысливать.
Владимир
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»