Innanzitutto, una rapida parte. Sembra che tu abbia una leggera incomprensione su come funzionano i servi. I servi non sono controllati da PWM e non sanno né si preoccupano che stai inviando impulsi a 49. qualunque sia Hz. Non sanno che l'impulso è una percentuale di un certo periodo arbitrario. Al servo non potrebbe importare di meno il tempo che intercorre tra gli impulsi. Lo dico perché sembri insolitamente concentrato su cose che in realtà non contano.
I servi non sanno nemmeno o si preoccupano che la tensione sia alta o bassa in un dato momento. Si preoccupano solo di una cosa: il tempo tra un fronte di salita e un di discesa.
Il servo viene controllato rilevando un fronte di tensione in aumento e misurando il tempo fino a quando non vi è un fronte di discesa. I tempi validi sono in genere compresi tra 1,0 e 2,0 ms, ma possono variare da servo a servo.
Puoi controllarlo a 1Hz, 10Hz, 50Hz, 100Hz. La maggior parte risponderà a pulsazioni ancora più elevate, ma ancora una volta questo è variabile. Quello che sto cercando di dire è che la frequenza, il duty cycle, la durata tra gli impulsi, non potrebbe essere meno rilevante per il tuo problema, ovvero che il servo non risponde quando te lo aspetti.
L'unica cosa rilevante sono i bordi del polso, a cui non hai prestato attenzione. Se vuoi capirlo, ti preghiamo di iniziare a guardare le cose che contano, dare da vicino acquisizioni dei bordi del polso, quel genere di cose. Non hai catturato nulla di utile in quelle schermate, motivo per cui non sembra esserci un problema o una differenza. Ci sono molti problemi o differenze che non sarebbero mai visibili con ciò che hai misurato.
Quello che posso vedere è che la cattura del treno di impulsi non funzionante è notevolmente più sporca, sia del polso che del suolo, rispetto a qualsiasi altra. Il che è strano, come dovrebbe chiamare la stessa funzione degli altri. Perché quello è tanto più rumoroso?
Ancora più importante, nella cattura non lavorativa, guarda il "tempo di caduta". 809μs? L'oscilloscopio ritiene di vedere un tempo di caduta della durata di 0,8 ms. Non va bene. Chiaramente ciò non è corretto, ma il fatto rimane, questo è ciò che misura.
Questo è un classico segno di un bordo sporco. Pensaci. Se questo impulso sta ingannando la tua attrezzatura di prova di fascia alta che è l'oscilloscopio nel vedere un bordo ridicolmente lungo o un tempo di caduta, o forse così sporco da non riuscire a rilevare correttamente il fronte di caduta per tutto il tempo (o chi lo sa), allora che possibilità ha quel povero servo da $ 8 di schifo di ottenere un decente margine di caduta?
Se un servo non ottiene un impulso valido (come se il fronte di discesa impiega troppo tempo, è troppo sporco o è perso) all'interno dell'intervallo di impulsi accettabile e dai servi che calcolano per i bordi che possono o meno avere qualcosa da fai con quello che consideri i bordi del polso, quindi risponde come se fosse spento.
In altre parole, non solo non si muove, ma non resisterà al movimento dell'albero. Sarà semplicemente inerte, esattamente come stai vedendo.
Ora, questo fa sorgere la domanda .... perché la chiamata a servo.write influirebbe sulla qualità dei bordi?
Hai detto un clone. Come questo?
Questi cloni in particolare tendono a comportarsi in modo irregolare a causa del disaccoppiamento incredibilmente scarso. Dovrebbero esserci disaccoppiatori di condensatori su ogni pin di alimentazione e il più vicino possibile al mega2560. E sul vero arduino, in effetti ci sono. Su questi cloni, tuttavia, sono troppo lontani, o forse mancanti, è difficile da dire. È ovvio guardando la lavagna che non si comporterà in modo affidabile, questa è la cosa importante.
Ma qual è la differenza però?
Quando chiami servo.write, lo stack viene spostato più in alto rispetto a quando scrivi callMicroseconds. Dato il puntatore dello stack a 3 byte del mega2560 (17 bit), è necessario capovolgere un mucchio di bit critici che non è necessario quando si chiamano writeemicrosecondi. So che questa sembra una differenza improbabile, ma ho sperimentato la mia giusta dose di microcontrollori scarsamente disaccoppiati, e in particolare gli atmega sembrano esibire un comportamento strano specificamente quando si usano i timer e / o spingendo o facendo scoppiare lo stack. Qualcosa di simile è successo per me, solo lo stack è stato danneggiato quando stavo cercando di guidare i LED con PWM, ma se ho messo tutto in linea senza spingere lo stack, ha funzionato. Il disaccoppiamento era alla fine il problema.
Mi aspetterei pienamente che il disaccoppiamento disagiato sia in grado, per ragioni note a quell'atmega2560 e nessun altro, di avere un effetto dannoso sulla qualità del bordo di quell'impulso, ma solo quando si sta spingendo lo stack prima. Questo servo non è in grado di gestire il modo in cui questi bordi vengono macchiati, quindi non vede impulsi validi in quel caso. Altri servi ovviamente lo gestiscono.
Il disaccoppiamento delle cose è sempre bizzarro e iper specifico come questo. Ecco perché il disaccoppiamento è così importante. Mantieni l'inferno da incubo di problemi che la mancanza di capacità può farti venire a bada con bei tappi di ceramica grassa e il più vicino possibile al chip come fisicamente possibile.