BaroneRosso.it - Forum Modellismo

BaroneRosso.it - Forum Modellismo (https://www.baronerosso.it/forum/)
-   Circuiti Elettronici (https://www.baronerosso.it/forum/circuiti-elettronici/)
-   -   aumentare l'estensione dei servi (https://www.baronerosso.it/forum/circuiti-elettronici/191219-aumentare-lestensione-dei-servi.html)

faustog_2 28 ottobre 10 01:43

aumentare l'estensione dei servi
 
salve volevo aprire una discussione che si è parlato in altri ambiti però qui volevo farlo in materia di microcontrollori.
Premetto che con il 16F628 riesco a leggere i dati (impulsi) che arrivano dalla ricevete e posso quindi manipolarli come voglio.. .quello che però vorrei un attimo condivere con voi è il problema che se arriva un inpulso più di 1,5 mS ok ..basta solo allungarlo creando un ulteriore ritardo... ma se dovesse arrivare un inpulso inferiore a 1,5 mS come faccio ad andare indietro nel tempo????? !!!!!!

be per questo la prima cosa che mi viene in mente è posticipare tutto inviando nuovamente lo stesso inpulso al servo poi però bufferizzando il segnale precedente ne creo uno con un tempo inferiore in modo da scendere fino per esempio a 0.5 mS per cui alla fine potrei aumentare la corsa di un servo da 0.5 mS a 2,5 mS... anzichè da 1 a 2 mS ...

Che ne pensate di questa soluzione?
si accettano consigli..
Di seguito una piccola routine fatta stamani per catturare l'impulso proveniente dalla RX (la ricenvente è un' Hitec AFHSS 2,4 Ghz )




BSF STATUS,RP0 ; ** BANK1 **

MOVLW b'00000000'
MOVWF TRISB ; portB all pins output

MOVLW b'11110001'
MOVWF TRISA ; RB7-RB4 and RB1(RX)=input, others output

BCF STATUS,RP0 ; ** BANK0 **

CLRF COUNT
CLRF PORTB
MAIN BTFSS PORTA,0 ; IF (bit 0 di PORTA è = 1)
GOTO MAIN

MOVLW 178 ;
MOVWF CL ;
GOTO $+1 ;
GOTO $+1 ;
DECFSZ CL,F ;
GOTO $-2 ;

XX BTFSS PORTA,0
GOTO SHOW

INCF COUNT,F ; attesa di 2uS
GOTO XX ; attesa di 2uS
SHOW MOVF COUNT,W
MOVWF PORTB
CLRF COUNT
GOTO MAIN

END

illez 28 ottobre 10 09:37

Non son sicuro di aver capito bene; se volessi leggere il segnale di ingresso per produrne uno diverso in uscita, io disaccoppierei le due cose.
Da un lato il processo di input, gestito tramite interrupt, dall'altro il processo di output che genera il segnale.
Il processo di input imposta una variabile condivisa che è la lunghezza dell'impulso ricevuto; il processo di output, in base al valore di questa variabile genera il segnale di output.

Domanda: ma se vuoi estendere la corsa dei servi, lo devi fare in entrambe le direzioni, quindi non puoi semplicemente aumentare la durata dell'impulso ma anche, nell'altro verso, diminuirla. Giusto?
:wink:

faustog_2 29 ottobre 10 10:36

ok
 
hai capito benissimo...

...praticamente è la stessa cosa... anzichè gestire il segnale di ingresso con l'interrupt.. lo leggo normalmente dal pin ..con uno sfasamento di un ventesimo di secondo viene dato in uscita in un altro pin, una risposta..
..comunque la soluzione proposta da te, è più accademica, secondo è più elegante..

appena ci metto le mani, ti faccio sapere.

a dopo
fausto


Citazione:

Originalmente inviato da illez (Messaggio 2282302)
Non son sicuro di aver capito bene; se volessi leggere il segnale di ingresso per produrne uno diverso in uscita, io disaccoppierei le due cose.
Da un lato il processo di input, gestito tramite interrupt, dall'altro il processo di output che genera il segnale.
Il processo di input imposta una variabile condivisa che è la lunghezza dell'impulso ricevuto; il processo di output, in base al valore di questa variabile genera il segnale di output.

Domanda: ma se vuoi estendere la corsa dei servi, lo devi fare in entrambe le direzioni, quindi non puoi semplicemente aumentare la durata dell'impulso ma anche, nell'altro verso, diminuirla. Giusto?
:wink:


illez 29 ottobre 10 18:36

Non è più accademica o elegante, è l'unica praticabile.
Pensaci: hai due oggetti (l'input e l'output) che vanno a velocità diverse.
Non possono andare a velocità diverse se uno (l'out) aspetta l'altro.

Del resto tu stesso ti sei reso conto del problema :wink::D

romoloman 29 ottobre 10 23:09

Citazione:

Originalmente inviato da illez (Messaggio 2284468)
Non è più accademica o elegante, è l'unica praticabile.
Pensaci: hai due oggetti (l'input e l'output) che vanno a velocità diverse.
Non possono andare a velocità diverse se uno (l'out) aspetta l'altro.

Del resto tu stesso ti sei reso conto del problema :wink::D

Scusa ma non capisco...

facendo una simulazione su una scala dei tempi:
T=0 Misuro l'impulso, supponiamo sia 1800uS
T=1800 Genero l'impulso 2000
T=3800 Mi metto a riaspettare il nuovo input
T=20000 Arriva il nuovo impulso...

Non capisco dove serva l'interrupt, ma anche andando all'indietro
T=0 Misuro l'impulso 1200
T=1200 Genero l'impulso 1000
T=2200 Mi metto a riaspettare il nuovo impulso
T=20000 Arriva il nuovo...

I due impulsi non vanno a velocità diverse hanno solo lunghezza diversa ma, se si vuole stare nello standard, la ripetizione è 50 hz.
Scomodare la gestione degli interrupt in questo caso non serve, la base dei tempi dei 50hz te la da la ricevente, non è necessario gestire anche la durata della pausa dell'impulso generato.

illez 29 ottobre 10 23:43

Citazione:

Originalmente inviato da romoloman (Messaggio 2284846)
...
I due impulsi non vanno a velocità diverse hanno solo lunghezza diversa ma, se si vuole stare nello standard, la ripetizione è 50 hz.
Scomodare la gestione degli interrupt in questo caso non serve, la base dei tempi dei 50hz te la da la ricevente, non è necessario gestire anche la durata della pausa dell'impulso generato.

Probabilmente sono stato portato fuori strada dalla domanda, perché è vero, il periodo può variare da 20 a 30ms mentre l'impulso tra 1 e 2ms.
L'interrupt non è necessario, basta leggere il timer per calcolare la durata dell'impulso.
Forse l'interrupt può tornare utile se il firmware fa anche altre cose, ma se fa solo quello direi che si può evitare.
Allora, sarà l'ora tarda, ma continuo a non capire la domanda iniziale.
:unsure:
Che vuol dire tornare indietro nel tempo?
Forse appena arriva alto l'impulso in ingresso lo porti alto anche in uscita e quindi non puoi farlo più breve di quanto ricevi (a meno di predire il futuro)?
Se questa era la domanda, direi che il flusso è sbagliato. Misuri impulso, generi di conseguenza l'impulso in out, più breve o più lungo.

romoloman 31 ottobre 10 04:00

Credo che la domanda iniziale fosse generata dalla voglia di far partire l'impulso in uscita in contemporanea con quello in entrata, ma la cosa è assolutamente inutile ed totalmente infattibile..

faustog_2 31 ottobre 10 17:02

ok
 
il problema è che se fosse solo leggere un impulso e poi come risposta sommare un ritardo opportuno.. il discorso era già risolto... ma in caso di impulsi al di sotto dei 1500 uS occorre avere un ritardo ancora più breve... quindi come intuito qui da tutti IMPOSSIBILE.. per questo si può optare nel rielaborare il ritardo durante la pausa dei 20 - 30 millisecondo e quindi dare risposta opportuna diminuendo il ritardo. tutto qui

Citazione:

Originalmente inviato da romoloman (Messaggio 2286069)
Credo che la domanda iniziale fosse generata dalla voglia di far partire l'impulso in uscita in contemporanea con quello in entrata, ma la cosa è assolutamente inutile ed totalmente infattibile..


romoloman 31 ottobre 10 23:00

Citazione:

Originalmente inviato da faustog_2 (Messaggio 2286673)
il problema è che se fosse solo leggere un impulso e poi come risposta sommare un ritardo opportuno.. il discorso era già risolto... ma in caso di impulsi al di sotto dei 1500 uS occorre avere un ritardo ancora più breve... quindi come intuito qui da tutti IMPOSSIBILE.. per questo si può optare nel rielaborare il ritardo durante la pausa dei 20 - 30 millisecondo e quindi dare risposta opportuna diminuendo il ritardo. tutto qui

Scusami Fausto, ma forse se tu usassi una teminologia opportuna ti si capirebbe meglio.
Tu devi generare un impulso PWM con frequenza totale di 50Hz in base ad un impulso che ti arriva.
Che i due impulsi inizino asseme non ti importa nulla, ne tantomeno importa al servo.
Pertanto l'unica cosa che devi fare è:
leggere l'impulso, calcolare la durata di quello da generare in base alla tua funzione di trasformazione e generare l'impulso in uscita.
Non centrano nulla i ritardi o gli anticipi (credo sia la corretta definizione di "ritardo ancora più breve")

In picbasic il tuo problema lo si risolve con ben 8 righe di codice.
Esempio per aumentare del 20% le corse:

while 1=1
a=pulsin(gpio.portain,1);
if (a!=0) then
b=((a-150)*1.2)+150;
low gpio.portaout;
pulsout(gpio.portaout, b,1);
endif
wend

Alla fine non mi sembra così complesso...

faustog_2 02 novembre 10 10:38

ok
 
scusami se uso terminologia marziana!
appena ho tempo cerco di tradurre tutt oin termini di assembler
..comunque mi la tua osservazione coincide con la mia .. però detta meglio da te ovviamente..

a dopo


Citazione:

Originalmente inviato da romoloman (Messaggio 2287153)
Scusami Fausto, ma forse se tu usassi una teminologia opportuna ti si capirebbe meglio.
Tu devi generare un impulso PWM con frequenza totale di 50Hz in base ad un impulso che ti arriva.
Che i due impulsi inizino asseme non ti importa nulla, ne tantomeno importa al servo.
Pertanto l'unica cosa che devi fare è:
leggere l'impulso, calcolare la durata di quello da generare in base alla tua funzione di trasformazione e generare l'impulso in uscita.
Non centrano nulla i ritardi o gli anticipi (credo sia la corretta definizione di "ritardo ancora più breve")

In picbasic il tuo problema lo si risolve con ben 8 righe di codice.
Esempio per aumentare del 20% le corse:

while 1=1
a=pulsin(gpio.portain,1);
if (a!=0) then
b=((a-150)*1.2)+150;
low gpio.portaout;
pulsout(gpio.portaout, b,1);
endif
wend

Alla fine non mi sembra così complesso...



Tutti gli orari sono GMT +2. Adesso sono le 11:53.

Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002