Servo merespons ke servo tester, bukan ke mikrokontroler. Sinyal terlihat sama


8

Saya memiliki servo TowerPro MG90D ( Manufactuer Link ) ( ServoDatabase Link ).
Ini memiliki rentang 180deg (non-kontinu).

TowerPro MG90D

Ini merespons bagus untuk servo tester saya:
Penguji servo

Amati 7% Duty Cycle berikut (sekitar 90 deg) pada tester:

penguji cakupan servo

penguji cakupan servo

Servo merespons dengan baik.


Namun, ketika saya gunakan servo.write()dengan klon Arduino Mega 2560 saya, servo tidak menanggapi output sudut apa pun. Saya memiliki beberapa servos lain yang berfungsi dengan baik dengan kode yang sama pada pin yang sama.

Amati 7% Duty Cycle di Arduino dengan servo.write(90):

ruang lingkup arduino servo 90deg

Tidak ada respon. Servo itu "lemas"; itu tidak memegang posisi apa pun.


Ketika saya menulis pertanyaan ini, saya berpikir untuk mencoba servo.writeMicroseconds().

Disini adalah servo.writeMicroseconds(1450) :

ruang lingkup arduino servo 1450ms

Servo merespons!

Ini adalah servo.writeMicroseconds(1472)(berfungsi), yang memiliki interval waktu yang sama dengan yang sebelumnya tidak bekerja servo.write(90)!

ruang lingkup arduino servo 1472ms

servo.writeMicroseconds(1550) (kerja):

ruang lingkup arduino servo 1550ms


Apa bedanya?
Penguji servo bekerja pada 49,5Hz, sementara servo.write()gagal pada 49,9Hz. Saya bertanya-tanya apakah entah bagaimana 0.4Hz itu membuat perbedaan, tetapi kemudian saya melihat itu servo.writeMicroseconds()bekerja pada 49.9Hz juga.

Dalam menangkap lingkup di atas, dapat dilihat bahwa keduanya servo.write(90)danservo.writeMicroseconds(1472) memiliki interval waktu yang sama:
 1,474,560ns HIGH
18,544,640ns LOW

Sinyal sangat mirip ... Apa yang bisa menyebabkan servo.write()tidak bekerja?

Kode saya sedasar mungkin:

#include <Servo.h>
Servo serv1;

void setup() {
  serv1.attach(3); // Pin 3
}

void loop() {
  serv1.write(90); // No response
  delay(3000);

  serv1.writeMicroseconds(1472); // Works
  delay(3000);

  serv1.write(0); // No response
  delay(3000);

  serv1.writeMicroseconds(1800); // Works
  delay(3000);
}

skema

mensimulasikan rangkaian ini - Skema dibuat menggunakan CircuitLab


Saya telah mencoba kedua catu daya linear benchtop, dan saya juga mencoba menggunakan konverter buck untuk mundur dari 9V.
Bort

1
Apakah Anda yakin memiliki gelombang stabil selama 3 detik penuh saat digunakan write? Tidak ada alasan bagi servo untuk tidak bekerja, jadi saya akan mempertanyakan sinyal Anda.
Dmitry Grigoryev

1
@Bort Lalu aku kesulitan mempercayai ceritamu.
Dmitry Grigoryev

2
@BigHomie: Sinyal identik sejauh cakupan gambar pergi. Ada sesuatu yang terjadi selain sinyalnya. Tanah yang buruk adalah satu hal yang dapat menyebabkan reaksi yang berbeda terhadap sinyal yang identik secara nominal.
JRE

2
Jika memungkinkan, tangkap dua jejak lingkup pada jalur sinyal servo dengan servo tersambung . Satu jejak dengan serv1.write () saja dan satu jejak dengan serv1.writeMicroseconds () saja. Poskan kedua jejak. Untuk pesona tambahan, lemparkan jejak ketiga dari tester Anda dengan servo yang terhubung .
neonzeon

Jawaban:


0

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?masukkan deskripsi gambar di sini

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.


0

Ini mungkin terkait dengan pengaturan pin output yang dilakukan oleh rutin .write (). Silakan coba gunakan resistor pull-down 1K, itu tidak bekerja kemudian lepaskan dan gunakan resistor pull-up. ini akan menyeimbangkan efek dari resistor pull-up / pull-down mingguan internal yang mungkin diatur oleh rutin. Ketika Anda mengukur sinyal dengan ruang lingkup Anda, resistansi internal probe bertindak sebagai pull-down.
Kebanyakan servos juga akan melepaskan daya ke motor internal jika sinyal dalam tidak diatur selama 10 pulsa berturut-turut. Ini digunakan untuk menghemat daya.


Saya khawatir jawaban Anda tidak benar. servo.write () mengambil sudut sebagai input, bukan waktu. Orang tidak boleh memilih secara buta.
Bort

Ya, kesalahan saya, saya tidak membaca kodenya dengan baik. ini mungkin terkait dengan pengaturan pin output yang dilakukan oleh rutin .write ().
555

2
Ini akan menjadi pemikiran pertama saya, jejak-jejak ruang lingkup tampaknya membantah ini. Tanah yang hilang dan situasi pull-up /-down yang berbeda mungkin menjelaskan sinyal yang sama yang dikirim tetapi tidak sampai di sana (setelah lokasi penyelidikan).
KalleMP

Saya pikir @KallieMP mungkin benar. Resistor pullup / down mungkin jawabannya. Mereka dapat membatasi arus. Denyut nadi dapat terbentuk dengan benar namun dengan drive yang tidak cukup. Jadi, tidak peduli fungsi khusus servo.write (), level saat ini harus sama persis dengan output dari servo tester untuk mendapatkan hasil yang sama.
SDsolar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.