Bagaimana Arduino Uno mendukung hingga 12 servos jika hanya memiliki 6 pin PWM digital?


10

Menurut ini :

Perpustakaan Servo mendukung hingga 12 motor di sebagian besar papan Arduino dan 48 di Arduino Mega. Pada board selain Mega, penggunaan library menonaktifkan fungsionalitas analogWrite () (PWM) pada pin 9 dan 10, terlepas dari apakah ada Servo pada pin tersebut. Pada Mega, hingga 12 servo dapat digunakan tanpa mengganggu fungsi PWM; penggunaan 12 hingga 23 motor akan menonaktifkan PWM pada pin 11 dan 12.

Namun, menurut ini :

Digital I / O Pins 14 (dimana 6 menyediakan output PWM)

Jadi bagaimana Uno dapat mengontrol lebih dari 6 servos jika hanya memiliki 6 pin I / O digital yang dapat memberikan output PWM?

Jawaban:


8

Perpustakaan Servo tidak menggunakan PWM. Saat Anda memanggil write () ia menghitung lebar pulsa dalam mikrodetik dan menyimpannya dalam array global. Lalu ada timer tunggal yang secara teratur memicu interupsi yang mengubah sinyal output sesuai dengan lebar pulsa yang diinginkan masing-masing saluran.

Anda dapat menemukan kode sumber di bawah ini: Tautan Github


1
Jadi pada dasarnya mensimulasikan PWM? Apa gunanya pin digital dengan saluran PWM?
user41158

2
Secara umum, pulsa servo sekitar 1 ms. Oleh karena itu mereka harus didorong oleh frekuensi sekitar 1 kHz yang sangat mudah dihasilkan oleh perangkat lunak pada setiap output dengan mikro berjalan pada beberapa MHz. Keluaran AVR PWM dihasilkan oleh perangkat keras khusus dan dapat mencapai frekuensi CPU tetapi jumlah saluran terbatas. Saya kira para penulis modul Servo memutuskan untuk menggunakan pengatur waktu tunggal untuk menangani saluran sebanyak pin dan menyimpan perangkat keras PWM untuk keperluan lain.
Grapsus

1
PWM dari output Arduino adalah untuk output daya variabel dengan siklus tugas antara 0 dan 100%. Kontrol "PWM" gaya RC memiliki rentang siklus tugas yang sangat terbatas - 1000 us pada 50 Hz adalah 5%, 2000 us pada 50 Hz adalah 10%. Pikirkan RC PWM sebagai "kereta pulsa" daripada "PWM" tradisional.
Jon Watte

@ user41158 Jika Anda memiliki waktu CPU tanpa batas, Anda dapat menggunakan output digital apa pun sebagai PWM dan mengendalikannya dalam perangkat lunak, tidak hanya PWM, secara teori Anda dapat membuat sistem komunikasi digital dengan menulis program dan mengganti output ini, disebut " bit- membenturkan ". Namun dalam praktiknya, waktu CPU tidak terbatas dan yang terbaik untuk menyelesaikan tugas perangkat keras dengan perangkat keras. Untuk kontrol servo, frekuensi PWM cukup rendah, sehingga praktis untuk menggedor PWM dalam perangkat lunak untuk membuat output tambahan.
比尔 盖子

2

6 pin PWM menggunakan built in UART pada ATmega328P untuk menghasilkan output mereka. Ini membuat pulsa sangat cepat untuk output "analog" yang lebih berkualitas. Karena servo berkomunikasi dengan kecepatan yang cukup lambat, mereka dapat didorong menggunakan interupsi perangkat lunak. Interupsi perangkat lunak menjauh dari kode yang Anda jalankan dan menjalankan kode yang disertakan dengan pustaka servo. Kode ini menggunakan cara standar untuk mengubah status pin. Dengan melakukannya menggunakan interupsi daripada menggunakan UART, Anda membuang-buang waktu pemrosesan tetapi mendapatkan kemampuan untuk mendorong lebih banyak servos.


Bisakah Anda menjelaskan (atau menautkan ke) lebih banyak? Bagaimana UART digunakan untuk PWM?
Martin Thompson

Saya pikir akan lebih baik untuk mengatakan bahwa perpustakaan PWM dapat menggunakan pin I / O UART jika diinginkan. perpustakaan PWM tidak akan menggunakan UART itu sendiri, tetapi pin yang digunakan oleh UART juga dapat digunakan sebagai I / O digital standar jika tidak diperlukan untuk UART.
Peter Bennett
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.