Как замерить частоту до 1Гц

Обсуждаем контроллеры компании Atmel.
Ответить
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

Добрый день!
Возникла необходимость сделать прибор который бы замерял частоту до 1Гц. Навыки в программировании только поверхностные. Подскажите может у кого-нибудь есть какая-нибудь программа частотомера до 1Гц. Поиск в интернете не дает результата. частотомеров много, но чтоб работал на такой частоте нет.
Заранее благодарен.
Реклама
Родился
Аватара пользователя
Сообщения: 19
Зарегистрирован: Вс сен 26, 2010 11:56:35
Откуда: Unrubber Town

Сообщение carabas »

Для kk042fjv
Неправильно искали... Для данной ситуации правильнее говорить не "измерение частоты", а "измерение временных интервалов". Наберите в Яндексе: "измеритель временных интервалов на микроконтроллере" и выбирайте наиболее подходящий, например: http://radioded.ru/skhema-na-mikrokontr ... atmega8515 :)
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Вам же уже объяснили (на другом форуме) - нужно мерить период, а не частоту. И из него уже переводить в частоту.
Друг Кота
Аватара пользователя
Сообщения: 25501
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Кстати, для увеличения точности и понижения требований к опорной частоте полезно измерять не период, а сразу несколько периодов.
Ну а потом вычислять частоту. Это будет и фильтром КИХ одновременно.
Реклама
Эиком - электронные компоненты и радиодетали
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

Пока понятно, буду писать программу, а там уже по ходу дела будет видно
Реклама
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса

Сообщение clawham »

найдите мою конкурсную работу ваттметра - деньгомер! он меряет частоту от раза в минуту до килоегрца там и фильтр есть оконный и переход с интервального на количественный метод и т.д.! готовая конструкция под любой корпус меги 8 и под любой экран 44780(16х2 16х4 20х2 20х4)

http://radiokot.ru/circuit/digital/measure/59/
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Контактная информация:
Реклама
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

clawham писал(а):найдите мою конкурсную работу ваттметра - деньгомер! он меряет частоту от раза в минуту до килоегрца там и фильтр есть оконный и переход с интервального на количественный метод и т.д.! готовая конструкция под любой корпус меги 8 и под любой экран 44780(16х2 16х4 20х2 20х4)

http://radiokot.ru/circuit/digital/measure/59/
Здравствуйте! Уже скачал, расход показывает. Как раз что мне надо. Удобно что в меню можно подстроить под свой датчик. Только мне надо добавить чтоб на жк показывала еще частоту (в минуту) т.е. расход (л/мин) и частота (мин)
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса

Сообщение clawham »

извиняйте но ЕЩЁ? туда и капли больше не влезет :) нужно чтото удалить чтоб чтото вставить :)

пересчитайте коэффициент...ну допустим у вас 10 литров на герц - ну поставьте 60 л на герц и у вас получатся показания в литрах в минуту :)

кроме того там есть все исходники....и под кодвижн и под иар avr ... берете и тренируйтесь...там всё просто и понятно что касается вывода
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Контактная информация:
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

Добрый день!
Нужна помощь. Подскажите как можно добавить, что бы мой прибор замерял еще кроме частоты расход. Только там когда частота 1Гц расход 3 л/мин, когда 0,1 Гц расход 20 л/мин. т.е. при увеличении частоты расход уменьшается. Как это в программе сделать? МК mega8 датчик AWM5104VN (инструкцию прикладываю).
Вложения
AWM5104VN.pdf
(118.36 КБ) 343 скачивания
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Сообщение pcb »

Написать программу.
Очевидно же.
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

kk042fjv писал(а):Добрый день!
Только там когда частота 1Гц расход 3 л/мин, когда 0,1 Гц расход 20 л/мин. т.е. при увеличении частоты расход уменьшается. Как это в программе сделать? .
Тут работает простая математика.
Линейная зависимость: y=a*x+b;
Квадратичная зависимость: y=a*x*x + b*x*x + c.
И так далее.

Например, считаем зависимость расхода от частоты линейной, т.е. описываемой по формуле Расход = a * Частота + b.
Подставляем ваши данные, получаем и решаем систему уравнений:

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

| 3=a*1+b;    | b=3-a;        |           | b=21.889
| 20=a*0.1+b; | 20=a*0.1+3-a; | 17=-0.9a; | a=-18.889
То есть, зависимость расхода от частоты:

Расход = 21.889 - 18,889 * Частота.

Так в программе и считайте.

P.S. Если подставить частоту 2Гц - получаем, мягко говоря, ерунду. Но это нормально, если считать зависимость расхода линейной. Реально там зависимость явно другая, но по двум точкам я другую построить не могу.
В любом случае, должна в итоге быть некая функция Расход = func(Частота).

P.P.S. Честно говоря, это у вас странные входные данные. При расходе 20 л/мин приходит лишь один импульс за 10 секунд. При расходе 3л/мин - аж каждую секунду. Странный датчик. Мне как-то кажется логичным, что чем больше расход, тем чаще должны идти импульсы.

Если это вы напутали, и на самом деле имелось в виду, что при расходе 3 л/мин частота 1Гц, а при 20л/мин 10Гц, то формула становится
более логичной, и получается

Расход = 1.889 + 1,111 * Частота.
Контактная информация:
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

Спасибо что откликнулись, все понятно объяснили, только у меня не получается все это в код внести. Все правильно при расходе 20 л/мин частота 0.1 Гц (10 импульсов в минуту). Они как бы длиньше и больше воздуха проходит через него. Прикрепляю исходник может кто-нибудь подскажет как это в код внести все.
Вложения
11.doc
(31.5 КБ) 822 скачивания
1.rar
(2.1 КБ) 140 скачиваний
Презентация1.jpg
(85.31 КБ) 290 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

kk042fjv писал(а):при расходе 20 л/мин частота 0.1 Гц (10 импульсов в минуту)
0.1 Гц - это вообще-то 6 импульсов в минуту (0.1 импульс в секунду -> 1 импульс в 10 секунд -> 6 импульсов в минуту)
Контактная информация:
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

Здравствуйте!
Подскажите запутался, как правильно высчитать в программе. Высчитал длительность импульса, на жк показывает когда 1Гц - 506400 us, мне нужно высчитать чтоб показывало когда 1Гц - 60 имп. в мин, когда 0,1 Гц - 10 имп. в мин.

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

C = PulseClocks;
        snprintf(buf,20, "%2.1f us", C);
          lcd_gotoxy(0,0);
            lcd_puts(buf);
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

kk042fjv писал(а):на жк показывает когда 1Гц - 506400 us
По одной точке функцию не построишь. Что показывает на других частотах?
kk042fjv писал(а):когда 1Гц - 60 имп. в мин, когда 0,1 Гц - 10 имп. в мин.
Вообще-то 0.1Гц - это 6 имп/мин
А вообще, если как-то так:
1.0 сек => С = 506400 (импульсов) - рисуем 60
0.1 сек => C = 50640 (импульсов) - рисуем 6

Получаем, K / 506400 = 60 => K = 506400 * 60 необходимый коэффициент. И что-то вроде

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

C = PulseClocks;
PPM = (506400 * 60) / C;
snprintf(buf,20, "%d ppm", PPM);
lcd_gotoxy(0,0);
lcd_puts(buf);
На таких малых частотах стоит уменьшить частоту счётных импульсов (таймеры замедлить, например). Тогда можно избавиться от необходимости расчётов в long, а перейти хотя бы на int. Хотя, судя по использованию sprintf (stdlib), Вы по поводу оптимального кода особо не задумываетесь.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Посмотрел даташит на датчик, не вкурю никак, причем тут герцы, если у него аналоговый выход?
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

По одной точке функцию не построишь. Что показывает на других частотах?
100 mHz-5064000
300 mHz-1688000
500 mHz-1012800
700 mHz-723429
1 Hz - 506400
На таких малых частотах стоит уменьшить частоту счётных импульсов (таймеры замедлить, например). Тогда можно избавиться от необходимости расчётов в long, а перейти хотя бы на int. Хотя, судя по использованию sprintf (stdlib), Вы по поводу оптимального кода особо не задумываетесь.
Опыту мало, только начинаю учиться буду рад любой подсказки, может посмотрите код, подскажите как получше сделать?

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

#include <mega8.h>
#include <alcd.h>
#include <delay.h>
#include <stdio.h>

unsigned char OverflowC;//счётчик переполнений для таймера 1
unsigned int EdgeR, EdgeF;//время переднего фронта и заднего фронта
unsigned long PulseClocks;//количество тактовых импульсов внутри импульса на входе ICP
 char buf[20];
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
                OverflowC++;//инкрементируется количество переполнений  
}

interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
    //Блок для измерения длительности импульса
    if(PINB.0) //если на входе захвата 1 (передний фронт ПОЛОЖИТЕЛЬНОГО импульса)
    {
        EdgeR = (unsigned int)ICR1L+((unsigned int)ICR1H << 8);           //запоминаем значениие счётчика 
        TCCR1B &= ~(1<<ICES1);  //устанавливаем прерывание по спадающему фронту импульса
		OverflowC = 0;          //обнуляем количество переполнений счётчика
	}
	else                        //если на входе захвата 0 (задний фронт ПОЛОЖИТЕЛЬНОГО импульса) 
	{
	    EdgeF = (unsigned int)ICR1L+((unsigned int)ICR1H << 8);           //запоминаем значение счётчика
		TCCR1B |= (1<<ICES1);   //устанавливаем прерывание по нарастающему фронту импульса
		PulseClocks = (unsigned long)EdgeF - (unsigned long)EdgeR + ((unsigned long)OverflowC << 16);//вычисляем длительность импульса
        }
}

void main(void)
{
float  C;

TCCR1A=0x00;
TCCR1B=0x82;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

TIMSK=0x24;

lcd_init(16);
lcd_putsf("BK v1");
delay_ms(1500);
lcd_clear();

#asm("sei")

while (1)
        {
         lcd_clear();
        C = PulseClocks;
        snprintf(buf,20, "%2.1f us", C);
          lcd_gotoxy(0,0);
            lcd_puts(buf);
                      
        }
}
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

zero648 писал(а):Посмотрел даташит на датчик, не вкурю никак, причем тут герцы, если у него аналоговый выход?
Выход аналоговый, через датчик воздух уже проходит импульсами, это раздербаненый медецинский прибор (вроде дыхательный аппарат).
Ответить

Вернуться в «AVR»