Primero, un rápido aparte. Parece que tienes un ligero malentendido sobre cómo funcionan los servos. Los servos no están controlados por PWM, y no saben ni les importa que envíes pulsos a 49.cualquiera que sea Hz. No saben que el pulso es un porcentaje de algún período arbitrario. Al servo no podría importarle menos el tiempo entre pulsos. Digo esto porque pareces inusualmente enfocado en cosas que en realidad no importan.
Los servos ni siquiera saben ni les importa que el voltaje sea alto o bajo en un momento dado. Solo les importa una cosa: el tiempo entre un borde ascendente y un borde descendente.
El servo se controla detectando un borde de voltaje ascendente y midiendo el tiempo hasta que hay un borde descendente. Los tiempos válidos generalmente oscilan entre 1,0 y 2,0 ms, pero puede variar de servo a servo.
Puede controlarlo a 1Hz, 10Hz, 50Hz, 100Hz. La mayoría responderá a frecuencias de pulso aún más altas, pero nuevamente esto es variable. Lo que estoy tratando de decir es que la frecuencia, el ciclo de trabajo, la duración entre pulsos, todo no podría ser menos relevante para su problema, que es que el servo no responde cuando lo espera.
Lo único que es relevante son los bordes de su pulso, a los que no ha prestado atención. Si desea resolver esto, comience mirando las cosas que importan, tome capturas de cerca de los bordes de su pulso, ese tipo de cosas. No ha capturado nada útil en esas capturas de pantalla, lo que probablemente sea la razón por la que no parece haber un problema o diferencia. Hay muchos problemas o diferencias que nunca serían visibles con lo que has medido.
Lo que puedo ver es que la captura del tren de pulsos que no funciona es notablemente más sucia, tanto el pulso como el suelo, que cualquiera de los otros. Lo cual es extraño, ya que debería estar llamando a la misma función que los demás. ¿Por qué es tanto más ruidoso?
Más importante aún, en la captura no funcional, observe el 'tiempo de caída'. 809µs? Su osciloscopio cree que ve un tiempo de caída que dura 0.8 ms. Eso es malo. Claramente eso es incorrecto, pero el hecho es que eso es lo que mide.
Esa es una señal clásica de un borde sucio. Piénsalo. Si este pulso está engañando a su equipo de prueba de gama alta que es su osciloscopio para ver un borde ridículamente largo o un tiempo de caída, o tal vez tan sucio que simplemente no puede detectar correctamente el borde descendente todo el tiempo (o quién sabe), entonces ¿Qué posibilidades tiene ese pobre y asqueroso servo de $ 8 de recoger un borde decente?
Si un servo no obtiene un pulso válido (como si el flanco descendente tarda demasiado, está demasiado sucio o se pierde) dentro del rango de pulso aceptable, y por los servos que calculan los bordes que pueden o no tener algo para haz lo que consideras que son los bordes del pulso, entonces responde como si estuviera apagado.
En otras palabras, no solo no se mueve, sino que no resistirá el movimiento de su eje. Simplemente será flácido, exactamente como lo estás viendo.
Ahora, esto plantea la pregunta ... ¿por qué llamar a servo.write afectaría la calidad del borde?
Dijiste un clon. ¿Como éste?
Estos clones en particular tienden a comportarse de manera errática debido al desacoplamiento increíblemente pobre. Debe haber condensadores de desacoplamiento en cada pin de alimentación y lo más cerca posible del mega2560. Y en el arduino real, de hecho hay. Sin embargo, en estos clones, están demasiado lejos, o tal vez faltan, es difícil saberlo. Es obvio al mirar el tablero que no se comportará de manera confiable, eso es lo importante.
Entonces, ¿cuál es la diferencia?
Cuando llama a servo.write, empuja la pila más alto que si llama a writeMicroseconds. Dado el puntero de pila de 3 bytes del mega2560 (17 bits), tiene que voltear un montón de bits críticos que no tiene que hacer cuando llama a microsegundos de segundo. Sé que esto parece una diferencia poco probable, pero he experimentado mi parte justa de microcontroladores mal desacoplados, y las atmegas en particular parecen exhibir un comportamiento extraño específicamente al usar temporizadores y / o empujar o reventar la pila. Algo similar me sucedió a mí, solo la pila se corrompió cuando intentaba controlar los LED con PWM, pero si ponía todo en línea sin presionar la pila, funcionó. El desacoplamiento pobre fue, en última instancia, el problema.
Esperaría totalmente que un desacoplamiento deficiente pueda, por razones conocidas por ese atmega2560 y por nadie más, tener un efecto perjudicial en la calidad del borde de ese pulso, pero solo cuando está presionando la pila justo antes. Este servo simplemente no es capaz de manejar la forma en que se manchan esos bordes, por lo que no ve pulsos válidos en ese caso. Otros servos obviamente lo manejan.
El desacoplamiento siempre es extraño e hiperespecífico como este. Es por eso que el desacoplamiento es tan importante. Mantenga el infierno de pesadilla de problemas, la falta de capacitancia puede causarle problemas con gorros de cerámica gruesos y tan cerca del chip como sea físicamente posible.