Страница 1 из 1
Как замерить частоту до 1Гц
Добавлено: Пт ноя 22, 2013 12:14:33
kk042fjv
Добрый день!
Возникла необходимость сделать прибор который бы замерял частоту до 1Гц. Навыки в программировании только поверхностные. Подскажите может у кого-нибудь есть какая-нибудь программа частотомера до 1Гц. Поиск в интернете не дает результата. частотомеров много, но чтоб работал на такой частоте нет.
Заранее благодарен.
Re: Как замерить частоту до 1Гц
Добавлено: Пт ноя 22, 2013 12:28:55
carabas
Для kk042fjv
Неправильно искали... Для данной ситуации правильнее говорить не "измерение частоты", а "измерение временных интервалов". Наберите в Яндексе: "измеритель временных интервалов на микроконтроллере" и выбирайте наиболее подходящий, например:
http://radioded.ru/skhema-na-mikrokontr ... atmega8515 
Re: Как замерить частоту до 1Гц
Добавлено: Пт ноя 22, 2013 13:38:08
Аlex
Вам же уже объяснили (на другом форуме) - нужно мерить период, а не частоту. И из него уже переводить в частоту.
Re: Как замерить частоту до 1Гц
Добавлено: Пт ноя 22, 2013 13:50:13
КРАМ
Кстати, для увеличения точности и понижения требований к опорной частоте полезно измерять не период, а сразу несколько периодов.
Ну а потом вычислять частоту. Это будет и фильтром КИХ одновременно.
Re: Как замерить частоту до 1Гц
Добавлено: Пт ноя 22, 2013 14:34:54
kk042fjv
Пока понятно, буду писать программу, а там уже по ходу дела будет видно
Re: Как замерить частоту до 1Гц
Добавлено: Вт ноя 26, 2013 14:48:39
clawham
найдите мою конкурсную работу ваттметра - деньгомер! он меряет частоту от раза в минуту до килоегрца там и фильтр есть оконный и переход с интервального на количественный метод и т.д.! готовая конструкция под любой корпус меги 8 и под любой экран 44780(16х2 16х4 20х2 20х4)
http://radiokot.ru/circuit/digital/measure/59/
Re: Как замерить частоту до 1Гц
Добавлено: Ср ноя 27, 2013 07:47:09
kk042fjv
clawham писал(а):найдите мою конкурсную работу ваттметра - деньгомер! он меряет частоту от раза в минуту до килоегрца там и фильтр есть оконный и переход с интервального на количественный метод и т.д.! готовая конструкция под любой корпус меги 8 и под любой экран 44780(16х2 16х4 20х2 20х4)
http://radiokot.ru/circuit/digital/measure/59/
Здравствуйте! Уже скачал, расход показывает. Как раз что мне надо. Удобно что в меню можно подстроить под свой датчик. Только мне надо добавить чтоб на жк показывала еще частоту (в минуту) т.е. расход (л/мин) и частота (мин)
Re: Как замерить частоту до 1Гц
Добавлено: Ср ноя 27, 2013 10:07:27
clawham
извиняйте но ЕЩЁ? туда и капли больше не влезет

нужно чтото удалить чтоб чтото вставить
пересчитайте коэффициент...ну допустим у вас 10 литров на герц - ну поставьте 60 л на герц и у вас получатся показания в литрах в минуту
кроме того там есть все исходники....и под кодвижн и под иар avr ... берете и тренируйтесь...там всё просто и понятно что касается вывода
Re: Как замерить частоту до 1Гц
Добавлено: Пт дек 20, 2013 12:53:45
kk042fjv
Добрый день!
Нужна помощь. Подскажите как можно добавить, что бы мой прибор замерял еще кроме частоты расход. Только там когда частота 1Гц расход 3 л/мин, когда 0,1 Гц расход 20 л/мин. т.е. при увеличении частоты расход уменьшается. Как это в программе сделать? МК mega8 датчик AWM5104VN (инструкцию прикладываю).
Re: Как замерить частоту до 1Гц
Добавлено: Пт дек 20, 2013 13:48:02
pcb
Написать программу.
Очевидно же.
Re: Как замерить частоту до 1Гц
Добавлено: Пт дек 20, 2013 14:16:11
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 * Частота.
Re: Как замерить частоту до 1Гц
Добавлено: Пн дек 23, 2013 11:34:55
kk042fjv
Спасибо что откликнулись, все понятно объяснили, только у меня не получается все это в код внести. Все правильно при расходе 20 л/мин частота 0.1 Гц (10 импульсов в минуту). Они как бы длиньше и больше воздуха проходит через него. Прикрепляю исходник может кто-нибудь подскажет как это в код внести все.
Re: Как замерить частоту до 1Гц
Добавлено: Пн дек 23, 2013 15:01:45
WiseLord
kk042fjv писал(а):при расходе 20 л/мин частота 0.1 Гц (10 импульсов в минуту)
0.1 Гц - это вообще-то 6 импульсов в минуту (0.1 импульс в секунду -> 1 импульс в 10 секунд -> 6 импульсов в минуту)
Re: Как замерить частоту до 1Гц
Добавлено: Пн ноя 24, 2014 12:13:24
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);
Re: Как замерить частоту до 1Гц
Добавлено: Пн ноя 24, 2014 12:46:19
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), Вы по поводу оптимального кода особо не задумываетесь.
Re: Как замерить частоту до 1Гц
Добавлено: Вт ноя 25, 2014 01:30:22
zero648
Посмотрел даташит на датчик, не вкурю никак, причем тут герцы, если у него аналоговый выход?
Re: Как замерить частоту до 1Гц
Добавлено: Вт ноя 25, 2014 05:25:43
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);
}
}
Re: Как замерить частоту до 1Гц
Добавлено: Вт ноя 25, 2014 05:28:53
kk042fjv
zero648 писал(а):Посмотрел даташит на датчик, не вкурю никак, причем тут герцы, если у него аналоговый выход?
Выход аналоговый, через датчик воздух уже проходит импульсами, это раздербаненый медецинский прибор (вроде дыхательный аппарат).