Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

servo comandati a distanza

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

1
voti

[61] Re: servo comandati a distanza

Messaggioda Foto Utentegiozambi » 13 feb 2011, 11:33

va bene grazie del consiglio.. comunque qualcosina so fare, mi ricordo un po' come si programma, settare le uscite lo so fare :ok: ( wow che conquista)... però non so perché OPTION_REG,7 porti tutte le resistenze di pull up agli ingressi...se tipo volessi portare le resistenze di pull up anche a portc dovrei cambiare il numero 7?
poi un'altra domanda, il programma fa in modo che il servo raggiunga 2 posizioni, ma se volessi fare in modo che il servo si posizioni anche in parti intermedie delle stesse, secondo te è utile che io tolga il delay in modo da non consentirgli il giro completo?
e per estendere il range di rotazione?
Te per il ton di 1.6ms hai scritto:
Codice: Seleziona tutto
SET1           MOVLW D'9'                     ; PRECARICA IL CONTATORE COUNT_1
               MOVWF COUNT_1
               MOVLW D'246'                   ; PRECARICA IL CONTATORE COUNT_2
               MOVWF COUNT_2   
               MOVLW D'51'                    ; PRECARICA IL CONTATORE COUNT_3
               MOVWF COUNT_3               
               GOTO POSIZIONE1       


mentre per il ton di 0.7ms:

Codice: Seleziona tutto
SET2           MOVLW D'20'                    ; PRECARICA IL CONTATORE COUNT_1
               MOVWF COUNT_1
               MOVLW D'235'                   ; PRECARICA IL CONTATORE COUNT_2
               MOVWF COUNT_2   
               MOVLW D'51'                    ; PRECARICA IL CONTATORE COUNT_3
               MOVWF COUNT_3                 
               GOTO POSIZIONE2


quindi se non erro, il codice precarica count_1 con un numero inversamente proporzionale alla durata del ton? se nelle posizione da 1.6ms è 9 e nelle posizione 0.7ms è 20...?
Avatar utente
Foto Utentegiozambi
310 3 9
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 2 feb 2011, 10:42
Località: Rovigo

1
voti

[62] Re: servo comandati a distanza

Messaggioda Foto Utentedavidde » 14 feb 2011, 9:48

Ciao,

giozambi ha scritto:. però non so perché OPTION_REG,7 porti tutte le resistenze di pull up agli ingressi...se tipo volessi portare le resistenze di pull up anche a portc dovrei cambiare il numero 7?


No, in questo PIC soltanto la PORTB è dotata di resistenze interne di pull-up, nelle altre porte non è possibile settarle, l' unica soluzione è di aggiungerle esternamente. Se vai al paragrafo 4.2 del datasheet trovi tutte le informazioni per settare le resistenze di pull-up sulla PORTB.

giozambi ha scritto:ma se volessi fare in modo che il servo si posizioni anche in parti intermedie delle stesse, secondo te è utile che io tolga il delay in modo da non consentirgli il giro completo?


Dipende come ti serve fare. Il delay serve per fare in modo che anche in seguito ad una breve pressione del pulsante il segnale al servocomando rimanga attivo per un tempo sufficiente a fargli coprire il percorso.
Se lo togli potrà capitare che in seguito ad una pressione troppo breve il servocomando si porti in una posizione non voluta, un po' come se durante lo spostamento venisse a mancare l' alimentazione. Se invece le nuove posizioni che il servo deve raggiungere sono abbinate a pulsanti differenti non ti serve togliere il delay.

giozambi ha scritto:quindi se non erro, il codice precarica count_1 con un numero inversamente proporzionale alla durata del ton? se nelle posizione da 1.6ms è 9 e nelle posizione 0.7ms è 20...?


No, i commenti del codice erano nella posizione sbagliata. Il Ton è direttamente proporzionale al contenuto del registro COUNT_1. Più lo carichi più durerà il Ton. Inoltre è importante affinchè venga rispettata la frequenza di 50Hz che il risultato di COUNT_1 + COUNT_2 sia sempre 255. Ti riallego il codice con i commenti al posto giusto:

Codice: Seleziona tutto
; FUNZIONE: due pulsanti comandano due posizioni definite di un servocomando.

#include P16F876.INC                         
__CONFIG    3FF2H


COUNT_1        EQU 20H                        ; REGISTRO Ton DEL PWM
COUNT_2        EQU 21H                        ; REGISTRO Toff DEL PWM
COUNT_3        EQU 22H                        ; REGISTRO DI RITARDO
COUNT_TIME     EQU 23H                        ; REGISTRO DURATA SEGNALE

BANKSEL     TRISB                            ; CONFIGURA RB4,RB5 COME INGRESSI GLI ALTRI COME USCITE
               MOVLW      B'00110000'
               MOVWF      TRISB     
     
BANKSEL     PORTB                            ; CONFIGURA LE USCITE DELLA PORTB A LIVELLO LOGICO BASSO
               MOVLW       B'00000000'
               MOVWF       PORTB             
     
BANKSEL     OPTION_REG                       ; RESISTENZE DI PULL-UP INTERNE SU RB4 E RB5
               BCF         OPTION_REG,7


BANKSEL     TRISC                            ; CONFIGURA TRISC COME TUTTE USCITE
               MOVLW       B'00000000'
               MOVWF       TRISC
     
BANKSEL     PORTC                            ; CONFIGURA LE USCITE DELLA PORTC A LIVELLO LOGICO BASSO
               MOVLW       B'00000000'
               MOVWF       PORTC

ORG      40H

               MOVLW D'30'                   ; PRECARICA IL CONTATORE COUNT_TIME
               MOVWF COUNT_TIME

MAIN           ucr    PORTB,4              ;TESTA PULSANTE COLLEGATO A RB4
               GOTO     SET1 
               ucr    PORTB,5              ;TESTA PULSANTE COLLEGATO A RB5
               GOTO     SET2           
               GOTO     MAIN


SET1           MOVLW D'9'                     ; PRECARICA IL CONTATORE COUNT_1
               MOVWF COUNT_1
               MOVLW D'246'                   ; PRECARICA IL CONTATORE COUNT_2
               MOVWF COUNT_2   
               MOVLW D'51'                    ; PRECARICA IL CONTATORE COUNT_3
               MOVWF COUNT_3               
               GOTO POSIZIONE1       

; POSIZIONE1: genera il segnale PWM con frequenza di 50Hz e Ton del 3,5% (=0,7ms)
;             si attiva alla pressione del pulsante collegato a RB5.
;             Per variare la posizione assunta dal servocomando quando si preme RB5
;             variare i valori di ricarica dei contatori COUNT_1 e COUNT_2 facendo
;             attenzione che la loro somma deve sempre risultare 255.
;             Il COUNT_TIME serve per generare il segnale di pilotaggio del servocomando             
;             per il tempo necessario all' albero per compiere la rotazione voluta.

POSIZIONE1     BSF PORTC,5                    ; SETTA A LIVELLO LOCICO ALTO RC5
               CALL DELAY_ON                  ; CHIAMA LA ROUTINE DI RITARDO DEL Ton DEL PWM 
               MOVLW D'9'                     ; RICARICA IL CONTATORE COUNT_1
               MOVWF COUNT_1

               BCF PORTC,5                    ; SETTA A LIVELLO LOGICO BASSO RC5
               CALL DELAY_OFF                 ; CHIAMA LA ROUTINE DI RITARDO DEL Toff DEL PWM
               MOVLW D'246'                   ; RICARICA IL CONTATORE COUNT_2
               MOVWF COUNT_2

               DECFSZ COUNT_TIME              ; DECREMENTA IL COUNT_TIME
               GOTO POSIZIONE1               
               MOVLW D'30'                    ; RICARICA IL COUNT_TIME 
               MOVWF COUNT_TIME                           
               GOTO MAIN


SET2           MOVLW D'20'                    ; PRECARICA IL CONTATORE COUNT_1
               MOVWF COUNT_1
               MOVLW D'235'                   ; PRECARICA IL CONTATORE COUNT_2
               MOVWF COUNT_2   
               MOVLW D'51'                    ; PRECARICA IL CONTATORE COUNT_3
               MOVWF COUNT_3                 
               GOTO POSIZIONE2

; POSIZIONE2: genera il segnale PWM con frequenza di 50Hz e Ton del 8% (=1,6ms)
;             si attiva alla pressione del pulsante collegato a RB4.
;             Per variare la posizione assunta dal servocomando quando si preme RB4
;             variare i valori di ricarica dei contatori COUNT_1 e COUNT_2 facendo
;             attenzione che la loro somma deve sempre risultare 255.
;             Il COUNT_TIME serve per generare il segnale di pilotaggio del servocomando             
;             per il tempo necessario all' albero per compiere la rotazione voluta.

POSIZIONE2     BSF PORTC,5                    ; SETTA A LIVELLO LOCICO ALTO RC5
               CALL DELAY_ON                  ; CHIAMA LA ROUTINE DI RITARDO DEL Ton DEL PWM
               MOVLW D'20'                    ; RICARICA IL CONTATORE COUNT_1
               MOVWF COUNT_1

               BCF PORTC,5                    ; SETTA A LIVELLO LOGICO BASSO RC5
               CALL DELAY_OFF                 ; CHIAMA LA ROUTINE DI RITARDO DEL Toff DEL PWM
               MOVLW D'235'                   ; RICARICA IL CONTATORE COUNT_2               
               MOVWF COUNT_2
             
               DECFSZ COUNT_TIME              ; DECREMENTA IL COUNT_TIME
               GOTO POSIZIONE2
               MOVLW D'30'                    ; RICARICA IL COUNT_TIME
               MOVWF COUNT_TIME   
               GOTO MAIN

DELAY_ON       DECFSZ COUNT_3
               GOTO DELAY_ON
               MOVLW D'51'                    ; RICARICA IL CONTATORE COUNT_3
               MOVWF COUNT_3                 
               DECFSZ COUNT_1                 ; DECREMENTA IL COUNT_1
               GOTO DELAY_ON               
               RETURN

DELAY_OFF      DECFSZ COUNT_3
               GOTO DELAY_OFF
               MOVLW D'51'                    ; PRECARICA IL CONTATORE COUNT_3
               MOVWF COUNT_3
               DECFSZ COUNT_2                 ; DECREMENTA IL COUNT_2     
               GOTO DELAY_OFF
               RETURN       

END                                           ; FINE PROGRAMMA


Visto che non hai l' oscilloscopio ti consiglio di guardarti bene come funziona il Simulator Logic Analyzer.
Avatar utente
Foto Utentedavidde
12,8k 4 9 12
G.Master EY
G.Master EY
 
Messaggi: 3886
Iscritto il: 2 ago 2007, 11:40
Località: Bologna

0
voti

[63] Re: servo comandati a distanza

Messaggioda Foto Utentegiozambi » 14 feb 2011, 18:02

Ma se io volessi non avere posizioni intermedie definite, ma poter variale in base alle mie esigenze momentanee l'angolazione del servo per poter cambiare la visuale della telecamera, come dovrei fare?
cioè io premendo il tastino attivo il servo che continua a girare fino a quando non mollo il tasto (o fino a quando non arriva a fine corsa)...capito? questo era il mio progetto iniziale...
Avatar utente
Foto Utentegiozambi
310 3 9
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 2 feb 2011, 10:42
Località: Rovigo

1
voti

[64] Re: servo comandati a distanza

Messaggioda Foto Utentedavidde » 14 feb 2011, 22:29

Devi fare in modo che il Ton del segnale venga incrementato o decrementato fino a quando non lasci il pulsante. Il tempo che intercorre tra un incremento e il successivo determina la velocità della rotazione. Il Ton minimo determinerà il massimo angolo dell' albero in senso antiorario mentre il Ton massimo determinerà il massimo angolo in senso orario .

Puoi fare in tanti modi per incrementare il Ton del segnale. Il primo potrebbe essere quello di tenere il programma così com'è e aggiungerne una parte che quando finisce il delay, prima di saltare all' inizio per ricontrollare lo stato dei tasti, incrementi o decrementi il Ton a seconda del pulsante premuto. In questo modo potendo variare il contenuto del registo delay avrai modo di controllare anche la velocità di rotazione della telecamera.
Dovrai inoltre fare in modo che quando il registro è arrivato al valore corrispondente al limite angolare che vuoi imporre al servo l' incremento venga inibito. Un' altra strada potrebbe essere quella di generare un interrupt ogni tot ms ed utilizzarlo per variare il contenuto del registro che si occuperà della temporizzazione del Ton.

Io però non so se ti conviene farlo in assembler, mi sa che è un programma che con un linguaggio ad alto livello si faccia al volo. Anche in assembler non è difficile ma sicuramente più impegnativo.
Avatar utente
Foto Utentedavidde
12,8k 4 9 12
G.Master EY
G.Master EY
 
Messaggi: 3886
Iscritto il: 2 ago 2007, 11:40
Località: Bologna

0
voti

[65] Re: servo comandati a distanza

Messaggioda Foto Utentegiozambi » 14 feb 2011, 22:45

ok... io so qualcosa in c++... l'incremento di un valore sarebbe relativamente semplice, ma è il resto che non riesco ad affrontare, fino ad adesso ho usato c++ per semplici programmini col computer ma mai per PIC, tu scommtto che sei in grado di usarlo...giusto? :D :mrgreen:
Avatar utente
Foto Utentegiozambi
310 3 9
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 2 feb 2011, 10:42
Località: Rovigo

0
voti

[66] Re: servo comandati a distanza

Messaggioda Foto Utentedavidde » 15 feb 2011, 10:34

Eh, purtroppo il C non lo conosco ancora, mi ci dedicherò non appena capisco bene l' assembler.
Per farlo in assembler mi serve un po' di tempo che in questi giorni non ho. Intanto prova a proporre qualche idea poi magari ne discutiamo.
Se cerchi bene in rete trovi sicuramente qualche firmware fatto per fare quello che ti serve e anche se lo trovi per un altro PIC con qualche modifica potresti adattarlo al tuo.
Avatar utente
Foto Utentedavidde
12,8k 4 9 12
G.Master EY
G.Master EY
 
Messaggi: 3886
Iscritto il: 2 ago 2007, 11:40
Località: Bologna

0
voti

[67] Re: servo comandati a distanza

Messaggioda Foto Utentegiozambi » 15 feb 2011, 16:53

oppure ho pensato:
dato che ho già modificato il programma per far compiere al servo quasi tutta la sua escursione (non 180° ma 170°, un po' meno), potrei diminuire il delay in modo da non consentire, alla pressione del tasto, l'intera escursione, ma per fare in modo che arrivi a fine corsa dovrei premerlo più volte; se per es. diminuisco il delay in modo da consentire al servo un breve tempo di rotazione per far sì che giri di 30°, per fargli compiere un giro completo dovrei premere il tasto 6 volte, così facendo avrei più posizioni intermedie...anzichè mettere 6 tasti con ognuno una durata diversa di ton...
Avatar utente
Foto Utentegiozambi
310 3 9
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 2 feb 2011, 10:42
Località: Rovigo

0
voti

[68] Re: servo comandati a distanza

Messaggioda Foto Utentedavidde » 15 feb 2011, 18:07

Puoi fare anche così ma è un ripiego non proprio elegante. Devi anche considerare che mediamente un servo ha una velocità di rotazione elevata (60° in 0,2s). Dopo il delay devi quindi fare in modo che se il pulsante è ancora premuto il microcontrollore non ripeta il ciclo ma attenda che venga rilasciato e poi premuto nuovamente.

Mi viene da pensare perché se devi svolgere una funzione del genere non utilizzi un motoriduttore in DC, sarebbe stato più semplice da pilotare e i finecorsa potevi farli meccanici e poi valutare se fossero impegnati con un comparatore e una resistenza di sense in serie al ponte che alimenta il motore. Troppa corrente = finecorsa raggiunto ...
Avatar utente
Foto Utentedavidde
12,8k 4 9 12
G.Master EY
G.Master EY
 
Messaggi: 3886
Iscritto il: 2 ago 2007, 11:40
Località: Bologna

0
voti

[69] Re: servo comandati a distanza

Messaggioda Foto Utentegiozambi » 15 feb 2011, 19:59

si controllare un motorino in dc sarebbe stato più semplice, ma ormai avevo il servo e in qualche modo dovevo usarlo, non posso permettermi di avere un servo da 16euro inutilizzato in casa...
comunque mi sa che opto per una soluzione più semplice, aggiungo un tasto e definisco 3 angoli che mi interessano di più; -60°, -15°, +75° e sono a posto.. mi basta copiare l'istruzione di una posizione già esistente, aggiungerla, modificare il ton e definire il piedino come ingresso: RB3...
Avatar utente
Foto Utentegiozambi
310 3 9
Frequentatore
Frequentatore
 
Messaggi: 231
Iscritto il: 2 feb 2011, 10:42
Località: Rovigo

0
voti

[70] Re: servo comandati a distanza

Messaggioda Foto Utentedavidde » 15 feb 2011, 20:48

Si, sono d' accordo. Ormai tornare indietro ha poco senso anche perché il servo, programma a parte, è più comodo. Intanto procedi come hai detto appena trovo un' attimo, se ritieni possa essere utile, guardo il programma e lo aggiusto per fare quello che ti serve. Dimmi soltanto una cosa. Indicativamente che angolo devi coprire ? Quello massimo (180°) ?
Avatar utente
Foto Utentedavidde
12,8k 4 9 12
G.Master EY
G.Master EY
 
Messaggi: 3886
Iscritto il: 2 ago 2007, 11:40
Località: Bologna

PrecedenteProssimo

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti