Pertama, cepat samping. Anda tampaknya memiliki sedikit kesalahpahaman tentang cara kerja servos. Servo tidak dikendalikan oleh PWM, dan mereka tidak tahu atau peduli bahwa Anda mengirim pulsa pada 49. apa pun Hz. Mereka tidak tahu denyut nadi adalah persentase dari beberapa periode yang sewenang-wenang. Servo tidak peduli berapa waktu antara pulsa. Saya mengatakan ini karena Anda tampaknya berfokus luar biasa pada hal-hal yang sebenarnya tidak penting.
Servo bahkan tidak benar-benar tahu atau peduli bahwa tegangannya tinggi atau rendah pada waktu tertentu. Mereka hanya peduli pada satu hal: waktu antara sisi naik dan turun.
Servo dikendalikan dengan mendeteksi tepi tegangan naik, dan mengukur waktu sampai ada tepi jatuh. Waktu yang valid biasanya antara 1,0 hingga 2,0 ms, tetapi dapat bervariasi dari satu servo ke servo.
Anda dapat mengontrolnya di 1Hz, 10Hz, 50Hz, 100Hz. Sebagian besar akan merespons tingkat denyut nadi yang lebih tinggi, tetapi sekali lagi ini adalah variabel. Apa yang saya coba katakan adalah bahwa frekuensi, siklus tugas, durasi antara pulsa, semua tidak bisa kurang relevan dengan masalah Anda, yaitu bahwa servo tidak merespons ketika Anda mengharapkannya.
Satu-satunya hal yang relevan adalah tepi denyut nadi Anda, yang belum Anda perhatikan. Jika Anda ingin mencari tahu hal ini, silakan mulai dengan melihat hal-hal yang penting, berikan tangkapan dekat dari tepi pulsa Anda, hal-hal semacam itu. Anda tidak menangkap apa pun yang berguna dalam tangkapan layar itu, yang mungkin mengapa tampaknya tidak ada masalah atau perbedaan. Ada banyak masalah atau perbedaan yang tidak akan pernah terlihat dengan apa yang Anda ukur.
Apa yang bisa saya lihat adalah bahwa penangkapan kereta nadi yang tidak bekerja terasa lebih kotor, baik nadi maupun tanah, daripada yang lainnya. Yang aneh, karena harus memanggil fungsi yang sama dengan yang lain. Mengapa begitu ribut sekali?
Lebih penting lagi, dalam penangkapan non-kerja, lihat 'musim gugur'. 809μs? Osiloskop Anda berpikir ia melihat waktu jatuh yang bertahan 0,8 ms. Itu buruk. Jelas itu tidak benar, tetapi kenyataannya tetap, itulah yang diukurnya.
Itu adalah tanda klasik dari tepi yang kotor. Pikirkan tentang itu. Jika pulsa ini membodohi peralatan uji kelas atas Anda yaitu osiloskop Anda untuk melihat waktu yang sangat panjang atau jatuh, atau mungkin sangat kotor sehingga tidak dapat mendeteksi tepi jatuh dengan benar setiap saat (atau siapa yang tahu), maka kesempatan apa yang dimiliki servo kecil $ 8 yang jelek itu untuk mendapatkan nilai yang baik?
Jika servo tidak mendapatkan pulsa yang valid (seperti jika ujung jatuh terlalu lama, terlalu kotor, atau terlewatkan) dalam rentang pulsa yang dapat diterima, dan oleh servos memperhitungkan tepi yang mungkin atau mungkin tidak memiliki apa pun untuk lakukan dengan apa yang Anda anggap sebagai tepi denyut nadi, lalu ia merespons seolah-olah mati.
Dengan kata lain, tidak hanya itu tidak bergerak, tetapi tidak akan menahan porosnya bergerak. Itu hanya akan menjadi lemas, persis seperti yang Anda lihat.
Sekarang, ini menimbulkan pertanyaan .... mengapa memanggil servo.write mempengaruhi kualitas tepi?
Anda mengatakan klon. Seperti yang ini?
Klon-klon ini khususnya cenderung berperilaku tidak menentu karena decoupling yang sangat buruk. Harus ada kapasitor decoupling pada setiap pin daya, dan sedekat mungkin dengan mega2560. Dan pada arduino yang sebenarnya, memang ada. Namun pada klon ini, mereka terlalu jauh, atau mungkin hilang, sulit untuk mengatakannya. Jelas dari melihat papan bahwa itu tidak akan berperilaku andal, itu yang penting.
Jadi apa bedanya?
Ketika Anda memanggil servo.write, ia mendorong stack lebih tinggi daripada jika Anda memanggil writeMicroseconds. Mengingat penunjuk stack 3 byte mega2560 (17 bit), itu harus membalik banyak bit kritis yang tidak harus ketika Anda memanggil writemicroseconds. Saya tahu ini sepertinya perbedaan yang tidak mungkin, tetapi saya telah mengalami bagian saya yang adil dari mikrokontroler yang dipisahkan secara buruk, dan atmegas pada khususnya tampaknya menunjukkan perilaku aneh khususnya ketika menggunakan timer dan / atau mendorong atau membuka tumpukan. Sesuatu yang serupa terjadi pada saya, hanya tumpukan yang rusak ketika saya mencoba untuk mengarahkan LED dengan PWM, tetapi jika saya meletakkan semuanya sejajar tanpa mendorong tumpukan, itu berhasil. Decoupling yang buruk akhirnya menjadi masalah.
Saya sepenuhnya berharap decoupling yang buruk dapat, untuk alasan yang diketahui bahwa ATmega2560 dan tidak ada orang lain, memiliki efek yang merugikan pada kualitas tepi pulsa itu, tetapi hanya ketika Anda mendorong tumpukan tepat sebelumnya. Servo ini hanya tidak cukup mampu menangani cara tepi-tepi itu dinodai, sehingga tidak ada pulsa yang valid dalam kasus itu. Servo lain jelas mengelolanya.
Hal decoupling selalu aneh dan hiper spesifik seperti ini. Itulah sebabnya decoupling sangat penting. Menjaga neraka mimpi buruk masalah kurangnya kapasitansi dapat menyebabkan Anda di teluk dengan tutup keramik yang bagus dan sedekat mungkin dengan chip.