Liczba postów: 868
Liczba wątków: 19
Dołączył: Jun 2018
Reputacja:
42
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ą.
Liczba postów: 2,364
Liczba wątków: 0
Dołączył: Oct 2017
Reputacja:
240
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ę.
Liczba postów: 868
Liczba wątków: 19
Dołączył: Jun 2018
Reputacja:
42
27-03-2019, 06:47
(Ten post był ostatnio modyfikowany: 27-03-2019, 10:50 przez Jarewa0606.)
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ą.
Liczba postów: 868
Liczba wątków: 19
Dołączył: Jun 2018
Reputacja:
42
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ą.
Liczba postów: 868
Liczba wątków: 19
Dołączył: Jun 2018
Reputacja:
42
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ą.
Liczba postów: 2,364
Liczba wątków: 0
Dołączył: Oct 2017
Reputacja:
240
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ń.
Liczba postów: 868
Liczba wątków: 19
Dołączył: Jun 2018
Reputacja:
42
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ą.