Đầ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ữ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.