Pomiar czasu trwania impulsu PWM na Arduino
: środa 02 sty 2019, 19:23
Cześć, chciałem pomierzyć czasy PPM aparatury budując przełącznik 6 pozycyjny. Nie jestem specjalistą od Arduino, więc pytanie co poprawić i czy taki pomiar ma sens. Funkcja micros() dla Nano 16MHz ma dokładność 4uS. Robię 10 pomiarów i wyciągam średnią (w sumie to 11 i pierwszy odrzucany, bo pomiar mógł się zacząć w czasie trwania impulsu).
Wyniki już uśrednione z 10 pomiarów dla mojej aparatury dla kanału kraniec/center/kraniec są w następującym rozrzucie:
1061-1074 / 1487-1495 / 1910-1923
Pytanie czy te pomiary mają sens, czy można coś poprawić, przyspieszyć w kodzie, aby mieć tani miernik szerokości impulsu:
Poniżej program dla pastwienia się. ;)
Edit: Zmiana tytułu + poprawa kodu.
Wyniki już uśrednione z 10 pomiarów dla mojej aparatury dla kanału kraniec/center/kraniec są w następującym rozrzucie:
1061-1074 / 1487-1495 / 1910-1923
Pytanie czy te pomiary mają sens, czy można coś poprawić, przyspieszyć w kodzie, aby mieć tani miernik szerokości impulsu:
Poniżej program dla pastwienia się. ;)
Kod: Zaznacz cały
/*
Miernik PWM
Mierzy czas impulsu PWM kanału RC.
Program dokonuje 11 pomiarów (pierwszy odrzuca,
bo pomiar mógł się zacząć, gdy impuls już trwał)
i wyświetla pozostałe 10 na serial monitorze.
*/
// Ustaw pin do odczytu
const int PinOdczyt = 2;
// deklaracja zmiennych:
int PPM[11]; //tabela na 11 pomiarów
int czas1, czas2, j=0;
int StanPinu = HIGH;
void setup() {
Serial.begin(9600);
// initializacja pinu odczytu jako input:
pinMode(PinOdczyt, INPUT);
}
void loop(){
if (StanPinu == LOW && digitalRead(PinOdczyt) == HIGH) {
//Czyli stan był niski a pojawił sie wysoki
czas1 = micros(); //odczytaj czas
// odczytaj stan pinu
StanPinu = digitalRead(PinOdczyt);
}
else
if (StanPinu == HIGH && digitalRead(PinOdczyt) == LOW) {
// czyli impuls się skończył
czas2 = micros(); //odczytaj czas
// oblicz czas impulsu
PPM[j] = czas2 - czas1; //oblicz czas impulsu
// odczytaj stan pinu
StanPinu = digitalRead(PinOdczyt);
j++;
}
//wyświetlaj czasy
if (j==11) {
for (byte i=1; i<=10; i++){
Serial.print(F("Pomiar "));Serial.print(i);Serial.print(F(" : "));Serial.println(PPM[i]);
j=0;
}
//Wyświetl wartość średnią:
Serial.print(F("Pomiar sredni : "));Serial.println((PPM[1]+PPM[2]+PPM[3]+PPM[4]+PPM[5]+PPM[6]+PPM[7]+PPM[8]+PPM[9]+PPM[10])/10);
}
}