• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Pomiar częstotliwości przebiegu prostokątnego
#1
Witam
Mam zagwozdkę. W programie poniżej wykonuje między innymi pomiar częstotliwości przebiegu prostokątnego za pomocą funkcji PulseIn w zakresie 2kHz do około 12kHz. 

Ogólnie chce mierzyć częstotliwość na przepływomierzu masowym powietrza. W momencie kiedy nacisnę przycisk zostaje otwarty elektrozawór który poda powietrze przez 4 sekundy, a więc na przepływomierzu będzie wzrastać częstotliwość. Chce mierzyć częstotliwość i wyciągnąć największą wartość i wyświetlić ją na wyświetlaczu. 
Problem jest taki że gdy podaje różne częstotliwości w zakresie od 2 kHz do 12 kHz to na wyświetlaczu potrafi pojawić się wartość np.: 13625 Hz. Chciałbym zbliżyć się jak najbardziej do prawdziwych wartości. Poniżej zamieszczam kody.

Generator różnych częstotliwości:
Kod:
const int buttonPin = 4;
const int outputPin = 6;
int measurementCount = 0;
unsigned long startTime = 0; // Zmienna przechowująca czas rozpoczęcia generowania losowych wartości

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(outputPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  // Sprawdź, czy przycisk został naciśnięty
  if (digitalRead(buttonPin) == LOW) {
    startTime = millis(); // Zapisz aktualny czas rozpoczęcia generowania

    // Generuj losowe wartości przez 4 sekundy
    while (millis() - startTime < 4100) {
     
      int frequency = random(2000, 12001); // Zakres od 2 kHz do 12 kHz
      //delay(60);

      // Zwiększ numer pomiaru przy każdej iteracji
      measurementCount++;

      // Ustawianie częstotliwości wyjściowej
      tone(outputPin, frequency);

      // Wypisywanie informacji do monitora szeregowego
      Serial.print("Pomiar ");
      Serial.print(measurementCount);
      Serial.print(": Częstotliwość: ");
      Serial.print(frequency);
      Serial.println(" Hz");
     
     
    }

    noTone(outputPin);
    measurementCount = 0;
  }
}

Kod pomiaru częstotliwości:
Kod:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_WIDTH 128                              // Wysokośc ekranu w pikselach
#define OLED_HEIGHT 64                              // Szerokośc ekranu w pikselach
Adafruit_SSD1306 display(OLED_WIDTH, OLED_HEIGHT);


float voltage = 0;
int maxAnalogValue = 0;
int maxFrequency = 0;
int stanPrzycisku=0;
int zmienna= 0;

int measurementCount = 0;


void setup()
  {
  Serial.begin(9600);
  pinMode (4,INPUT_PULLUP);
  pinMode (2,INPUT);
  pinMode(A1,INPUT);                                // Ustawnienia pinu A1 jako wejscie
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);        // Inicjalizacja wyświetlacza OLED
  setCustomTextSize(2);                             // Ustawienie rozmiaru czcionki
  display.setTextColor(WHITE);                      // Ustawienie koloru tekstu
  wyswietlanie_start();
  }


void setCustomTextSize(float size)                  //Ustawenie niestandardowego rozmiaru dla wyswietlacz
  {
  display.setTextSize(round(size));        
  }

void wyswietlanie_start ()
  {
    display.clearDisplay ();        // Czyszczenie ekranu
    display.setCursor(0, 0);        // Ustawienie pozycji kursora
    display.println("Nacisnij");    // Wyświetlenie napisu "U="
    display.setCursor(0, 24);       // Ustawienie pozycji kursora
    display.println("przycisk");    // Wyświetlenie napisu "U="
    display.setCursor(0, 48);       // Ustawienie pozycji kursora
    display.println("START");       // Wyświetlenie napisu "U="
    display.display();              // Wyświetlenie zawartości bufora na ekranie
  }

void wyswietlanie_trwa_pomiar()
  {
    display.clearDisplay ();
    display.setCursor(0, 0);                  // Ustawienie pozycji kursora
    display.println("Trwa pomiar");           // Wyświetlenie napisu "U="
    display.display(); 
  }

void wyswietlanie_wartosci()
{
    display.clearDisplay ();        // Czyszczenie ekranu
    display.setCursor(0, 0);        // Ustawienie pozycji kursora
    display.println("U=");          // Wyświetlenie napisu "U="
    display.setCursor(36, 0);       // Ustawienie pozycji kursora
    display.println(voltage);       // Wyświetlenie wartości napięcia
    display.setCursor(0, 34);       // Ustawienie pozycji kursora
    display.println("f=");          // Wyświetlenie napisu "f="
    display.setCursor(36, 36);      // Ustawienie pozycji kursora
    display.print(maxFrequency);          // Wyświetlenie wartości czestotliwosci
    display.display();              // Wyświetlenie zawartości bufora na ekranie
  }




void pomiar()
  { 
    maxFrequency = 0;
    voltage =0;

    unsigned long startTime = millis();

    while (millis() - startTime < 4000)                                 // Mierz czas przez 4 sekundy
    {
      unsigned long pulseWidthHigh = pulseIn(2, HIGH);          // Mierz czas trwania sygnału na pinie cyfrowym D2
      delayMicroseconds (5);
      unsigned long pulseWidthLow = pulseIn(2, LOW);
      delayMicroseconds (5);
      maxAnalogValue = analogRead(A1);
     
     
      int frequency = 1000000 / (pulseWidthHigh + pulseWidthLow );       // Oblicz częstotliwość na podstawie czasu trwania sygnału
      voltage = maxAnalogValue * (5.0 / 1023.0);                        // Obliczenie napięcia

      if (frequency > maxFrequency)                                     // Znajdź największą zmierzoną wartość
      {                                  
        maxFrequency = frequency;
      }
      measurementCount++;
      Serial.print(measurementCount);
      Serial.print(": Częstotliwość: ");
      Serial.println(frequency);
    }
    measurementCount = 0;
}

void loop()
  {
  stanPrzycisku= digitalRead(4);
  if (stanPrzycisku == LOW && zmienna==0)
    {
      wyswietlanie_trwa_pomiar();
      pomiar ();
      zmienna++;  
    }
    
  if (stanPrzycisku == LOW && zmienna==1)
    {
      wyswietlanie_wartosci();
      zmienna--;
    }
    delay (100);
  }
 
Odpowiedź
  


Wiadomości w tym wątku
Pomiar częstotliwości przebiegu prostokątnego - przez Fondix - 06-12-2023, 19:50

Skocz do:


Przeglądający: 1 gości