BaroneRosso.it - Forum Modellismo

BaroneRosso.it - Forum Modellismo (https://www.baronerosso.it/forum/)
-   Circuiti Elettronici (https://www.baronerosso.it/forum/circuiti-elettronici/)
-   -   Rallentare un servocomando in picbasic (https://www.baronerosso.it/forum/circuiti-elettronici/242389-rallentare-un-servocomando-picbasic.html)

sim176 13 marzo 12 19:57

Rallentare un servocomando in picbasic
 
Buona serata a tutti, ho realizzato un circuitino con un PIC 16F84 che, in base allo stato logico in un ingresso, mi muove un servocomando di 90°. Non sono un grande esperto, ma ho buttato giù 2 righe in picbasic, comando pulsout = 100 oppure pulsout = 200 in base allo stato logico. Fin quà tutto bene. Per rallentare il movimento del servo incremento il comando pulsout di una unità alla volta. Ottimo, funziona tutto! Il servo però si muove a piccoli scattini e si nota troppo. Penso di risolvere velocemente cambiando il quarzo da 4mhz a 8mhz, raddoppio tutti tempi e suddivido i 90° in 200 passi anzichè 100. Invece no, non funziona, il servo si posiziona in punti che non riesco a capire.
Qualcuno mi sa dire perchè?

ecco il codice che ho realizzato:

@ DEVICE XT_OSC ' sets programmer to external oscillator - low power, HS would be for faster xtals.

DEFINE OSC 4 ' for 4 mhz osc
TRISA=%11111111
TRISB=%00000000

ingresso var porta.0
uscita var portb.0
segnale var byte
segnale = 100

inizio:

if ingresso = 1 then
segnale = segnale + 1
else
segnale = segnale - 1
endif
if segnale > 200 then segnale = 200
if segnale < 100 then segnale = 100
pulsout uscita,segnale
pause 18
goto inizio

end

Grazie a tutti quelli che mi aiutano e anche quelli che non mi aiutano ma può essere utile

romoloman 13 marzo 12 21:16

Citazione:

Originalmente inviato da sim176 (Messaggio 3093370)
Buona serata a tutti, ho realizzato un circuitino con un PIC 16F84 che, in base allo stato logico in un ingresso, mi muove un servocomando di 90°. Non sono un grande esperto, ma ho buttato giù 2 righe in picbasic, comando pulsout = 100 oppure pulsout = 200 in base allo stato logico. Fin quà tutto bene. Per rallentare il movimento del servo incremento il comando pulsout di una unità alla volta. Ottimo, funziona tutto! Il servo però si muove a piccoli scattini e si nota troppo. Penso di risolvere velocemente cambiando il quarzo da 4mhz a 8mhz, raddoppio tutti tempi e suddivido i 90° in 200 passi anzichè 100. Invece no, non funziona, il servo si posiziona in punti che non riesco a capire.
Qualcuno mi sa dire perchè?

ecco il codice che ho realizzato:

@ DEVICE XT_OSC ' sets programmer to external oscillator - low power, HS would be for faster xtals.

DEFINE OSC 4 ' for 4 mhz osc
TRISA=%11111111
TRISB=%00000000

ingresso var porta.0
uscita var portb.0
segnale var byte
segnale = 100

inizio:

if ingresso = 1 then
segnale = segnale + 1
else
segnale = segnale - 1
endif
if segnale > 200 then segnale = 200
if segnale < 100 then segnale = 100
pulsout uscita,segnale
pause 18
goto inizio

end

Grazie a tutti quelli che mi aiutano e anche quelli che non mi aiutano ma può essere utile

Sicuro che non dipenda dal servo ? quelli particolarmente economici sono così penosi che fanno 40/50 step massimo... (ne ho trovati anche da 30 ovvero 3° per step)

sim176 13 marzo 12 21:30

Si ho notato che la differenza tra uno economico e di marca è notevole ( sotto tutti gli aspetti ), resta il fatto che non riesco a capire come mai non funziona come mi aspettavo.

Mrk89 13 marzo 12 21:47

Citazione:

Originalmente inviato da sim176 (Messaggio 3093631)
Si ho notato che la differenza tra uno economico e di marca è notevole ( sotto tutti gli aspetti ), resta il fatto che non riesco a capire come mai non funziona come mi aspettavo.

Dalla descrizione dei sintomi sembrerebbe un timer che va in overflow e che quindi gira "a caso". Giusto il ragionamento che hai fatto, ma bisognerebbe avere informazioni in più sulla funzione "pulseout". Come gestisce i prescaler?

sim176 14 marzo 12 18:28

Questo proprio non te lo saprei dire

marcosinatti 14 marzo 12 20:34

Due cose.
Se ricordo bene la durata del pulseout se raddoppi la frequenza di clock devi raddoppiarla, quindi se a 4Mhz arrivavi a 200 adesso devi arrivare a 400.
Prima della label inizio metti un Low Uscita per portare l'uscita a livello basso ad inizio programma perchè il pulseout lavora togglando, quindi se quando il programma parte trova l'uscita a livello alto ti lavora generando gli impulsi negati.
Il pause 18 non devi raddoppiarlo basta che usi DEFINE OSC 8 e lui ti ricrea la pausa corretta.
Magari non sono questi i problemi ma io proverei...

sim176 14 marzo 12 22:11

Infatti, era quello che pensavo anch'io quando ho creato il programma però non ha funzionato. A sto punto sospetto che il quarzo da 8mhz non "quarzi" correttamente. Appena ne recupero uno nuovo vi faccio sapere

MSchiepp 15 marzo 12 00:14

Citazione:

Originalmente inviato da marcosinatti (Messaggio 3095547)
...Se ricordo bene la durata del pulseout se raddoppi la frequenza di clock devi raddoppiarla, quindi se a 4Mhz arrivavi a 200 adesso devi arrivare a 400...

Giusto! Ma non puoi farlo se la variabile è definita come byte (valore massimo 255).

Michele

sim176 15 marzo 12 11:00

Azz, giusto, che svista. Devo definirla come word. Stasera provo e vi faccio sapere

sim176 15 marzo 12 19:07

Grazie MSchiepp, era proprio quello il problema, la variabile va definita come word.
A chi può essere utile, ecco lo stesso programmino funzionante con quarzo da 8mhz


@ DEVICE XT_OSC ' sets programmer to external oscillator - low power, HS would be for faster xtals.

DEFINE OSC 8 ' for 8 mhz osc
TRISA=%11111111
TRISB=%00000000

ingresso var porta.0
uscita var portb.0
segnale var word
segnale = 200

inizio:

if ingresso = 1 then
segnale = segnale + 1
else
segnale = segnale - 1
endif
if segnale > 400 then segnale = 400
if segnale < 200 then segnale = 200
pulsout uscita,segnale
pause 18
goto inizio

end

Grazie ancora


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

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