Arduino odczytuje wartość cyklu roboczego PWM z wejściem (analogowym / cyfrowym)

Pracuję nad porównaniem autopilotów, takich jak Ardupilot , CC3D , KK2.1.5 . Porównanie dotyczy reakcji / zachowań systemu, jakie wywołuje podczas lotu. W tym celu muszę odczytać wartości cyklu pracy PWM (podobnie jak osilaskopy – częstotliwość PWM może zmieniać się od 50 do 430 Hz) z karty autopilota. Istnieją 4 PWM z wejściami poleceń i 4 PWM sterujące esc dla typowego quadrotora. Muszę odczytać 8 wartości cyklu pracy za pomocą pinów wejścia cyfrowego / analogowego. Jak zmierzyć cykl pracy 8 sygnałów PWM? Czy pomiar cyfrowy lub analogowy jest dokładny i szybszy?

Uwaga na temat polecenia attachInterrupt : Według arduino.cc seria AtMega328 ma 2 przerwania , Seria Arduino ATmega 2560 ma 7 przerwań.

Odpowiedź

Kod pokazany w mojej odpowiedzi na pytanie 18183 , „Odczytaj kanały odbiornika RC za pomocą Interrupt zamiast PulseIn ”. Ta odpowiedź ma kod do odczytu czterech kanałów RC PWM. Można go łatwo przystosować do pracy z ośmioma kanałami. Posiada ISR, który działa po zmianie wybranych pinów. Sortuje, które kanały się zmieniły, i zapisuje wartość micros() przy każdej zmianie.

Zobacz także moja odpowiedź na pytanie 19106 , „Czy zewnętrzne przerwania mogą być LUB” razem na „328 (Uno)?” Ta odpowiedź zawiera szkic generowania odpowiedniego kodu ISR. Moja odpowiedź na pytanie 32572 , „Jak wykryć kierunek enkodera obrotowego?”, przedstawia inny przykład.

Wejście cyfrowe, jako użyty w powyższym kodzie, zajmuje mikrosekundę dziesięć mikrosekund w ISR. Jak zauważono w komentarzu Dannyfa, rozwinięcie pętli for i (jeśli to możliwe) użycie stałych zamiast zmiennych może skrócić czas w ISR do 3,4 μs. Uwaga: wejście i wyjście ISR nadal dodaj kilka mikrosekund.

Z drugiej strony, 10-bitowe wejście analogowe zajmie około 104 mikrosekund na odczyt, czas porównywalny z niektórymi szerokościami impulsów, które będziesz mierzyć. Nie jest więc wystarczająco szybki. Jeśli obniżona dokładność ADC jest akceptowalna, zmniejszenie współczynnika skali zegara ADC, jak wyjaśniono na stronie internetowej w microsmart.co.za , może skrócić czas konwersji AD do 20 μs. To około trzy razy dłużej niż wejście cyfrowe, więc raczej wolno.

Komentarze

  • > trwa poniżej mikrosekundy w ISR, wydaje mi się to mało prawdopodobne. Oczywiście ' nie jestem pewien, o których fragmentach kodu mówisz – ponieważ jest ich trzech. ale ich przypadkowe spojrzenie sugeruje, że wykonanie korpusu ISR zajmie więcej niż 16 tyknięć – nie licząc narzutu. W rzeczywistości mały ptaszek powiedział, że zbliż się do 8us, aby wykonać je na Uno, 🙂
  • @dannyf, kiedy to napisałem, patrzyłem na jeden z prostszych ISRów (liczenie pojedynczego kodera), więc będę musiał edytować odpowiedź z poprawną czas. Przepraszamy!
  • nie ma problemu. dwie sugestie: 1) rozwiń pętlę while; 2) używaj stałych zamiast zmiennych. a także uczyniłbym rcOld statycznym wewnątrz ISR, aby kod był bardziej modułowy. dzięki temu czas wykonania spadł do 3.4us.
  • Czy możesz udostępniać swój kod zamiast linków. Ponadto seria AtMega328 ma 2 przerwań, seria Arduino ATmega 2560 ma 7 przerwań. Jak więc mogę zmierzyć 8 jednoczesnych sygnałów PWM? arduino.cc/en/Reference/attachInterrupt
  • @acs, ATmega328 ' s mają 26 różnych wektorów przerwań. Wektory używane w przywoływanym kodzie służą do przerwań zmiany pinów lub PCINT, które używają 3 z tych wektorów. PCINT są dostępne na 22 pinach Nano opartych na ATmega328 i podobną liczbę na Uno ' s. Zapoznaj się z kodem przedstawionym w poprzednich pytaniach – w tej chwili mam do dotrzymania terminy pracy.

Odpowiedź

jeśli zrobiono analogowo, przepuść pwm przez lpf i wykonaj adc na wyjściu;

jeśli zrobisz to cyfrowo, użyj funkcji przechwytywania timera lub użyj zewnętrznego przerwania / przerwania zmiany pinów aby uchwycić czas poza podstawą czasu.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *