Licznik impulsów Arduino. ATmega

Licznik impulsów Arduino. ATmega

24.06.2023

Zaimplementowano sygnał PWM 25 kHz. Nie mam oscyloskopu, ale chcę sprawdzić wynik. Wykonujemy licznik impulsów, sprawdzamy pracę.

Zadanie

Na bazie ATmega 328P zaimplementuj licznik impulsów, aby to sprawdzić PWM 25 kHz, nie jest wymagana dokładność pomiaru impulsu, ale musi być znana kolejność.

Rozwiązanie

Logika rozwiązania jest prosta, śledzimy impulsy, o które zwiększamy zmienną globalną na sekundę. Skumulowana wartość będzie częstotliwością przychodzącego sygnału.

Do odczytu impulsów wykorzystamy przerwania zewnętrzne, są one opisane na stronach 87-96 dokumentacja od producenta. W Atmegę 328P istnieją dwa wejścia, za pomocą których możemy monitorować przerwania zewnętrzne INT0(PD2) I INT1(PD3), aby rozwiązać problem, używamy INT0.

Konfigurowanie przerwań zewnętrznych

Pierwszym krokiem jest konfiguracja portu D jako wejście i żeby uniknąć zakłóceń podłączę rezystor podciągający.

Aby określić, które zdarzenia wywołają procedurę obsługi przerwań, należy skonfigurować rejestr ERYKA. bity ISC00 I ISC01 odpowiedzialny za INT0, A ISC10 I ISC11 za INT1. Ustawienie monitorowanych zdarzeń jest identyczne, z różnicą w bitach:

00 - Niski poziom sygnału;
01 — Jakakolwiek zmiana sygnału logicznego;
10 — Zbocze opadające sygnału;
11 — Zbocze narastające sygnału.

Rejestr służy do bezpośredniego włączania wejść przerwań. EIMSK, bity INT0 I INT1 odpowiadają za wyjścia o tej samej nazwie. Kod piszemy według powyższego

Void int0_initial(void) ( DDRD = 0x00; // Port D jako wejście PORTD = (1<< 2); // Включение подтягивающего регистра EICRA = (1 << ISC00) | (1 << ISC01); // Восходящий фронт сигнала EIMSK = (1 << INT0); // Включение входа прерывания sei(); // Разрешаем прерывания }

Obsługa przerwań zewnętrznych

Przerwania zostały skonfigurowane, teraz musimy je przetworzyć. Służy do tego procedura obsługi przerwań. ISR(), który w moim przypadku musi określić typ przerwania INT0_vect. W funkcji będziemy zwiększać zmienną Liczba tików:

ISR(INT0_vect) ( Tic_Count ++; )

Wynik wyjściowy

Aby ułatwić wyprowadzenie wyniku i nie zepsuć wyświetlacza, użyłem nieczystego ATmega 328P, A Arduino UNO I Arduino NANO, na pokładzie którego ten sam MK.

Jak pisałem wyżej dokładność pomiarów nie jest aż tak istotna dlatego nie będę ustawiał timerów tylko po prostu w pętli głównej raz na sekundę będę wyświetlał skumulowaną wartość zmiennej Liczba tików i zresetuj go. Na czas tych akcji przestaję przetwarzać przerwania.

Poniżej znajduje się pełny kod umożliwiający rozwiązanie problemu z komentarzami:

#zdefiniuj F_CPU 1600000UL #include #włączać volatile unsigned int Tic_Count = 0; // Obsługa przerwań zewnętrznych INT0 ISR(INT0_vect) ( Tic_Count ++; ) void setup() ( int0_initial(); Serial.begin(9600); ) void pętli() ( cli(); // Wyłącz przerwania Serial.println( Tic_Count); Tic_Count = 0; sei(); // Włącz przerwania opóźnienia (1000); ) void int0_initial(void) ( DDRD = 0x00; // Port D jako wejście PORTD = (1<< 2); // Включение подтягивающего регистра EICRA = (1 << ISC00) | (1 << ISC01); // Восходящий фронт сигнала EIMSK = (1 << INT0); // Включение входа прерывания sei(); // Разрешаем прерывания }

Teraz pozostaje podłączyć sygnał PWM do pinu PD2 i otworzyć monitor portu szeregowego. Możesz także wygenerować i sprawdzić sygnał na jednym MK.

Wyświetlane odczyty są w przybliżeniu równe wcześniej obliczonej częstotliwości, należy spodziewać się niewielkich różnic ze względu na implementację. Aby uzyskać dokładny pomiar, prawdopodobnie bardziej poprawne będzie zliczenie czasu pomiędzy impulsami i obliczenie na tej podstawie częstotliwości.

W tym artykule znajdują się wszystkie dane dotyczące licznika energii elektrycznej opartego na Arduino, w tym schematy, oprogramowanie sprzętowe, komentarze dotyczące rewizji aktualnej wersji oprogramowania i projektu.

Tak to wygląda w ostatecznym rozrachunku.

Początkowo wszystkie informacje podzieliłem na duży stos małych artykułów - co bardzo utrudniało ich wyszukiwanie i w ogóle powtarzanie tego urządzenia. Ten artykuł koryguje tę sytuację.

Część 1. Pomysł, projekt i myślenie na głos.

Jakiś czas temu zainstalowałem dwustrefowy licznik energii elektrycznej, aby skorzystać z lepszej stawki nocnej (50% od 23:00 do 08:00). Okazało się, że w nocy zużywamy 45% prądu. Odpowiedzią jest jednak to, jak konsumpcja zachodzi w kontekście miejsc konsumpcji. Oczywiście, że to urządzenie tego nie robi.

Zaistniała zatem potrzeba bardziej szczegółowej prezentacji danych dotyczących zużycia. Początkowo zdecydowano się na wykonanie urządzenia pokazującego następujące dane:

  1. Aktualna moc obciążenia
  2. Konsumpcja od początku dnia
  3. Konsumpcja od początku miesiąca
  4. Procent nocnego zużycia w %

Urządzenie musi także przesyłać na konfigurowalny adres internetowy dane dotyczące zużycia energii z ostatnich 24 godzin w postaci 24 odczytów. Interwał transmisji — ustawiany w minutach 1…120.

Parametry ustawiane w menu:

  1. Godzina w RTC
  2. Minuta w RTC
  3. Dzień w RTC
  4. Miesiąc w RTC
  5. Rok w RTC
  6. Interwał zliczania 1…120
  7. adres sieciowy wskazujący znaki pozycyjne: „a-z0-9_-/:” Edytowany znak musi być podświetlony, aby było jasne, co jest edytowane.

Początkowa wersja urządzenia zostanie wykonana w oparciu o następujący zestaw modułów:

  1. (wyjaśnienia dotyczące podłączenia wskaźnika do mega 2560)

Urządzenie jest interesujące, aby wyjaśnić, ile zużywa warsztat, urządzenia multimedialne, przybory kuchenne. W rezultacie musisz uzyskać dane w postaci wykresów, w Internecie lub na serwerze sieci lokalnej ()

Wstępny schemat podłączenia węzła pomiarowego.

Pożyczyłem schemat pomiaru mocy i napięcia. Pod uwagę brana jest moc średnia, a nie tylko wiele innych parametrów, takich jak częstotliwość, współczynnik mocy. Najpierw musisz złożyć taki mały stojak do pomiaru.

Biorę płytkę stykową, szukam odpowiedniego transformatora do pomiaru napięcia (biorę z dyżurki ATX) i ruszam dalej.

UPD. Jednostka miary

Część 2.1 Uwagi na temat niesamowitych funkcji ENC28J60

Niesamowita rzecz. Dzisiaj zacząłem grzebać w module do pracy z ezernetem, do projektu "licznik". Kto by wątpił, było fajnie i ostatecznie wszystko się udało.

Przez połączenie. Szukamy, gdzie znaleźć interfejs SPI z Arduino „Mega”, cóż, lub Twój. Łączymy. Zawieszamy wyjście CS (wybór chipa) w dowolnym miejscu, a następnie ustawiamy je osobno podczas inicjalizacji biblioteki. „Zawiesiłem” go na 42. pinzie, Ty możesz mieć jakiś inny. Pozostałe MOSI/MISO/SS/OV/3,3V podłączamy do odpowiednich pinów Arduino.

Okazało się, że aby zmniejszyć zużycie pamięci, twórca „wspaniałej” biblioteki EtherCard zdecydował się i wysłał do pamięci programu kilka ciągów znaków żądania GET. To znaczy, wyobraźmy sobie, że niezależny programista nagle postanowił zostać licznikiem. Aby wszystko było mądrzejsze, zdecydował się edytować linię adresu URL, do której przesyłane są dane. A nawet dzisiaj to zrobiłem:

I tak łączy bibliotekę i myśli, że teraz bez problemu złoży zapytanie do zewnętrznego serwera. Nie. W końcu ustawił serwer jako ciąg znaków. Ciąg znaków niestety nie jest pamięcią programu. Architektura Harvardu. Wszystko jest podzielone.

Nic, szybko wdrapałem się do biblioteki, odnalazłem miejsce, w którym prośba została wypełniona, zniekształciłem ją, zabrałem oczywiście wszystkie „dodatki” moim zdaniem. Ostatecznie wszystko działa świetnie.

Załączam bibliotekę i przykład pracy z serwerem obsługującym ciągi znaków. i nie tylko dla wartości niezmienialnych w programie. Wraz z przykładem -

W trakcie projektu pozostaje tylko rozwiązać problem z częścią pomiarową, wszystko inne zostało już rozwiązane. Najtrudniejszą rzeczą w programie była edycja ciągu URL.

Funkcja połączenia to tylko DHCP, nie będę wykonywać zadań związanych ze statycznym adresem IP i wyborem, wszystko działa całkiem poprawnie i nie ma potrzeby dodawania funkcjonalności, której nie potrzebuję.

Część 3. Wstępne debugowanie oprogramowania licznika

Dziś pobawiłem się trochę przy debugowaniu oprogramowania licznika. Fakt jest taki, że przez pomyłkę nie zamontowałem rezystora obniżającego, do czujnika CT przedostało się zbyt duże napięcie i w rezultacie na wejście przedostało się zbyt dużo szumu. Poprawione, wlutowane 150 omów równolegle do czujnika ST, ogólnie wyszło około 100 omów.

Musiałem lekko poprawić współczynniki w programie.Dostosowałem...według chińskiego licznika. Następnie na woltomierzu. Mam to tak blisko, jak to możliwe.

W efekcie pomiar zużycia EH do zagotowania czajnika pokazał to samo co na chińskim watomierzu. Już jest dobrze, ale będę musiał jakoś sprawdzić na głównym ladzie.

Litera h po kW nie zmieściła się na wyświetlaczu, ale należy rozumieć, że jest. Liczba pokazuje zużycie od początku bieżącej godziny. Po upływie godziny jest wysyłany na serwer i resetowany do zera. Wtedy prawdopodobnie będę go resetował raz dziennie.

Oprogramowanie licznikowe w obecnej formie -

Część 4. Wykonanie pierwszej części korpusu

Zrobiłem dziś etui, materiał ten sam co ostatnim razem - kaprolon 11 mm. Mocowanie odbywa się na śrubach imbusowych M4, ostatnim razem wszędzie było M3. Jest za słaby dla organizmu.

Aby uzyskać skalę, włóż „powietrze” myszy do środka.

Pozostaje zrobić panel przedni, zamocować moduły, wykonać frezowanie pod USB i zasilanie 12V. W przypadku tego urządzenia prawdopodobnie wystarczy 0,7A, czyli da się zastosować coś niewielkich rozmiarów.

Część 5 Wykonanie panelu przedniego

Część 9. Zaktualizowane oprogramowanie na podstawie wyników pracy urządzenia

Podczas operacji trwającej około miesiąca doszedłem do wniosku, że należy doliczyć transfer aktualnie pobieranej mocy, pierwszego dnia miesiąca. Ponadto przeniosłem zbierający serwer WWW do mojej podsieci i przestałem przesyłać dane na zewnątrz. Bo niektórym się nie udało. Tym samym wzrosła niezawodność gromadzenia danych.No cóż, właściwie oto najnowsze oprogramowanie - .

Aktualizacja 23.09.2015. Dzisiaj napisałem interfejs do przeglądania danych z monitoringu. Jednocześnie zoptymalizowałem oprogramowanie, znalazłem w nim błędy. Podniosłem wewnętrzny serwer DNS, na „” to kwestia minut.

Właśnie pokazałem ostatnie 48 godzin (straciłem statystyki, więc jest ich mniej na wykresie) w formie wygładzonego wykresu. Splash to początek pralki, według U – cena w hrywienach za aktualną godzinę, biorąc oczywiście pod uwagę stawkę za noc. Do X — data/godzina.

Teraz możemy przyjrzeć się temu, co się dzieje. Mały niuans - umieściłem wszystko w sieci domowej, dla większej stabilności.

Pisałem już wcześniej, że wypróbowałem jeden standardowy program do pokazania zużycia elektryków (emoncms). Nie rozumiem paradygmatu i podejścia. Tam co trzy sekundy wysyła dane do serwera i coś pokazuje. Ja zrobiłem to inaczej – urządzenie gromadzi dane przez 1 godzinę, następnie wysyła je z ostatnich 24 godzin. Serwer WWW nie działa, jest to serwer NAS o niskim poborze mocy.

UPD. Okazało się, że to nie jest Internet, który mam, to urządzenie czasami nie przesyła danych. Nie wiadomo z czym się to wiąże i ciężko to wyłapać, więc poszedłem w drugą stronę - wyliczając odczyty pośrednie na podstawie aktualnego zużycia. Przez jeden dzień gdzieś 1-2 razy pojawia się awaria. Ten schemat pozwala odmówić przechowywania danych godzinowych w swojej branży, co również z jakiegoś powodu nie działa całkiem poprawnie.

UPD. Ukończono oprogramowanie dla witryny pokazującej dane. Teraz jest napięcie według wydatków godzinowych, godzinowych i dziennych.

Zastanawiam się nad hostingiem oprogramowania na githubie. Może. tak będzie.

Nie, ten artykuł nie dotyczy innego sposobu na oszukanie tego nieszczęsnego urządzenia. Oto jak za pomocą Arduino i LabView zamienić licznik energii elektrycznej w monitor mocy, a nawet amperomierz!


Pierwszym licznikiem energii elektrycznej była indukcja. Zasada jego działania jest śmiesznie prosta – tak naprawdę jest to silnik elektryczny, którego wirnikiem jest aluminiowy dysk obracający tarczę. Im większy prąd pobiera, tym szybciej dysk się obraca. Urządzenie jest czysto analogowe.

Jednak dziś mierniki indukcyjne tracą na popularności, ustępując miejsca ich tańszym elektronicznym odpowiednikom. I tylko jeden z nich stanie się eksperymentalny:

Zasada działania nie uległa większym zmianom – w tym przypadku dysk zastąpiono elektroniką, która generuje impulsy w zależności od ilości pobieranego prądu. Z reguły w większości urządzeń impulsy te są sygnalizowane za pomocą wskaźnika LED. Odpowiednio, im szybciej miga to światło, tym cenniejsze kW jest spalane.
Ponadto na panelu przednim dowolnego urządzenia znajduje się licznik A- liczba impulsów na 1 kWh. Jak widać na zdjęciu, eksperymentalne A = 12800. Na podstawie tych informacji można wyciągnąć następujące wnioski:

Przy każdym impulsie licznik rejestruje zużycie równe 1/12800 1 kWh. Jeśli włączysz obciążenie do licznika i zaczniesz po prostu zliczać impulsy, łatwo będzie uzyskać ilość zużytej przez niego energii elektrycznej (kWh), dzieląc liczbę impulsów przez przełożenie skrzyni biegów.

Ponieważ wskaźnik zmienia prędkość migania, można wywnioskować zależność pomiędzy mocą (kW) a czasem trwania impulsu jednego metra, co pozwoli uzyskać dane dotyczące mocy/prądu.
Nie będziemy ładować artykułu obliczeniami, ale jeśli to konieczne, to

tutaj są

Naprawdę przełożenie licznika jest świetną rzeczą, ponieważ wiedząc o tym, możesz wyrazić zarówno moc, jak i prąd:
Zróbmy proporcję z naszego przełożenia (A=12800 imp/kW*h) i nieznanego przełożenia, które będzie przy obciążeniu X i podczas jednego impulsu (miganie lampki):

Tutaj X jest nieznaną mocą, a t jest czasem jednego impulsu. Stąd wyrażamy nieznaną moc i oto ona:

Prąd oblicza się na podstawie następującej proporcji przełożeń przekładni oraz znanych i nieznanych prądów przy obciążeniu X.:


Co ogólnie prowadzi do identycznego wzoru, ale dla prądu (prąd jest mierzony w amperach, a wskaźniki oznaczają obciążenie, przy którym ten prąd będzie):

Tutaj widać pułapkę - musisz znać prąd przy idealnym obciążeniu 1 kW. Jeśli potrzebna jest dobra dokładność, lepiej zmierzyć ją samodzielnie, a jeśli nie, można ją w przybliżeniu obliczyć za pomocą wzoru (znane jest napięcie i moc), ale będzie to bardziej przybliżone, ponieważ współczynnik mocy nie jest brany pod uwagę konto.


Wszystko sprowadza się zatem do pomiaru czasu trwania jednego impulsu (migania wskaźnika). W swoich badaniach opierałem się na tym znakomitym projekcie. Pewien Włoch stworzył interfejs do monitorowania mocy w środowisku Labview i wymyślił obwód do pomiaru impulsów. Ale w jego projekcie była ogromna wada - nadawał się tylko do liczników o przełożeniu 1000 imp / kWh.

Górny wykres przedstawia średnią moc w ciągu 5 minut, dolny wykres przedstawia czas rzeczywisty. Interfejs jest dość elastyczny i można go łatwo modyfikować w zależności od potrzeb. Jeżeli nie miałeś jeszcze styczności ze środowiskiem LabView to polecam się zapoznać.

Aby wszystko zadziałało, okazało się, że wystarczy wprowadzić do algorytmu programu jeden pojedynczy blok, zgodnie z powyższym wzorem.

To wygląda tak


Wydawałoby się to proste, ale zanim to nastąpi, musisz jeszcze o tym pomyśleć!

Jeśli więc nadal decydujesz się na wdrożenie monitorowania mocy, istnieją dwie opcje:

1. Twoja lada jest zamknięta i zapieczętowana najlepiej jak potrafisz. Oznacza to, że impulsy można odczytać jedynie za pomocą fotorezystora reagującego na mrugnięcie żarówki. Należy go przymocować niebieską taśmą izolacyjną naprzeciwko wskaźnika LED na przednim panelu licznika.
Schemat będzie wyglądał następująco:

Schemat bezkontaktowego odbioru impulsów


Program po prostu porównuje wartość rezystancji na fotorezystorze i potencjometrze. Co więcej, ta ostatnia pozwala ustawić czułość takiego czujnika, aby uniknąć fałszywych alarmów i dostosować się do jasności wskaźnika.

2. Masz dostęp do wyjścia impulsowego licznika. Wiele modeli ma wyjście impulsowe, które powiela mrugnięcie ukochanej osoby. Odbywa się to w celu umożliwienia podłączenia urządzenia do zautomatyzowanego systemu księgowego. Jest to tranzystor, który otwiera się, gdy kontrolka jest włączona i zamyka się, gdy jest wyłączona. Podłączenie bezpośrednio do niego nie jest trudne - wymaga tylko jednego rezystora podciągającego. Zanim jednak to zrobisz upewnij się, że jest to wyjście impulsowe, a nie coś innego! (w paszporcie zawsze jest schemat)

Schemat podłączenia do wyjścia telemetrycznego


W moim przypadku dostęp jest pełny, więc nie przejmowałem się zbytnio. Zainstaluj LabView i rozpocznij pomiary! Wszystkie wykresy przedstawiają moc (W) w czasie rzeczywistym.
Jako pierwszy rozdano dzbanek do herbaty, który cierpliwie cierpiał. Czapka mówi, że ma moc 2,2 kW, ale sądząc po harmonogramie, regularnie zużywa tylko 1700 watów. Należy pamiętać, że zużycie jest mniej więcej stałe w czasie. Oznacza to, że element grzejny (najprawdopodobniej nichrom) podczas całego procesu gotowania zmienia swój opór w bardzo niewielkim stopniu.

Pistolet do klejenia to zupełnie inna sprawa – deklarowana moc to 20 W. Zachowuje się zgodnie z prawami fizyki – po podgrzaniu opór grzałki wzrasta, a prąd odpowiednio maleje. Sprawdzałem multimetrem i jest wszystko.

Stary odbiornik radiowy „Wiosna”. Tutaj wykres poszedł w górę na początku ze względu na to, że rozpocząłem pomiar w trakcie impulsu i odpowiednio to wpłynęło na dane. Slajdy na wykresie pokazują, jak kręciłem gałką siły głosu. Im głośniej - tym więcej radio zjada.

Perforator o deklarowanej mocy 700 watów. Wcisnąłem przycisk do końca, odczekałem chwilę i puściłem, ale nie płynnie. Wykres wyraźnie pokazuje prąd rozruchowy podczas uruchamiania silnika. Dlatego światło mruga, gdy dobry sąsiad zaczyna walić w ukochaną ścianę.

A teraz najciekawsze. Zrobiłem mały eksperyment na moim starym laptopie, którego efekt pokazano na obrazku:

Pomarańczowa kropka oznacza czas, w którym uruchomiłem kilka „ciężkich” programów na raz. Jak widać wykresy obciążenia procesora i zwiększone zużycie mają ze sobą coś wspólnego. Niedawno był

Do dodatkowego zadania

Schemat obwodu

Schemat na płytce stykowej

notatka

    W tym eksperymencie po raz pierwszy używamy układu scalonego, w tym przypadku wyjściowego rejestru przesuwnego 74HC595. Mikroukłady są przydatne, ponieważ pozwalają rozwiązać konkretny problem bez każdorazowego montażu standardowego obwodu.

    Wyjściowy rejestr przesuwny daje nam możliwość „zapisywania” wyjść cyfrowych, używając tylko 3 zamiast 8. Kaskada rejestrów pozwoliłaby na 16 i tak dalej. sygnały przez te same trzy piny.

    Przed użyciem mikroukładu należy dokładnie przestudiować schemat jego połączenia w arkuszu danych. Aby zrozumieć, gdzie policzyć nogi mikroukładu, mają one półkoliste wycięcie po jednej stronie. Jeśli ustawimy nasze 74HC595 wycięciem po lewej stronie, to dolny rząd będzie miał nóżki 1-8, a górny rząd 16-9.

    Na schemacie naszego eksperymentu nogi są ułożone w innej kolejności, aby nie było zamieszania w połączeniach. Przypisanie pinów zgodnie z arkuszem danych jest podpisane wewnątrz obrazu mikroukładu, numery nóg znajdują się na zewnątrz.

    Przypomnijmy, że na obrazie wskaźnika siedmiosegmentowego podpisane są numery jego nóg i ich zgodność z segmentami.

Naszkicować

Aby przenieść część danych, które będą dalej przesyłane przez rejestr przesuwny, musimy przyłożyć stan LOW do zatrzasku (wejście ST cp mikroukładu), następnie przesłać dane, a następnie wysłać WYSOKI do zatrzasku , po czym przesyłana jest kombinacja wysokich i niskich poziomów sygnału.

Do przesyłania danych użyliśmy funkcji shiftOut(dataPin, clockPin, bitOrder, value). Funkcja nic nie zwraca, a jako parametry należy ją podać

  • Pin Arduino, który jest podłączony do wejścia DS mikroukładu (pin danych),

3

Można to zrobić nie tylko bez obsługi przerwań, ale można to zrobić przy niewielkiej ilości oprogramowania lub bez niego i poradzić sobie z szybszymi impulsami, które są możliwe przy odpytywaniu oprogramowania lub zliczaniu przerwań.

Atmel AVR, że większość Arduino opiera się na sprzęcie licznika/zegara, który zlicza impuls bezpośrednio na pinie wejściowym. Wszystko, co musisz zrobić, to skonfigurować sprzęt licznika i odczytać rejestr licznika. W przypadku liczników 16-bitowych na urządzeniu 8-bitowym występuje niewielka komplikacja, ale można ją łatwo pokonać. Arduino domyślnie ustawia timery dla operacji PWM, ale można to zmienić zgodnie z opisem (szczegóły w instrukcji obsługi AVR) - musisz użyć timera/licznika w trybie CTC.

ARM oparty na Arduninos i prawie każdy inny mikrokontroler będzie miał podobny sprzęt; niektóre są bardziej elastyczne, dzięki czemu można używać pinów do liczenia sprzętu.

Na AVR masz liczniki 8 i 16 bitowe, jeśli potrzebujesz dużych zliczeń, być może będziesz musiał obsłużyć przerwanie przepełnienia. Jeśli regularnie sprawdzasz licznik, możesz sobie z tym poradzić bez przerwy, będąc w stanie odpytywać ze znacznie wolniejszą i prawdopodobnie nieokresową częstotliwością niż częstotliwość impulsów wejściowych, po prostu odpytując flagę przepełnienia przed następnym przepełnieniem.

W Twoim przypadku prawdopodobnie będziesz musiał odczytać liczbę impulsów w regularnym okresie, czyli krótszym niż czas przepełnienia licznika przy maksymalnej oczekiwanej częstości tętna. Na przykład, jeśli używasz licznika 8-bitowego, a maksymalne tętno wynosi 1 kHz, musisz odpytywać co 256/1000 sekund lub mniej, ale największą dokładność można uzyskać, wydłużając ten okres tak długo, jak to możliwe . Na przykład możesz mieć coś takiego (to nie jest prawdziwy kod, tylko fragment):

For(;;) ( opóźnienieMS(250) ; częstotliwość = 4 * readCounter() ; )

Alternatywa, która zapewni bardziej liniową odpowiedź, ale niedeterministyczną liczbę, będzie badać przepełnienia i mierzyć czas potrzebny do zliczenia ustalonej liczby impulsów, a zatem zdefiniować pomiar od czasu dla ustalonego zliczenia, a nie do liczyć w ustalonym czasie.

For(;;) ( int start = getMillisec() ; while(!counterOVF()) ( // Nic nie rób (lub coś przydatnego, ale szybko) ) int t = getMillisec() - start ; częstotliwość = 256 * t/1000 ; )

0

Dziękuję bardzo za pytanie. Jeśli dobrze rozumiem, twoim pierwszym pomysłem jest wyłączenie impulsów sprzętowo, a drugim cały czas, gdy procesor jest zajęty. Problem polega na tym, że mój mikrokontroler jest w pełni obciążony (więc prosty ISR zwiększający zmienną licznika nie zadziała) i nie można go odpytywać, ponieważ musi wykonywać inne zadania.Ponadto nie mam już liczników sprzętowych. Czy są inne alternatywy? Słyszałem, że jest to możliwe przy wykorzystaniu portów analogowych (polegając na podobieństwie do PWM). Dziękuję bardzo - manattatta 28 sierpnia 14 2014-08-28 08:16:36

0

W obu przypadkach licznik sprzętu zlicza, w drugim przykładzie moja ankieta sprawdza flagę przepełnienia, ale to tylko dla zademonstrowania zasady, nie jest to decyzja fundamentalna; może to być również moduł obsługi przerwań - zaletą jest to, że otrzymujesz jedno przerwanie na każde 256 impulsów (zakładając 8 bitów licznika), a nie na każdy impuls, więc narzut przerwania jest znacznie niższy. - Clifforda 28 sierpnia 14 2014-08-28 11:10:07

0

Możesz użyć wejścia analogowego tylko wtedy, gdy wyjście czujnika ma stałą częstotliwość PWM (i dodałeś odpowiednie filtrowanie analogowe z odcięciem nieco poniżej tej częstotliwości), ale twoje pytanie sugeruje, że jest to częstotliwość zmienna, a nie PWM (w przeciwnym razie jak by to było liczenie impulsów pomogło?). -



© 2023 globusks.ru - Naprawa i konserwacja samochodów dla początkujących