Измеритель частоты вращения двигателя.

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
AVT-28
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Измеритель частоты вращения двигателя.

Сообщение AVT-28 »

Добрый день или ночь!

Есть тут на форуме кто уже сталкивался с измерением оборотов причем с большим диапазоном от 100 - 20 000 об/мин?
Например с помощью датчика холла или просто светоотражающей поверхности оптическим способом считывать с вала.
Мне пока нужен примитивный измеритель оборотов вентилятора 80X80X25 c таховыходом те что в компе стоят в блоках питания старых но что бы от 100 - 4500 об/мин умел мерить.
Примеры на С конечно нужны. :)
Реклама
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Re: Измеритель частоты вращения двигателя.

Сообщение coredumped »

На что и в каком формате будем выводить результат?
Все будет только лучше, в крайнем случае - хуже.
Реклама
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

Re: Измеритель частоты вращения двигателя.

Сообщение Леонид Иванович »

Код: Выделить всё

//Канал A PWM таймера 1 (вывод OC1A) используется для управления
//двигателем. На валу двигателя находится прерыватель оптического
//потока с количеством лопостей BLADES. Для стабилизации частоты
//прерывателя применяется PID-регулятор, который использует
//показания измерителя частоты прерывателя. Измеритель использует
//прерывание по захвату таймера 1 (вывод ICP) и прерывание по
//совпадению таймера 1. Когда измеритель находится в состоянии
//ST_INIT происходит захват таймера в переменную Tb, и начинается процесс
//измерение частоты ST_COUNT. Частота измеряется по количеству периодов
//входного сигнала, равному количеству лопастей прерывателя BLADES.
//Этим устраняется джиттер, вызванный неточностью изготовления прерывателя.
//Периоды считаются в переменной Nb. События совпадения таймера 1 считаются
//в переменной Tn. Когда проходит заданное количество периодов,
//происходит захват таймера в переменную Te, и процесс измерения частоты
//заканчивается (ST_DONE). После этого основная программа вычисляет
//длительность одного оборота Tcap = Te - Tb + Tn * (PWM_MAX + 1)
//и частоту прерывателя GetF = BLADES * F_CLK / Tcap.
//Длительность процесса измерения ограничена с помощью таймера FTimer
//значением FM_MAX. Если длительность оборота больше FM_MAX,
//частота прерывателя считается равной нулю.

#define FM_MAX    100 //максимальный измеряемый период вращения, мс
#define BLADES      8 //количество лопастей прерывателя
enum { ST_INIT, ST_COUNT, ST_DONE };

static char State;   //состояние измерителя частоты прерывателя
static int Tn;       //количество переполнений таймера
static int Tb, Te;   //захваченные значения начала и конца интервала
static int GetF;     //измеренная частота прерывателя

#pragma vector = TIMER1_CAPT_vect
__interrupt void Timer_Cap(void); //прерывание по захвату
#pragma vector = TIMER1_OVF_vect
__interrupt void Timer_Ovf(void); //прерывание по переполнению

void Meter_Init(void)
{
  TCCR1A = (1 << COM1A1) | (1 << COM1A0) |
           (1 << COM1B1) | (1 << COM1B0) |
           (1 << WGM11)  | (1 << WGM10);
  TCCR1B = (1 << WGM12) | (1 << CS10);
  TIFR = (1 << ICF1) | (1 << TOV1);
  TIMSK |= (1 << TICIE1) | (1 << TOIE1);
  GetF = 0;                    //обнуление измеренной частоты
  State = ST_INIT;             //запуск измерителя частоты
}

//Вызывать в основном цикле, t - флаг системного тика (1 мс)
void Meter_Exe(bool t)
{
  static char FTimer = ms2sys(FM_MAX);  //таймер максимального периода
  if(t)
  {
    //обработка таймера максимального периода измерителя частоты:
    if(FTimer) FTimer--;
  }
  //управление двигателем прерывателя:
  if(State == ST_DONE || !FTimer) //измерение частоты закончено
  {
    if(FTimer) //если период измерения не превышен, вычисление частоты
    {
      long Tcap = Te - Tb + (long)Tn * (PWM_MAX + 1); //длительность оборота
      GetF = (long)(BLADES * F_CLK * 1E6) / Tcap;           //частота прерывателя
    }
    else                             //период превышен,
    {
      GetF = 0;                      //обнуление частоты
    }
    FTimer = ms2sys(FM_MAX);         //перезагрузка таймера макс. периода
    State = ST_INIT;                 //запуск нового измерения частоты
  }
}

//------------------------- Прерывание по захвату: ---------------------------

#pragma vector = TIMER1_CAPT_vect
__interrupt void Timer_Cap(void)
{
  static char Nb;                    //счетчик измеренных импульсов
  switch(State)
  {
  case ST_INIT:                      //фаза начала измерения частоты
    {
      Tb = ICR1;                     //захват таймера в начале интервала
      Tn = 0;                        //инициализация количества переполнений
      if(Tb < 500 && (TIFR & (1 << TOV1)))
        Tn--;              //коррекция, если переполнение было до захвата
      Nb = BLADES;                   //инициализация количества лопостей
      State = ST_COUNT;              //переход к фазе измерения частоты
      break;
    }
  case ST_COUNT:                     //фаза измерения частоты
    {
      if(!--Nb)                      //счет лопостей, если измерены все, то
      {
        Te = ICR1;                   //захват таймера в конце интервала
        if(Te < 500 && (TIFR & (1 << TOV1)))
          Tn++;              //коррекция, если переполнение было до захвата
        State = ST_DONE;             //измерение частоты закончено
      }
      break;
    }
  }
}

//----------------------- Прерывание по переполнению: ------------------------

#pragma vector = TIMER1_OVF_vect
__interrupt void Timer_Ovf(void)
{
  if(State == ST_COUNT) Tn++;        //подсчет переполнений для частотомера
}
Аватара пользователя
Borodach
Модератор
Сообщения: 22897
Зарегистрирован: Пн дек 08, 2008 19:28:04
Откуда: 10км от Москвы на Север

Re: Измеритель частоты вращения двигателя.

Сообщение Borodach »

Если измерить частоту достаточно мощного двигателя, то можно воспользоваться моторчиком от детской игрушки ... . :)

Изображение

http://tool-land.ru/takhometr.php

Кстати, не плохой сайт по разным станкам
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Измеритель частоты вращения двигателя.

Сообщение urry »

Прикольная картинка...
Приложение к журналу "Юный техник" за 57 год ?
Реклама
Аватара пользователя
AVT-28
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Re: Измеритель частоты вращения двигателя.

Сообщение AVT-28 »

coredumped писал(а):На что и в каком формате будем выводить результат?
На дисплей в об/мин. :)
Реклама
Аватара пользователя
AVT-28
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Re: Измеритель частоты вращения двигателя.

Сообщение AVT-28 »

Ничегонеработает писал(а):

Код: Выделить всё

//Канал A PWM таймера 1 (вывод OC1A) используется для управления
//двигателем. На валу двигателя находится прерыватель оптического

Пробовал скомпильнуть, море ошибок.

  • Warning [335] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 30.1 unknown pragma "vector"
    Warning [335] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 30.1 unknown pragma "="
    Warning [335] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 30.1 unknown pragma "TIMER1_CAPT_vect"
    Warning [374] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 31.13 missing basic type; int assumed
    Error [314] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 31.13 ";" expected
    Warning [335] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 32.1 unknown pragma "vector"
    Warning [335] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 32.1 unknown pragma "="
    Warning [335] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 32.1 unknown pragma "TIMER1_OVF_vect"
    Warning [374] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 33.13 missing basic type; int assumed
    Error [314] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 33.13 ";" expected
    Error [192] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 37.1 undefined identifier "TCCR1A"
    Error [192] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 37.16 undefined identifier "COM1A1"

    Error [192] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 37.32 undefined identifier "COM1A0"
    Error [192] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 38.7 undefined identifier "COM1B1"
    Error [192] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 38.23 undefined identifier "COM1B0"
    Error [192] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 39.7 undefined identifier "WGM11"
    Error [192] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 39.22 undefined identifier "WGM10"
    Error [192] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 40.1 undefined identifier "TCCR1B"
    Error [192] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 40.16 undefined identifier "WGM12"
    Error [192] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 40.31 undefined identifier "CS10"
    Error [192] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 41.1 undefined identifier "TIFR"
    Error [192] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 41.14 undefined identifier "ICF1"
    Error [192] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 41.28 undefined identifier "TOV1"
    Error [192] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 42.1 undefined identifier "TIMSK"
    Error [192] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 42.16 undefined identifier "TICIE1"
    Error [192] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 42.32 undefined identifier "TOIE1"
    Error [372] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 48.21 "," expected
    Warning [349] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 49.1 non-prototyped function declaration for "Meter_Exe"
    Warning [361] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 50.22 function declared implicit int
    Error [188] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 50.33 constant expression required
    Error [192] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 61.35 undefined identifier "PWM_MAX"
Разбираюсь.
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

Re: Измеритель частоты вращения двигателя.

Сообщение Леонид Иванович »

AVT-28 писал(а):Пробовал скомпильнуть, море ошибок.
Ну так это же не полный проект, а всего лишь фрагмент, демонстрирующий метод измерения частоты с помощью обратного счета.
Аватара пользователя
AVT-28
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Re: Измеритель частоты вращения двигателя.

Сообщение AVT-28 »

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

Re: Измеритель частоты вращения двигателя.

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

AVT-28, за место того, что-бы копипастить всё подряд и пытаться скомпилировать неизвестно что, попытайтесь разобраться с принципом измерения частоты. Будет намного правильнее и быстрее. Это совет.
На этом форуме не раз подобное обсасывалось, причём недавно. Поищите.
Аватара пользователя
AVT-28
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Re: Измеритель частоты вращения двигателя.

Сообщение AVT-28 »

Да сложно сразу освоить все! И С и С# и ассемблер и контроллер. Я ко всему приду постепенно. Щас просто голова пухнет.
А поскольку мне это просто интересно очень я это делаю.
С чем то разобрался, с чем то никак, частично понял как контроллер работает и так далее.
Еще пару тройку месяцев и думаю тут не буду народ жуткими вопросами мучить.
Часть примеров сохраню и можно вставлять куда то в следующие разработки.
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Re: Измеритель частоты вращения двигателя.

Сообщение clawham »

http://radiokot.ru/forum/viewtopic.php?f=20&t=46464
собрали, настроили коэффициенты и вуаля :)
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Аватара пользователя
AVT-28
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Re: Измеритель частоты вращения двигателя.

Сообщение AVT-28 »

В общем сделал что хотел, купил все таки вентилятор с 4мя выводами, в 100 раз удобнее.
Та все оч просто оказалось. Считает отлично. :)
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: Измеритель частоты вращения двигателя.

Сообщение Meteor »

AVT-28 писал(а):Пробовал скомпильнуть, море ошибок.

  • Warning [335] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 30.1 unknown pragma "vector"
    ....
Разбираюсь.
Когда разберетесь постарайтесь не писать программы под AVR'ы в среде для PIC'ов и наоборот :wink:
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: Измеритель частоты вращения двигателя.

Сообщение ut1wpr »

Meteor писал(а):
AVT-28 писал(а):Пробовал скомпильнуть, море ошибок.

  • Warning [335] D:\PICProgramming\mplab\examples\FreqMeter\freqmeter.c; 30.1 unknown pragma "vector"
    ....
Разбираюсь.
Когда разберетесь постарайтесь не писать программы под AVR'ы в среде для PIC'ов и наоборот :wink:
При чем тут Пики? Нормально написанная программа в среде IAR. И именно под AVR.
С уважением,
Виктор.
Закрыто

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