как убрать скачки замеров времени между импульсами

anatoliy1608
Offline
Зарегистрирован: 19.10.2018

Нужно снимать данные с расходометра води, расходомер генерирует прямоугольные импульсы.

делаю замеры времени между импульсами, чтобы считать сколько выливает води в реальном времени.

Но замеры почему-то очень скачут. И это очень влияет на конечный результат. (Он очень скачет)

Не знаю, как решить данную проблему.

Может как-то усреднять, или есть более точны способ измерения.

Прошу помочь, может кто-то делал подобное

 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

А где рукописи?

И наверное чтобы не пропускать импольсы их можно на прерывания завести!?

anatoliy1608
Offline
Зарегистрирован: 19.10.2018
#define FLOWSENSORPIN 27

volatile uint8_t lastflowpinstate;
volatile uint32_t pulses_meter = 0;
float us_puls_flow_new = 0;
volatile uint32_t lastflowratetimer = 0;

SIGNAL(TIMER0_COMPA_vect) {
  uint8_t x = digitalRead(FLOWSENSORPIN);
  if (x == HIGH && x != lastflowpinstate) {
    pulses_meter++;
    us_puls_flow_new = micros() - lastflowratetimer;
    lastflowratetimer = micros();
  }


  lastflowpinstate = x;
  if (micros() - lastflowratetimer >= 3500000) {
    us_puls_flow_new = 0;
  }



}

void useInterrupt(boolean v) {
  if (v) {
    // Timer0 is already used for millis() - we'll just interrupt somewhere
    // in the middle and call the "Compare A" function above
    OCR0A = 0xAF;
    TIMSK0 |= _BV(OCIE0A);
  } else {
    // do not call the interrupt function COMPA anymore
    TIMSK0 &= ~_BV(OCIE0A);
  }
}

void setup() {
  Serial.begin(9600);
 
  pinMode(FLOWSENSORPIN, INPUT);
  digitalWrite(FLOWSENSORPIN, HIGH);
  
  lastflowpinstate = digitalRead(FLOWSENSORPIN);
  useInterrupt(true);
}

void loop() {
Serial.println(us_puls_flow_new);
}

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Насколько я п\онимаю, для измерения расхода надо считать не длительность между импульсами, а количество импульсов в минуту (или другой интервал)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Расход, очевидно пропорционален интегралу этой кривой. Так проинтегрровать её и читать через АЦП. Нет?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

anatoliy1608 пишет:

 

Нужно снимать данные с расходометра води, расходомер генерирует прямоугольные импульсы. делаю замеры времени между импульсами, чтобы считать сколько выливает води в реальном времени. Но замеры почему-то очень скачут. И это очень влияет на конечный результат. (Он очень скачет) Не знаю, как решить данную проблему. Может как-то усреднять, или есть более точны способ измерения. Прошу помочь, может кто-то делал подобное

Уважаемый, почитайте документацию на расходомер. Обычно с этого начинают конструирование. И, скорее всего, как отметили в #3, вода считается по количеству импульсов (что конструктивно логично т.к. счетчики обычно механические), а не таймингом.

nik182
Offline
Зарегистрирован: 04.05.2015

Почему  float us_puls_flow_new ?

 Скорость сериала сделайте 115200 и посмотрите что получится.