da
c1b8 » 9 nov 2011, 0:35
Ti descrivo alcune situazioni che ho dovuto affrontare con i servo.
Anzitutto il segnale di pilotaggio. Deve trattarsi di una onda quadra di frequenza circa 50 Hz, la durata dell'impulso positivo dell'onda quadra deve durare tra i 0,5ms ed i 2,5ms. Non è necessario che la frequenza sia esattamente di 50 Hz, ma è importante che la durata dell'impulso positivo sia all'interno dei tempi indicati.
tempi diversi dell'impulso positivo danno posizioni alterate del servo, una frequenza non esattamente di 50Hz determina una variazione della coppia del servo: maggioare la frequenza -> maggiore la coppia. In ogni caso non puoi allontanarti molto dai 50Hz.
Altra considerazione è il numero di impulsi necessari a posizionare il servo. Nei servo digitali puoi fornire un solo impulso della durata desiderata e nessun altro segnale, il servo si posizionerà correttamente con la massima coppia. Nei servo standard come i tuoi devi continuare a fornire impulsi della stessa durata fino a posizionamento avvenuto e mantenere il segnale per mantenere la coppia del servo. I servo da te scelti hanno una velocità di 60gradi ogni 0,2s, dovrai quindi fornire almeno 50 impulsi della stessa durata per apprezzarne e il posizionamento e la coppia.
Un problema che ho riscontrato nel'utilizzare servo e PIC è stato il reset del PIC stesso quando il servo si doveva muovere. Reset dovuto ad un eccessivo calo di tensione di alimentazione del PIC per il fatto che alimentavo PIC e servo dalla stessa sorgente. Separando le due sorgenti di alimentazione non ho avuto più problemi.
Il pilotare un servo direttamente da una uscita del PIC, al contrario, non mi ha mai creato problemi e non sono mai state necssarie pull-up nel segnale di controllo.
Una volta ho commesso il banale errore di invertire i cavi di alimentazione positiva e di controllo del servo. Ho in pratica fornito tensione continua sul cavetto di controllo (cavo giallo) e il segnale PWM di controllo sull'alimentazione (cavo rosso) del servo, il servo si spostava in un angolo (180 come dici tu) e da li non usciva. Non è rimasto fermo o ronzante o altro, semplicemente si spostava lentamente ma continuamente servo un angolo. Accortomi dell'inversione dei cavetti e risistemati la cosa si è risolta.
Guandardo il tuo codice mi verrebbe da dire che il segnale fornito al servo non è proprio adatto a comandarlo, meglio sicuramente il segnale fornito dal codice di
AjKDAP.
Un'ultima considerazione, una ricerca in rete dei servo da te indicati riporta diverse segnalazioni di problemi per quanto riguarda la velocità di rotazione e la precisione di posizionamento, non vorrei che l'utilizzo di un linguaggio diverso dall'assembly generi un segnale non perfetto (da un punto di vista delle tempistiche) che sommato ai problemi dei servo dia lungo al problema che hai riscontrato.