• 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
#8
Dobra doprowadziłem program do stanu który mnie zadowala. Błąd odczytu to max 50 hz przy 12 kHz. Poniżej zamieszczam kody:

Generator liczb losowych :

Kod:
const int buttonPin = 4;
const int outputPin = 2;
int measurementCount = 0;
unsigned long startTime = 0;
int frequency = 0;


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

void loop() {
 
  if (digitalRead(buttonPin) == LOW) {
    startTime = millis();
    measurementCount = 0; /

  
    while (millis() - startTime < 4000) {
      if (millis() - startTime < 1000) {
       
        frequency = random(0, 10000); // Zakres od 0 do 12 kHz
        delay(30);
      } else {
       
        frequency = random(11501, 12001);
        delay (30);
      }

      tone(outputPin, frequency);

      Serial.print("Line: ");
      Serial.print(measurementCount++);
      Serial.print(", Frequency: ");
      Serial.println(frequency);
    }

    noTone(outputPin);
  }

  measurementCount=0;
  delay (30);
}

Pomiar:
Kod:
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <FreqCount.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;
float maxVoltage = 0;

int count=0;
int maxCount = 0;
int frequency=0;

int buttonState=0;
int buttonValue= 0;




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

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

void display_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 display_progress()
  {
    display.clearDisplay ();
    display.setCursor(0, 0);                  // Ustawienie pozycji kursora
    display.println("Trwa pomiar");           // Wyświetlenie napisu "U="
    display.display(); 
  }

void display_value()
{
    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(frequency);          // Wyświetlenie wartości czestotliwosci
    display.display();              // Wyświetlenie zawartości bufora na ekranie
  }

void measurement()
  { 
    voltage =0; 
    count=0;
    maxCount=0;
    frequency=0;
    unsigned long startTime = millis();

    while (millis() - startTime < 3900)                                 // Mierz czas przez 4 sekundy
    {
      maxVoltage = analogRead(A1);
      voltage = maxVoltage * (5.0 / 1023.0);                        // Obliczenie napięcia

    if (FreqCount.available())
      {                                                               //if the code if working
      count = FreqCount.read();                           //create float var called count and populate it with current frequency count

    if (count > maxCount)                                     // Znajdź największą zmierzoną wartość
      {                                  
        maxCount = count;
      }
      frequency= (maxCount*50);
      }
    }
  }

void loop()
  {
  buttonState= digitalRead(4);
  if (buttonState == LOW && buttonValue==0)
    {
      display_progress();
      measurement ();
      buttonValue++;  
    }
    
  if (buttonState == LOW && buttonValue==1)
    {
      display_value();
      buttonValue--;
    }
    delay (100);
  }



// Przycisk D4
//Wejscie sygnału D5
// SCL A5
// SDA A4
 
Odpowiedź
  


Wiadomości w tym wątku
RE: Pomiar częstotliwości przebiegu prostokątnego - przez Fondix - 07-12-2023, 22:36

Skocz do:


Przeglądający: 1 gości