• 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
Zliczanie impulsów prosty przykład
#1
Ma może ktoś jakiś prosty przykład do zliczania impulsów ? HIGH/LOW. 

Częstotliwość będzie się zmieniać od 0-500Hz z wypełnieniem  20-70% potrzebuje jakiś przykład by wyliczył ile jest w ciągu sekundy impulsów albo minuty .

Szukałem ale nigdzie nie znalazłem coś konkretnego z uwzględnieniem drgania styków...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#2
Drgania styków są dla przycisków, styków mechanicznych, przekaźników, itp. Trwają nawet ponad 100ms, przeciętny człowiek zresztą nie jest w stanie przyciskać szybciej niż 5-10x/s. Czyli albo 500Hz, albo obsługa drgań. Co do przykładów to są tu nawet na forum. Wystarczy obsługa przerwania external interrupt, zbocze narastające, w przerwaniu zwiększana zmienna typu liczbowego uint16_t z dopiskiem volatile, odczytywana i zerowana w pętli głównej co 1s/1minutę.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
Znalazłem taki kod na nie przerywaniach:

Kod:
const int we = A0;

void setup()
{
    Serial.begin(9600);

}

void loop()
{
    Serial.print("Ilosc zliczonych impulsow: ");
    Serial.println(licznik(1000)); // Czas zliczania - 1 sekunda
    delay(2000);
}

// Funkcja zliczająca impulsy w czasie jednej sekundy
long licznik(unsigned int czas)
{
    unsigned int A = 0;
    unsigned int B = 0;
    unsigned long interwal = millis();
    unsigned long iloscImpulsow = 0;
    bool zbocze = false;
    while(millis() - interwal < czas - 10)   // Zliczanie w czasie jednej sekundy
    {
        A = analogRead(we); // Pierwszy pomiar
        delayMicroseconds(10); // Zaczekaj przed drugim pomiarem
        B = analogRead(we); // Drugi pomiar
        if(A < B)   // Zbocze narastające
        {
            zbocze = true;
        }
        if((A > B) && zbocze)   // Zbocze opadające po zboczu narastającym = dodatni impuls
        {
            zbocze = false; // Przestaw flagę zbocza narastającego
            iloscImpulsow++; // Dodaj 1 do licznika impulsów
        }
    }
    return iloscImpulsow; // Zwróc ilość impulsów
}

Zastanawiam się czy był by lepszy od attachinterrupt Cos tam czytałem ze przerywania nie sa wskazane. Nie mam pojęcia co by było lepsze

Doczytałem że dl auno jest specjalny jeden pin do takich celów ale już nie doczytałem o co chodzi i jaki?

Mi chodzi o taki prosty miernik częstotliwości.
Tak sobie pomyślałem jak by to przerobić na pomiar tylko przez 100ms to da mi pomiar powyżej 10Hz dobrze liczę?? Pomiar co 1s to da 900ms na resztę kodu.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#4
Opis obsługi zewnętrznych przerwań i na jakich pinach jest oczywiście na stronie Arduino: https://www.arduino.cc/reference/en/lang...interrupt/. Tu na forum ktoś robił sterownik do autka czy obd II i było tam trochę kodu, poszukaj. Użycie analoga jest raczej bez sensu, 10us to bardzo długo, dobrej jakości sygnał narasta w czasie liczonym w ns. Podłącz sobie 3.3V z płytki do tego analoga, niby stałe napięcie a będzie Ci zliczać impulsy - tętnienie stałego napięcia, szum nie do uniknięcia. Po prostu weź sobie 2 Arduino, jednym generuj zwykłym delay/digitalWrite przebieg i impulsy, przecież łatwo sprawdzić czy generujesz ich 5 ,10 czy 100 w sekundzie i jak drugie Arduino to mierzy.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#5
Powiedz mi czy jak skorzystam z

pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);

Sporo rozjedzie się funkcja millis() ??

Mysle włączac i wyłączac przerywanie co 1s na 100ms..
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#6
Czyli przez 100ms każdej sekundy nie będziesz zliczał millis()? No nie wiem czy da się obliczyć ile się rozjedzie, pewnie będzie z tego ósmy problem milenijny Big Grin. Nie wiem do czego Ci to, ale raczej brniesz w głębokie bagna.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#7
No właśnie wiem że w bagno.... Potrzebuje zmierzyć częstotliwość impulsu pomiar tak co 1s.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#8
No ale po co komplikujesz. Weź jedną atmegę, odpal na niej generowanie 100 impulsów/s zwykłym delay (czy tam co 5000us zmiana stanu pinu 0/1). Na drugiej odpal zliczanie w przerwaniu, wystarczy wychwycić zbocze narastające, przecież mówiłeś, że mierzysz częstotliwość, a nie odtwarzasz PWM mierząc wypełnienie. Co sekundę w pętli loop odczyt do zmiennej pomocniczej, tą z przerwania volatile zeruj i od nowa. Zmienna w przerwaniu na początek globalna volatile uint8_t licznik, w funkcji przerwania licznik++, koniec funkcji; w loop odczyt=licznik; licznik=0;. Odliczyć czas 1s też na początek możesz delay(1000), docelowo z millis lub timerem - będzie to miało sens jak nie będziesz wyłączał przerwań.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#9
No tak tylko ja nie chce odczytywać cały czas ale wtedy jak potrzebuje... Po co ma mi działać przerywanie jak skorzystam tylko raz a przez następne kilka godzin mi jest zbędne.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#10
Nie musi działać cały czas, używasz wtedy: https://www.arduino.cc/reference/en/lang...interrupt/, a potem nawet możesz zrobić od nowa aktywację z zupełnie inną funkcją. Nie musisz nawet tego robić w setup, możesz odpalić kiedy chcesz.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości