Индикатор длительности и количества импульсов
- Войдите на сайт для отправки комментариев
Вс, 07/05/2017 - 16:35
Доброго времени суток участникам форума.
Не так давно заинтересовался МК Ардуино. С электротехникой знаком, а вот с программированием не очень.
Хочу сконструировать индикатор длительности и количества импульсов. На порты поступают импульсы, на первом порту необходимо измерять длительность импульсов за время Т(например 1 сек.) и усреднять. Далее выводить на индикатор. С второго порта необходимо считывать количество импульсов за время Т (1 сек), усреднять и выводить на дисплей.
Сложность для меня в том, что длительность импульсов и частота постоянно меняются, каким образом можно фиксировать первичные параметры импульсов, и как усреднять в непрерывном процессе?
Изучите функции
класс титановый велосипед StopWatch.
Длительность импульсов Вам измерит функция pulseIn, см. раздел http://arduino.ru/Reference .
Количество импульсво лучше всего считать прерыванием. См. attachInterrupt в том же разделе.
И вообще, проштудируйте тот раздел целиком, чтобы по каждой ерунде вопрос не возникало.
Ну а как бы Вы в жизни без компьютера усредняли?
Заводите две переменные в котроых изначально нули. В первой переменной накапливаете сумму длительностей всех поступивших импульсо по мере их поступления. Вот второй накапливаете количество поступивших импульсов (т.е. просто прибаляете туда 1 вский раз, когда импульс поступил.
В любой момент, поделив первую переменную на вторую получаете среднюю длительность всех поступивших к данному моменту импульсов.
Только следите за переполнением (правильно тип выбирайте) и не забывайте об особенностях целочисленного деления.
Благодарю за помощь. Про среднее значение я имел ввиду, за последнюю секунду. Частота примерно изменятся от 20 до 200 Гц. Длительность импульса от 1 до 15мс. Про сумму длительности/кол-во импульсов мысли были, но мне необходимо за отрезок времени. Импульсы идут непрерывно и имеют разброс, если их выводить на экран, то показания быдут прыгать. Чтобы не было резких скачков, хочу выводить среднее значение, т.е. для примера брать цепочку в 20 импульсов и обрабатывать их. Думаю использовать 20 переменых, которые изменяют значения с каждым импульсом(обновляются), и далее из них выводится среднее на экран.
Также возник вопрос по отображению на дисплее. Есть предположение, что если выводить на экран с каждым циклом, то будет все мелькать. Думаю стоит выводить 2-5 раз в секунду.
А справитесь? Создаете структуру указывающую саму на себя. Создаете 3 функции: добавление новой в начало, убирание последней в конце, подсчет средней в очереди. Потом делаем кучу . И запускаем измерение с выводом на экран.
Конечно хочется справиться. Цепочку вроде представляю, но вот как увязать правильно пока только изучаю.
Блин, ну почему новички никогда не говорят что именно им нужно, а всегда просят подсказать реализацию их собвтсенных (зачастую в корне неверных) подходов?
Не нужна Вам никакая средяя за секунду. Считать её у Вас никакой памяти не хватит.
Вам нужен фильтр низких частот.
Простейшая реализация описана вот здесь - http://www.poprobot.ru/theory/low_pass_filter
Почти тоже самое, но более гибко и почти также просто делается то, что биржевики называют Exponential Moving Average (EMA). См. описание EMA здесь - https://www.metatrader5.com/ru/terminal/help/indicators/trend_indicators/ma
Наконец, есть продвинутые фильтры типа вот такого.
Попробуйте разные и реализуйте тот, который окажется более адекватным Ваше задаче.
В моей задаче используются дискретные сигналы без шумов. Пока буду решать задачу для одного порта с длительностью импульса. Частота изменяется от15 до 100 герц. Длительность верхнего фронта импулься от1 до 15 мс. Усреднение хочу использовать для плавного изменения значений и отображения на дисплее (экране). Точные значения длительности нужны будут позднее.
Скопировано:
Простое, или арифметическое, скользящее среднее рассчитывается путем суммирования цен закрытия инструмента за определенное число единичных периодов (например, за 12 часов) с последующим делением суммы на число периодов.
Примерно таким же образом я и хотел усреднять. Значения 20 последних импульсов приводить к среднму, тогда конечный результат будет изменятся плавно.
В моей задаче используются дискретные сигналы без шумов. Пока буду решать задачу для одного порта с длительностью импульса. Частота изменяется от15 до 100 герц. Длительность верхнего фронта импулься от1 до 15 мс. Усреднение хочу использовать для плавного изменения значений и отображения на дисплее (экране). Точные значения длительности нужны будут позднее.
Скопировано:
Простое, или арифметическое, скользящее среднее рассчитывается путем суммирования цен закрытия инструмента за определенное число единичных периодов (например, за 12 часов) с последующим делением суммы на число периодов.
Примерно таким же образом я и хотел усреднять. Значения 20 последних импульсов приводить к среднму, тогда конечный результат будет изменятся плавно.
В моей задаче используются дискретные сигналы без шумов. Пока буду решать задачу для одного порта с длительностью импульса. Частота изменяется от15 до 100 герц. Длительность верхнего фронта импулься от1 до 15 мс. Усреднение хочу использовать для плавного изменения значений и отображения на дисплее (экране). Точные значения длительности нужны будут позднее.
Скопировано:
Простое, или арифметическое, скользящее среднее рассчитывается путем суммирования цен закрытия инструмента за определенное число единичных периодов (например, за 12 часов) с последующим делением суммы на число периодов.
Примерно таким же образом я и хотел усреднять. Значения 20 последних импульсов приводить к среднму, тогда конечный результат будет изменятся плавно.
В моей задаче используются дискретные сигналы без шумов. Пока буду решать задачу для одного порта с длительностью импульса. Частота изменяется от15 до 100 герц. Длительность верхнего фронта импулься от1 до 15 мс. Усреднение хочу использовать для плавного изменения значений и отображения на дисплее (экране). Точные значения длительности нужны будут позднее.
Скопировано:
Простое, или арифметическое, скользящее среднее рассчитывается путем суммирования цен закрытия инструмента за определенное число единичных периодов (например, за 12 часов) с последующим делением суммы на число периодов.
Примерно таким же образом я и хотел усреднять. Значения 20 последних импульсов приводить к среднму, тогда конечный результат будет изменятся плавно.
Вы главной мысли не поняли. Суммирование за какой-то период предполагает запоминание значений и времени, чтобы потом выбрасывать из суммы старые значения. На это у Вас нет памяти. Поэтому я Вам предложил несколько вариантов "усреднения" БЕЗ необходимости суммирования. Что ФНЧ, что EMA не требуют суммирования и запоминания. Понимаете?
Теперь понял. Просто пока не умею использовать более сложные механизмы, простые арифметические действия привычнее, а вот более сложное надо пробовать. Хочется так сказать прощупать процесс, знать что от чего зависит и уметь его контролировать. Буду пробовать по мере возможности.
Теперь понял. Просто пока не умею использовать более сложные механизмы, простые арифметические действия привычнее, а вот более сложное надо пробовать. Хочется так сказать прощупать процесс, знать что от чего зависит и уметь его контролировать. Буду пробовать по мере возможности.
Теперь понял. Просто пока не умею использовать более сложные механизмы, простые арифметические действия привычнее, а вот более сложное надо пробовать. Хочется так сказать прощупать процесс, знать что от чего зависит и уметь его контролировать. Буду пробовать по мере возможности.
Кстати, для реализации датчика дождя тоже нужно считать число ударов капель ... чем чаще "бьют", тем полагаю, сильнее дождь. Прикинул, при сильном ливне на 1 квадратный дециметр примерно падает 30 - 40 капель в секунду. Так что, возможно, идеи для ТС пригодятся и мне
Кстати, для реализации датчика дождя тоже нужно считать число ударов капель ... чем чаще "бьют", тем полагаю, сильнее дождь. Прикинул, при сильном ливне на 1 квадратный дециметр примерно падает 30 - 40 капель в секунду. Так что, возможно, идеи для ТС пригодятся и мне
ПОсмотрите в проектах - там есть счетчик Гейгера. Программная чать, думаю, практически идентична.
ПОсмотрите в проектах - там есть счетчик Гейгера. Программная чать, думаю, практически идентична.
Ок, спасибо
Прикинул, при сильном ливне на 1 квадратный дециметр примерно падает 30 - 40 капель в секунду. Так что, возможно, идеи для ТС пригодятся и мне
По моим прикидкам при самом сильном ливне (по Википедии 100 мм/ч) примерно вчетверо больше.
Доброго времени суток. Наконец то добрался до компьютера и риступил к реализации программы. Пока что наваял часть для измерения длительности и усреднения. Испытания на коленке прошли успешно. ) Получился вот такой вот код. Светодиод использовался для первоночальной отладки. Сильно не ругать, первый самостоятельный скетч. Буду рад предложениям , как упростить.
Вот так попроще:
А вот тут так
Не пойму только, почему делим на 20000, а не просто на 20
вместо
unsigned
long
previousMicros = 0;
напиши static
unsigned
long
previousMicros = 0;
иначе между вызовами loop previousMicros запоминаться не будет
ну и код не то что сырой, с него прям слеза льёца.
Делим на 20000 , потому что микросекунды переводим в миллисекунды.