Rezonancia a távolságmérőben (Kalandozásaim 4)

A harmadik kalandozós bejegyzésben leírtam, hogy a Sparkfun Inventor Kit robotjában a távolság érzékelő nem működött tökéletesen. Hétvégén sikerült a problémának a végére járni.

Unokaöcsémmel kiszkópoltuk, hogy a RedBoard (Arduino UNO klón) 3-as és 11-es pin-jén a PWM frekvenciája majdnem pontosan 500Hz (gyanúm szerint pontosan 16MHz/256/128=488,28Hz). Gyanús volt, hogy a távmérő 40kHz-ét (adatlap szerint) ennek egy felharmonikusa zavarja meg. Ezért kipróbáltuk, hogy a program loggolja a távméréseket, de a motorokat lehúzzuk a vezérlőről, akkor mi történik?

A motorokat lehúzva a műszer helyesen működött, rádugva viszont megzavarodott. Egyértelmű lett tehát, hogy a motoron keresztül kapott zavart a mérő.

Elsőként a PWM frekvencia átállításával próbálkoztunk, ami egyből meg is hozta a megoldást. A PWM-et magasabb - és főleg a 40kHz-t nem osztó - frekvenciára állítva a zavar megszűnt, a játék tökéletesen működött. A lassabb sebesség miatt az eredeti program időzítésein hangolni kellett, de hamar jó lett, és ügyesen keringett a szobában. Ezzel a kisebb sebességgel már tudtak játszani vele a kisebb gyerekek is - menekültek, elé álltak, hancúroztak. A motor divert ellenőriztük, nem melegedett beteges módon ezen a magasabb frekvencián sem.

Azt persze nem fejtettük meg, hogy a rezonancia akusztikusan, vagy esetleg elektromos úton terjed-e át, és hogy pontosan milyen úton, de a problémát megoldottuk. Vettem a fáradtságot, és a Sparkfunnak is írtam belőle egy jelentést, úgyhogy ettől a problémától már nyugodtan alszom.

A fixált kód: https://pastebin.com/1yj5TB7B

A lényeg (a 31,74 kHz-ben már nem vagyok biztos, lehet, hogy a duplája lesz az):

// Set timer2 period to 31,74 kHz - this is the period of the motor drivers - not in interference with 40kHz of the untrasound sensor
TCCR2B = TCCR2B & 0b11111000 | 0b00000001;

Hozzászólások

Mint a Tékozló Homáron írják néhányan: Az a baj, hogy kondenzátor van benne!
No, itt meg az, hogy nincs. ;)

A túl nagy zavarhoz elegendő 10cm (~100nH) vezeték, aminek a végén nincs az árammal arányos szűrés.

- Tegyél egy >10uF/10V kondenzátort a breadboardra az 5V és GND után.
- Ezt követően indulhat az 5V - motor - tranzisztor - GND hurok,
-- minél közelebb a kondenzátorhoz,
-- minél kisebb legyen a hurok felülete!

Elkó helyett sokkal jobb, ha egy kételemű tüskesor rövidebb végére rágányolsz egy MLCC 0805, 10uF/16V/X7R kondenzátort.
Ugyanilyen kondenzátort felraknék az 5V és GND közé az MCU panel hátuljára is.