Skocz do zawartości

Zakłócenia w HC-SR04


Pomocna odpowiedź

Napisano

Witam.

Buduję swojego pierwszego robota z mikrokontrolerem, którego zasada działania sprowadza się do prostej jazdy na wprost, a po wykryciu przeszkody przez HC-SR04, odpowiedniej orientacji i zmiany kierunku.

Niestety, drogą prostego "debugowania"(wycinania kodu, dochodzenia do momentu, kiedy wszystko działało) przy użyciu UARTu, doszedłem do wniosku, że jeżeli układ działa bez silników(silniki i logika odseparowane są stabilizatorem napięcia), to wszystko jest w porządku. Kiedy natomiast dołączę silniki, jedna na kilka próbek sczytanych z HC-SR04 jest błędna. Co ciekawe, błąd zawiera się w przedziale 900-1020(są to liczby naliczonych impulsów - nie przeliczam na sekundy, bo nie jest mi to potrzebne). Procesor jest taktowany kwarcem 11059200 Hz.

Dołączam oczywiście schemat mojego obwodu:

Czy jest ktoś, kto miał podobny problem? Dodam, że płytka jest już wytrawiona, polutowana(robot praktycznie złożony 🙂 ), więc nie jestem w stanie sobie pozwolić na zbyt duże modyfikacje.

Dziękuję z góry za pomoc, pozdrawiam,
Bartek 🙂

Sytuacja wygląda teraz tak: jeden kondensator 22uF jest bezpośrednio przy wyprowadzeniu pinów na HC-SR04, zwiększyłem kondensator przed stabilizatorem na 470uF oraz dodałem jeden równolegle na wyjściu stabilizatora 100uF.

Niestety, problem dalej występuje, lecz tym razem nawet zakres nie drgnął. 🙁

Kondensatory elektrolityczne mają dość sporą bezwładność (nie wiem jak to poprawnie się nazywa, wybaczcie), więc nadają się tylko do wygładadznia powolnych ale dużych zakłóceń. Żeby pozbyć się tych mniejszych, potrzebujesz kondensatora o mniejszej bezwładności, na przykład ceramicznego. Na szczęście nie musi być taki duży. Najlepiej więc jest mieć parę kondensatorów, jeden elektrolityczny i jeden ceramiczny, równolegle do siebie.

Dalej, istotne jest gdzie fizycznie te kondensatory są podłączone, ponieważ kable także mają swoją pojemność i indukcyjność i jak dasz kondensator na końcu długiego kabla, to dostaniesz układ drgający LC. Zatem kondesatory dajemy blisko tego, co próbujemy zasilić wygładzonym prądem -- w twoim przypadku będzie to sam sensor oraz płytka z mikrokontrolerem.

deshipu, HC-SR04 jest podłączony z moją płytką główną około 20-centymetrowymi przewodami. Mogę w takim razie tę parę kondensatorów umieścić przy złączu na płytce głównej?

Elvis, wykorzystuję jedno przerwanie: Timer2 ustawiony w tryb CTC, służący do sterowania serwem.

Jeżeli chodzi natomiast o sam HC-SR04, moja funkcja odczytująca odległość jest napisana w najprostszy, sekwencyjny sposób(przy projektowaniu płytki nie pomyślałem o tym, żeby wyjście ECHO podłączyć do wejścia INT, więc jestem tutaj ograniczony do bezprzerwaniowej obsługi tego sensora).

A czy podczas odczytu z czujnika wyłączasz przerwanie? Bo jeśli nie, to pamiętaj, że obsługa przerwania zajmuje pewien czas i może wpływać na wynik pomiarów.

Podczas odczytu odległości nie wyłączam tego przerwania, jednak tak jak mówiłem, po podłączeniu zasilania z programatora do układu(czyli de facto silniki nie dostają zasilania, bo stoją przed stabilizatorem), cały układ zachowuje się poprawnie i nie ma żadnych błędnych wskazań.

Tym nie mniej spróbuję, być może jakiś inny tajemniczy czynnik wpływa na układ 😉

Jeśli ten wgrywasz wtedy ten sam program, to nie ma co męczyć przerwań.

Pozostaje jeszcze jedna opcja, czyli filtrowanie wyników. Możesz zwiększyć częstotliwość pomiarów i odrzucać wyniki które mocno odbiegają od średniej (np. filtrem medianowym).

Niestety, problem dalej występuje.

Jeśli ten wgrywasz wtedy ten sam program, to nie ma co męczyć przerwań.

Przepraszam, ale nie zrozumiałem. 😉

Czy takie filtry są trudne do implementacji? Wiąże się to chyba z całkowitą zmianą rozumowania w kodzie, gdyż - jak się domyślam - pomiary muszę wykonywać z dużą częstotliwością, a z nieco mniejszą filtrować je i wtedy oceniać sytuację. Czy tak jest?

Chodziło mi o to, że jeśli dokładnie ten sam program działa poprawnie, to wycofuję moje pomysły z przerwaniami 🙂

Jak chodzi o filtr medianowy, to jest on bardzo prosty - wybierasz środkową wartość z kilku pomiarów. Załóżmy, że wykonujesz 3 pomiary, a jako wynik wybierasz zawsze wartość środkową. Najlepiej byłoby oczywiście wykonywać pomiar 3 razy częściej.

Algorytm mógłby wyglądać np. tak:

a = pomiar_hcsr04();

b = pomiar_hcrs04();

c = pomiar_hcrs04();

if ((a <= b) && (b <= c)) return b;

if ((c <= b) && (b <= a)) return b;

... // pozostałe kombinacje

Oczywiście można to "ładniej" zaimplementować, ale to chyba najprostsza opcja.

  • Pomogłeś! 1

Spróbuję go zastosować i zobaczymy wyniki 🙂

Mam nadzieję tylko, że będzie działał zadowalająco dla małych ilości pomiarów. Dla większej pewnie by działał bardziej prawidłowo, ale byłyby pewnie problemy z algorytmami sortującymi. 😉

deshipu, HC-SR04 jest podłączony z moją płytką główną około 20-centymetrowymi przewodami. Mogę w takim razie tę parę kondensatorów umieścić przy złączu na płytce głównej?

W żadnym wypadku, właśnie o tym pisałem. Przy czujniku, który zasilasz.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...