Top.Mail.Ru
Уведомления
Очистить все

STM32F407 + BMP280 - VARIOMETR

(@eduard-2)
Level 2

Здравствуйте! помогите пожалуйста определить скороподъемность!

Вот фрагмент кода.

while(1)
{         
  bme280_start(); // Запускаю преобразование датчика давления bmp280
  delay(5000);
  bme280_clc(); // Вычисляем давление в паскалях 
  h1 = p; //сохраняем
  currentTime = TIM1->CNT+ OVF_counter * 0X2710; // Текущее время Фактическое время чтения

  elapsedTime = (currentTime - previousTime) /1000; // Разделим на 1000, чтобы   получить время в секундах   
  previousTime = currentTime; // Предыдущее время сохраняется до фактического чтения
      
  vs=(h1-h3)/elapsedTime; // Вычисляем производную ,то есть приращение высот делим на промежуток времени
  h3=h1; // Сохраняем предыдущее значение 
 
  string(180,10,"скорость подъема:",0xff,0x00ff22,1);
  BINBCD(vs,210,10,2); // выводим на дисплей

  delay(850000);
}
 
В общем высота выводится правильно, но скороподъемность ерунда какая то , может в алгоритме вычисления скорости , что то не учитываю?
 
Спасибо!
Цитата
Создатель темы Размещено : 05.07.2024 22:02
(@eduard)
Level 5 Moderator

Я не понял.

А причём здесь задержка в 5 секунд?

Потом задержка в 14 минут?

Какая может быть скороподъёмность при таких задержках?

За это время я слетаю, отбомблюсь и вернусь обратно.

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

ОтветитьЦитата
Размещено : 05.07.2024 22:25
(@eduard-2)
Level 2

@eduard задержка порядка 0.6 сек

ОтветитьЦитата
Создатель темы Размещено : 05.07.2024 23:29
(@eduard-2)
Level 2

Запись от: @eduard-2

@eduard задержка порядка 0.6 сек

в общем , на делай не обращайте , проц молотит на частоте 168 мгц

 

ОтветитьЦитата
Создатель темы Размещено : 05.07.2024 23:31
(@eduard-2)
Level 2

@eduard функции delay это обычные циклы через for() ;

ОтветитьЦитата
Создатель темы Размещено : 06.07.2024 00:22
(@eduard)
Level 5 Moderator

Я так понимаю.

Нужно проверить давление и запомнить.

Через строго определённое время, померять снова.

Посчитать разницу и запомнить.

Замерять давление снова. Снова посчитать разницу и исходя из этих значений  посчитать скорость подъёма.

И делать это постоянно в цикле. Есть алгоритм бегущего среднего.

 

У Вас же замер происходит один раз. Или я чего то не вижу?

ОтветитьЦитата
Размещено : 06.07.2024 10:14
(@eduard-2)
Level 2

@eduard так и есть, сохраняем предыдущее измерение в h3

ОтветитьЦитата
Создатель темы Размещено : 06.07.2024 11:10
(@eduard-2)
Level 2

Запись от: @eduard-2

@eduard так и есть, сохраняем предыдущее измерение в h3

 

ОтветитьЦитата
Создатель темы Размещено : 03.08.2024 16:20
(@eduard-2)
Level 2

Запись от: @eduard-2

Здравствуйте! помогите пожалуйста определить скороподъемность!

Вот фрагмент кода.

while(1)
{         
  bme280_start(); // Запускаю преобразование датчика давления bmp280
  delay(5000);
  bme280_clc(); // Вычисляем давление в паскалях 
  h1 = p; //сохраняем
  currentTime = TIM1->CNT+ OVF_counter * 0X2710; // Текущее время Фактическое время чтения

  elapsedTime = (currentTime - previousTime) /1000; // Разделим на 1000, чтобы   получить время в секундах   
  previousTime = currentTime; // Предыдущее время сохраняется до фактического чтения
      
  vs=(h1-h3)/elapsedTime; // Вычисляем производную ,то есть приращение высот делим на промежуток времени
  h3=h1; // Сохраняем предыдущее значение 
 
  string(180,10,"скорость подъема:",0xff,0x00ff22,1);
  BINBCD(vs,210,10,2); // выводим на дисплей

  delay(850000);
}
 
В общем высота выводится правильно, но скороподъемность ерунда какая то , может в алгоритме вычисления скорости , что то не учитываю?
 
Спасибо!

Позаимствовал нижеприведённой код, все работает, но не совсем понятен алгоритм, может кто разъяснит? 

float vario_down = -1.1; // Установка СНИЖЕНИЯ
float vario_up;
float alt[51];
float tim[51];
float beep;
float Beep_period;
float mux;
float Altitude;
float Alt0; // нулевая высота в момент включения
float correctBMP180 = 0; // коррекция бародатчика в гектапаскалях /индивидуальна для каждого датчика/

const float p0 = 101325;

long Pressure = 101325;
unsigned long bounseInput4P = 0UL;

int samples=40;
int maxsamples=50;
int countPressVal = 0;




........ 

while (1){




    float tempo=millis();
    float vario=0;
    float N1=0;
    float N2=0;
    float N3=0;
    float D1=0;
    float D2=0;
    bmp085.calcTruePressure(&Pressure);
    
    Altitude = (float)44330 * (1 - pow(((float)Pressure/p0), 0.190295)); // полючение новой высоты в метрах
    
    for(int cc=1;cc<=maxsamples;cc++){ // усреднитель
        alt[(cc-1)]=alt[cc];
        tim[(cc-1)]=tim[cc];
    };
    alt[maxsamples]=Altitude;
    tim[maxsamples]=tempo;
    float stime=tim[maxsamples-samples];
    for(int cc=(maxsamples-samples);cc<maxsamples;cc++){
        N1+=(tim[cc]-stime)*alt[cc];
        N2+=(tim[cc]-stime);
        N3+=(alt[cc]);
        D1+=(tim[cc]-stime)*(tim[cc]-stime);
        D2+=(tim[cc]-stime);
    };
    
    vario=1000*((samples*N1)-N2*N3)/(samples*D1-D2*D2); // рачёт звука
 
 
Далее вывод на дисплей и зуммер
ОтветитьЦитата
Создатель темы Размещено : 03.08.2024 16:25
Поделиться: