Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Problema servocomando

Elettronica lineare e digitale: didattica ed applicazioni

Moderatori: Foto Utentecarloc, Foto UtenteDirtyDeeds, Foto Utenteg.schgor, Foto UtenteIsidoroKZ, Foto UtenteBrunoValente

0
voti

[41] Re: Problema servocomando

Messaggioda Foto Utentec1b8 » 14 nov 2013, 20:26

fantamed ha scritto::-M "[#]" mannaggia e davvero molto dura,da solo non ci arrivo.

Non ci arrivi a fare cosa? Scrivi quello che hai provato a fare, perché e quali difficoltà trovi...
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[42] Re: Problema servocomando

Messaggioda Foto Utentefantamed » 15 nov 2013, 12:21

O_/ Come hai detto abbiamo un 16f84a con quarzo da 4mhz,2 microservo,sistema pan&tilt,e per pulsanti sarebbe un joystic 2cm x 2cm recuperato da un vecchio grosso telecomando e con i seguenti pin(comune,nord,sud,est,ovest)--(nord/ovest,nord/est, sud/ovest, sud/est ) dei quali uso solo su,giu,dx,sx.
Per le due velocita,potrei aggiungerne un pulsante a parte.
Avatar utente
Foto Utentefantamed
30 5
Frequentatore
Frequentatore
 
Messaggi: 110
Iscritto il: 8 nov 2013, 13:44

0
voti

[43] Re: Problema servocomando

Messaggioda Foto Utentec1b8 » 15 nov 2013, 16:36

Devi avere un momento di pazienza sorry , adesso non riesco a scriverti nulla, questa sera provo a scrivere un po' cosa dobbiamo fare e poi un po' di codice.
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

2
voti

[44] Re: Problema servocomando

Messaggioda Foto Utentec1b8 » 15 nov 2013, 18:38

A mio avviso dobbiamo dividere il programma in due parti: il generatore di PWM per controllare i servo ed il controllo dei pulsanti per stabilire i movimenti da effettuare.

Il segnale PWM da generare deve avere delle tempistiche ben definite e devono essere i tempi (sopratutto il tempo Ton) molti precisi altrimenti i servo si posizionano in modo diverso da quanto desiderato.
Il segnale di PWM deve inoltre essere continuo e non avere interruzioni.
Per questo motivo direi che conviene generarlo attraverso un Interrupt su Timer che ci garantisce tempi praticamente sempre uguali.
La posizione centrale di un servo si ottiene inviando un segnale Ton di 1,5 ms.
Volendo posizionare il servo in una qualsiasi posizione compresa tra i -45° ed i +45° rispetto la posizione centrale si deve poter generare un segnale Ton che varia da 1ms (-45°) a 2ms (+45°).
Abbiamo quindi un intervallo di 1000us per 90°, ovvero circa 11us per grado di rotazione.
NB: questi sono i normali dati di lavoro di servo standard, i servo in tuo possesso potrebbero avere valori leggermente diversi, ma il discorso che stiamo facendo non sarebbe diverso.
Supponendo quindi di voler ottenere posizionamenti a step di 1° avremmo bisogno di generare un segnale Ton con risoluzione di 11us.
Guardiamo adesso il datasheet del 16F84A. Con quel PIC che lavora a 4MHz, per generare un overflow del timer0 (condizione per cui genera un interrupt) dopo 1000us (tempo Ton minimo) si dovrebbe impostare il prescaler a 1/8 ed il timer0 a 131. Per ottenere un interrupt dopo 2000us avremmo bisogno di impostare il prescaler a 1/8 ed il timer0 a 6.
Variando quindi il solo valore del timer0, da un minimo di 6 ad un massimo di 131, possiamo ottenere 125 step di posizionamento con una risoluzione di 8us ovvero meno di 1 grado. Non riusciremo però ad avere un esatto posizionamento a 1500us, infatti la posizione centrale si ottiene con un valore del timer0 di 69 per un posizionamento di 1496us, o con un valore del timer di 68 per un posizionamento di 1504us
A mio avviso potrebbe essere accettabile, ma prima di andare avanti vorrei sapere la tua opinione e se fino a qui ti è chiaro come pensavo di procedere.
Tieni presente che realizzando la routine di interrupt in assembly è possibile ottenere una risoluzione pari ad 1us, quindi posizionamento assolutamente preciso, ma in C non credo ci riusciremo.
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

2
voti

[45] Re: Problema servocomando

Messaggioda Foto Utentefantamed » 15 nov 2013, 21:58

Vediamo se ho capito bene,intendi sfruttare l'interrupt per il movimento dei servi come mi avevi gia accennato;il servo si muovera a step di 1° alla volta cioe 11us circa,ovvero 11x90=990 che sarebbero i 1000 us dell'intervallo tra -45 e +45. cioe 90°
poi devo dividere la frequenza per 8 tramite il prescaler (1/8) e assegnare al timer0 il valore 6 per iniziare a muovere da -45 di 1 grado alla volta fino a (+45 timer0 131) cioe timer0 da 6 a 131 compie 125 step per i 90°.
e Cosi?
O_/
Avatar utente
Foto Utentefantamed
30 5
Frequentatore
Frequentatore
 
Messaggi: 110
Iscritto il: 8 nov 2013, 13:44

1
voti

[46] Re: Problema servocomando

Messaggioda Foto Utentec1b8 » 15 nov 2013, 23:46

Si, attenzione che in questo modo non ci posizioniamo esattamente al centro ma vicini al centro... ti va bene questo posizionamento e questa precisione (8us)?
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[47] Re: Problema servocomando

Messaggioda Foto Utentefantamed » 16 nov 2013, 0:26

si va bene (8us) infondo la differenza dovrebbe essere appena 1.5°/ 2°circa dal centro,e cosi?
Avatar utente
Foto Utentefantamed
30 5
Frequentatore
Frequentatore
 
Messaggi: 110
Iscritto il: 8 nov 2013, 13:44

2
voti

[48] Re: Problema servocomando

Messaggioda Foto Utentec1b8 » 16 nov 2013, 1:17

Anche meno, dovremmo avere uno sposizionamento rispetto al centro inferiore al grado.

Abbiamo visto come possiamo generare un Ton variabile per il nostro segnale PWM: basta variare il timer0.
Quando si verifica un interrupt portiamo alto il segnale di controllo del servo, impostiamo il valore del timer sul valore necessario ad ottenere un nuovo interrupt dopo il tempo Ton richiesto e usciamo dalla routine di interrupt.
Al successivo interrupt, quindi quando finisce il Ton, la routine di interrupt dovrà portare bassa il segnale di controllo ed impostare il timer al prossimo interrupt. Ma quando deve avvenire il prossimo interrupt?
Per rispondere a questa domanda dobbiamo considerare che:
1) la nostra routine deve gestire 2 servo e non 1
2) il segnale PWM non è composto solo dal Ton ma anche da un tempo Toff e Ton+Toff deve essere di 20ms per ogni servo

Una routine di interrupt è bene abbia una durata (tempo di esecuzione della routine) al massimo pari alla metà del tempo che intercorre tra un interrupt ed il successivo. Questo significa che non possimo generare degli interrupt ogni 8 o 10 us (valori bassi scelti a caso) in quanto la nostro routine durerà sicuramente di più.
Non possiamo cioè ipotizzare che al primo interrupt entrambi i segnali di controllo siano portati alti, che si verifichi un interrupt allo scadere del primo Ton ed uno allo scadere del secondo Ton. Potrebbe infatti essere che il primo Ton abbia durata 1000us ed il secondo una durata di 1008us. Sarebbero necessari 2 interrupt a distanza di 8us l'uno dall'altro e questo abbiamo detto che è impossibile.
Quello che possiamo fare è iniziare il periodo Ton del secondo servo quando termina il primo. In questo modo tra un interrupt ed il successivo c'è sicuramente tempo a sufficienza.
Supponendo quindi di avere il Ton1=1000us ed il Ton2=1008us avremo la routine che si comporta in questo modo:
- primo interrupt --> alto segnale servo1, basso segnale servo2, imposto timer per 1000us (Ton1)
- secondo interrupt --> basso segnale servo1, alto segnale servo2, imposto timer per 1008us (Ton2)
- terzo interrupt --> basso segnale servo1 e segnale servo2, imposto timer per arrivare a 20ms.
Ma come faccio a sapere come impostare il timer al terzo interrupt? La durata del Ton1 e del Ton2 sono diversi e variabili ed il tempo necessario a completare i 20ms per il servo1 è diverso dal tempo necessario a completare i 20ms del servo2.
Si rivolve in questo modo:
- primo interrupt --> alto segnale servo1, basso segnale servo2, imposto timer per 1000us (Ton1)
- secondo interrupt --> basso segnale servo1 e segnale servo2, imposto timer per avere un interrupt dopo 2500-Ton1 us. Ossia imposto il timer per 1500us
- terzo interrupt --> basso segnale servo1, alto segnale servo2, imposto timer per 1008us (Ton2)
- quarto interrupt --> basso segnale servo1 e segnale servo2, imposto timer per avere un interrupt dopo 2500-Ton2 us. Ossia imposto il timer per 1492us
- dal quinto al sedicesimo interrupt imposto il timer per avere 1250us al prossimo interrupt

In questo modo ogni 2 interrupt ho sempre un intervallo di 2500us, dopo 16 interrupt sono trascorsi esattamente 20ms ed il ciclo ricomincia.

Unica cosa da fare è valorizzare 2 variabili per ogni servo:
- la prima variabile contiene il valore da asseganre al timer per ottenere il tempo di Ton (ovvero per la posizione che voglio ottenere)
- la seconda variabile contiene il valore da assegnare al timer per raggiungere il tempo di 2500us, tempo calcolato come differenza tra 2500 ed il Ton presente nella prima variabile.

Queste 2 variabili per servo saranno calcolate e valorizzate con calma dal corpo principale del programma che controlla e decide di conseguenza la situazione dei pulsanti.

Ho fatto troppa confusione?
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

1
voti

[49] Re: Problema servocomando

Messaggioda Foto Utentefantamed » 16 nov 2013, 2:07

ok fabio tutto chiaro il meccanismo ed il metodo per la gestione dei due servi tra un'interrupt e l'altro.
non riesco a capire pero la cifra 2500 ?
Avatar utente
Foto Utentefantamed
30 5
Frequentatore
Frequentatore
 
Messaggi: 110
Iscritto il: 8 nov 2013, 13:44

2
voti

[50] Re: Problema servocomando

Messaggioda Foto Utentec1b8 » 16 nov 2013, 9:11

2500 è un valore scelto a caso ma non troppo.
Si tratta di rendere costante il tempo che intercorre tra l'inizio del Ton del servo1 e l'inizio del Ton del servo2.
Dal momento che il Ton del servo1 ha una durata che varia tra 1000 e 2000us, questo tempo costante deve essere maggiore di 2000, ma non troppo vicino a 2000 altrimenti si corre il rischio di avere 2 interrupt (la fine del Ton1 e l'inizio del Ton2) troppo vicini. Diciamo quindi che dovrà essere di almeno 2100us. Questo tempo costante non può nemmeno essere troppo lontano dal 2000 altrimenti quando Ton1 vale 1000 non riuscimo più a generare l'intervallo di tempo necessario a raggiungere questo valore costante.
Abbiamo detto che il nostro timer ha un prescaler pari a 8 ed il PIC lavora a 4MHz, pertanto potremmo generare un interrupt per overflow del timer al massimo dopo 256*8=2048 us, che sommati ai 1000 del Ton minimo ci dicono che il nostro tempo costante tra l'inizio del primo Ton e l'inizio del secondo Ton può essere al massimo 2048+1000=3048 us. Deve essere quindi un valore compreso tra 2100 e 3048.
Considerato che dobbiamo poi raggiungere i 20ms come somma di questi intervalli regolari, poniamo questo tempo pari a 2500 (valore compreso nel range) così da riuscire a generare nei 20ms esattamente 20000/2500=8 intervalli esatti.
Potremmo cioè comandare fino a 8 servo.

Adesso bisogna scrivere questa routine di interrupt, vuoi provarci?
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

PrecedenteProssimo

Torna a Elettronica generale

Chi c’è in linea

Visitano il forum: Nessuno e 30 ospiti