Servo đáp ứng với máy kiểm tra servo, không phải với vi điều khiển. Tín hiệu trông giống nhau


8

Tôi có một servo TowerPro MG90D ( Liên kết nhà sản xuất ) ( Liên kết cơ sở dữ liệu Servo ).
Nó có một phạm vi 180deg (không liên tục).

TowerPro MG90D

Nó đáp ứng tuyệt vời với trình kiểm tra servo của tôi:
Máy kiểm tra servo

Quan sát chu kỳ thuế 7% sau đây (khoảng 90 độ) trên máy kiểm tra:

thử nghiệm phạm vi servo

thử nghiệm phạm vi servo

Servo đáp ứng tốt.


Tuy nhiên, khi tôi sử dụng servo.write()với bản sao Arduino Mega 2560 của mình, servo không đáp ứng với bất kỳ đầu ra góc nào. Tôi có một số servo khác hoạt động tốt với cùng một mã trên cùng một chân.

Quan sát chu kỳ thuế 7% sau đây trên Arduino với servo.write(90):

phạm vi arduino servo 90deg

Không phản hồi. Các servo là "khập khiễng"; nó không giữ vị trí nào


Trong khi tôi đang viết câu hỏi này, tôi đã nghĩ đến việc thử servo.writeMicroseconds().

Đây là servo.writeMicroseconds(1450):

phạm vi arduino servo 1450ms

Servo đáp ứng!

Đây là servo.writeMicroseconds(1472)(làm việc), khoảng thời gian giống như trước khi không làm việc servo.write(90)!

phạm vi arduino servo 1472ms

servo.writeMicroseconds(1550) (đang làm việc):

phạm vi arduino servo 1550ms


Sự khác biệt là gì?
Máy kiểm tra servo hoạt động ở 49,5Hz, trong khi servo.write()thất bại ở 49,9Hz. Tôi tự hỏi nếu bằng cách nào đó, 0,4Hz đó đã tạo ra sự khác biệt, nhưng sau đó tôi thấy nó cũng servo.writeMicroseconds()hoạt động ở mức 49,9Hz.

Trong các ảnh chụp phạm vi trên, có thể thấy rằng cả hai servo.write(90)servo.writeMicroseconds(1472)có cùng khoảng thời gian:
 1,474,560ns HIGH
18,544,640ns LOW

Các tín hiệu rất giống nhau ... Điều gì có thể khiến servo.write()không hoạt động?

Mã của tôi là cơ bản nhất có thể:

#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);
}

sơ đồ

mô phỏng mạch này - Sơ đồ được tạo bằng CircuitLab


Tôi đã thử cả hai nguồn cung cấp năng lượng tuyến tính để bàn và tôi cũng đã thử sử dụng bộ chuyển đổi buck để từ chối từ 9V.
Bort

1
Bạn có chắc chắn rằng bạn có một làn sóng ổn định trong 3 giây đầy đủ khi bạn sử dụng write? Thực sự không có lý do gì để servo không hoạt động, vì vậy tôi đặt câu hỏi về tín hiệu của bạn.
Dmitry Grigoryev

1
@Bort Sau đó, tôi có một thời gian khó tin vào câu chuyện của bạn.
Dmitry Grigoryev

2
@BigHomie: Các tín hiệu giống hệt như hình ảnh phạm vi. Có một cái gì đó đang xảy ra bên cạnh tín hiệu. Mặt đất kém là một điều có thể gây ra các phản ứng khác nhau đối với các tín hiệu giống hệt nhau.
JRE

2
Nếu có thể, hãy chụp hai dấu vết phạm vi trên đường tín hiệu servo với servo được kết nối . Một dấu vết chỉ với serv1.write () và một dấu vết chỉ với serv1.writeMicroseconds (). Đăng cả dấu vết. Để có thêm sự quyến rũ, hãy theo dõi lần thứ ba từ người thử nghiệm của bạn với servo được kết nối .
neemonyon

Câu trả lời:


0

Đầu tiên, nhanh chóng qua một bên. Bạn dường như có một sự hiểu lầm nhỏ về cách thức hoạt động của servo. Các servo không được điều khiển bởi PWM và chúng không biết hoặc quan tâm rằng bạn đang gửi các xung ở 49.whwh Hz. Họ không biết xung là một số phần trăm của một khoảng thời gian tùy ý. Các servo không quan tâm đến thời gian giữa các xung là bao nhiêu. Tôi nói điều này bởi vì bạn dường như tập trung bất thường vào những thứ không thực sự quan trọng.

Servos thậm chí không thực sự biết hoặc quan tâm rằng điện áp cao hay thấp tại một thời điểm nhất định. Họ chỉ quan tâm đến một điều: thời gian giữa một cạnh tăng và cạnh giảm.

Servo được điều khiển bằng cách phát hiện cạnh điện áp tăng và đo thời gian cho đến khi có cạnh giảm. Thời gian hợp lệ thường nằm trong khoảng từ 1 đến 2,0ms, nhưng nó có thể thay đổi từ servo sang servo.

Bạn có thể điều khiển nó ở 1Hz, 10Hz, 50Hz, 100Hz. Hầu hết sẽ đáp ứng với tốc độ xung thậm chí cao hơn, nhưng một lần nữa đây là biến. Điều tôi đang cố gắng nói là tần số, chu kỳ nhiệm vụ, thời lượng giữa các xung, tất cả đều không thể liên quan đến vấn đề của bạn, đó là servo không đáp ứng khi bạn mong đợi.

Điều duy nhất có liên quan là các cạnh của xung mà bạn không chú ý đến. Nếu bạn muốn tìm hiểu điều này, xin vui lòng bắt đầu bằng cách xem xét những thứ quan trọng, chụp cận cảnh các cạnh xung của bạn, đại loại thế. Bạn đã chụp không có gì hữu ích trong các ảnh chụp màn hình đó, đó có thể là lý do tại sao dường như không có vấn đề hoặc sự khác biệt. Có rất nhiều vấn đề hoặc sự khác biệt sẽ không bao giờ được nhìn thấy với những gì bạn đã đo.

Những gì tôi có thể thấy là việc bắt giữ mạch xung không hoạt động là bẩn hơn đáng kể, cả xung và mặt đất, hơn bất kỳ ai khác. Đó là số lẻ, vì nó nên được gọi cùng chức năng với các hàm khác. Tại sao cái đó ồn ào hơn thế?

Quan trọng hơn, trong việc chụp không hoạt động, hãy nhìn vào 'thời gian rơi'. 809 người? Máy hiện sóng của bạn nghĩ rằng nó thấy thời gian rơi kéo dài 0,8ms. Thật tệ. Rõ ràng đó là không chính xác, nhưng thực tế vẫn còn, đó là những gì nó đo lường.

Đó là một dấu hiệu cổ điển của một cạnh bẩn. Hãy suy nghĩ về nó. Nếu xung này đánh lừa thiết bị thử nghiệm cao cấp của bạn là máy hiện sóng của bạn nhìn thấy một cạnh dài hoặc thời gian rơi vô lý, hoặc có thể bẩn đến mức nó không thể phát hiện chính xác cạnh rơi mọi lúc (hoặc ai biết), thì cơ hội nào mà cái servo 8 đô la đáng thương đó có thể nhặt được một lợi thế tốt?

Nếu một servo không nhận được xung hợp lệ (như nếu cạnh rơi mất quá nhiều thời gian, quá bẩn hoặc bị bỏ qua) trong phạm vi xung chấp nhận được và bởi các servo được tính toán bởi các cạnh có thể có hoặc không có gì để làm với những gì bạn coi các cạnh xung là, sau đó nó sẽ phản hồi như thể nó bị tắt.

Nói cách khác, nó không chỉ không di chuyển mà còn không chống lại trục của nó di chuyển. Nó chỉ đơn giản là khập khiễng, chính xác như bạn đang thấy.

Bây giờ, điều này đặt ra câu hỏi .... tại sao gọi servo.write lại ảnh hưởng đến chất lượng cạnh?

Bạn nói một bản sao. Như cái này?nhập mô tả hình ảnh ở đây

Những bản sao này đặc biệt có xu hướng hành xử thất thường do sự phân tách cực kỳ kém. Cần có các tụ tách rời trên mỗi chân nguồn và càng gần càng tốt với mega2560. Và trên arduino thực tế, thực sự có. Tuy nhiên, trên các bản sao này, chúng ở quá xa, hoặc có lẽ mất tích, thật khó để nói. Rõ ràng từ việc nhìn vào bảng rằng nó sẽ không hành xử đáng tin cậy, đó là điều quan trọng.

Vì vậy, sự khác biệt là gì?

Khi bạn gọi servo.write, nó sẽ đẩy ngăn xếp cao hơn so với khi bạn gọi writeMicroseconds. Với con trỏ ngăn xếp 3 byte của mega2560 (17 bit), nó phải lật một loạt các bit quan trọng mà nó không phải làm khi bạn gọi writemiaroseconds. Tôi biết điều này có vẻ như là một sự khác biệt không thể xảy ra, nhưng tôi đã trải nghiệm phần lớn các bộ vi điều khiển được phân tách kém và đặc biệt là atmegas dường như thể hiện hành vi kỳ quặc cụ thể khi sử dụng bộ hẹn giờ và / hoặc đẩy hoặc bật ngăn xếp. Một cái gì đó tương tự đã xảy ra với tôi, chỉ có ngăn xếp bị hỏng khi tôi đang cố lái các đèn LED với PWM, nhưng nếu tôi đặt mọi thứ trực tiếp mà không đẩy ngăn xếp, nó đã hoạt động. Phân tách kém cuối cùng là vấn đề.

Tôi hoàn toàn mong đợi sự phân tách kém có thể, vì những lý do mà atmega2560 biết và không ai khác, có ảnh hưởng bất lợi đến chất lượng cạnh của xung đó, nhưng chỉ khi bạn đang đẩy stack ngay trước đó. Servo này hoàn toàn không có khả năng xử lý cách các cạnh đó được sulled, vì vậy nó không thấy xung hợp lệ trong trường hợp đó. Các servo khác rõ ràng quản lý nó.

Công cụ tách riêng luôn kỳ quái và siêu cụ thể như thế này. Đó là lý do tại sao tách rời là rất quan trọng. Giữ cho cơn ác mộng của những vấn đề thiếu điện dung có thể khiến bạn khó chịu với những chiếc mũ gốm đẹp và càng gần chip càng tốt.


0

Điều này có thể liên quan đến cài đặt chân đầu ra được thực hiện bởi thường trình .write (). Vui lòng thử sử dụng điện trở kéo xuống 1K, nó không hoạt động sau đó loại bỏ nó và sử dụng điện trở kéo lên. điều này sẽ cân bằng hiệu ứng của bất kỳ điện trở kéo lên / kéo xuống trong tuần nào có thể được thiết lập bởi thói quen. Khi bạn đo tín hiệu với phạm vi của mình, điện trở trong của đầu dò sẽ đóng vai trò kéo xuống.
Hầu hết các servo cũng sẽ giải phóng năng lượng cho động cơ bên trong nếu tín hiệu không được đặt trước trong 10 xung liên tiếp. Điều này được sử dụng để tiết kiệm điện.


Tôi sợ câu trả lời của bạn không đúng. servo.write () lấy một góc làm đầu vào, không phải thời gian. Mọi người không nên bỏ phiếu một cách mù quáng.
Bort

Vâng, lỗi của tôi, tôi đã không đọc mã tốt. điều này có thể liên quan đến cài đặt chân đầu ra được thực hiện bởi thường trình .write ().
555

2
Đây sẽ là suy nghĩ đầu tiên của tôi, mặc dù các dấu vết phạm vi dường như bác bỏ điều này. Một mặt đất bị thiếu và một tình huống kéo lên / xuống khác nhau có thể giải thích cho cùng một tín hiệu được gửi nhưng không đến đó (sau vị trí thăm dò).
KalleMP

Tôi nghĩ rằng @KallieMP có lẽ đúng. Điện trở pullup / down rất có thể là câu trả lời. Họ có thể giới hạn hiện tại. Các xung có thể được hình thành chính xác nhưng không đủ ổ đĩa. Vì vậy, bất kể chức năng cụ thể của servo.write () các mức hiện tại phải khớp chính xác với đầu ra của bộ kiểm tra servo để có được kết quả tương tự.
SDsolar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.