Go Down

Topic: Funzione derivata? (Read 1 time) previous topic - next topic

Salve,
avrei questo problema...devo fare la derivata della posizione di un encoder al fine di trovare la velocità...Esiste la funzione derivata?

uwefed

No, non esiste la funzione di deriva.
Devi misurare o i giri in un periodo di tempo o quanto tempo dura una giro o frazione di giro della ruota. Con la circonferentza riesci a calcolare la velocitá.
Ciao Uwe

astrobeed


avrei questo problema...devo fare la derivata della posizione di un encoder al fine di trovare la velocità...Esiste la funzione derivata?


Non devi fare la derivata, anche se dal punto di vista matematico quello che dici è corretto, devi misurare il tempo tra due click successivi dell'encoder, noto lo spazio corrispondente ad un click ottieni la velocità applicando V = S/T, si presuppone che tra due click successivi ci si trova in condizione di moto uniforme, eventuali errori dovuti ad accelerazioni vengono automaticamente compensati nelle letture successive.

Janos

La derivata è impossibile da calcolare in quanto vorrebbe dire che il sistema dovrebbe sapere la velocità dell'istante successivo a quello in esame. Quello che più si può avvicinare al calcolo della derivata è come ti ha detto uwe, ovvero il "rapporto incrementale" oppure come ti ha detto astro. Io personalmente preferisco la prima soluzione perché se l'encoder gira molto veloce riuscire a leggere quanto tempo passa fra due passi dell'encoder può non essere semplice e rischi di introdurre un errore considerevole nella misura.

astrobeed


perché se l'encoder gira molto veloce riuscire a leggere quanto tempo passa fra due passi dell'encoder può non essere semplice e rischi di introdurre un errore considerevole nella misura.


Diciamo che hai toccato uno dei punti sensibili di Arduino, ovvero l'impossibilità di realizzare un controllo pid, o di altro tipo, decente basato su encoder ad alta risoluzione calettati direttamente sull'asse motore, prassi usuale quando serve controllare con precisione il movimento di un motore, il tutto da farsi almeno 1000 volte al secondo :)

se qualcuno di voi ha uno sketch pronto se possibile me lo postate cosi prendo qualche spunto?
cmq sembrerebbe + facile la soluzione proposta da astrobeed...però in ogni caso dovrei far uso della funzione millis() e poi dovrei azzerarla.
Il problema principale è che già utilizzo la funzione millis() e la azzero per un altro scopo...


Praticamente per adesso vi ho presentato questo problema: "trovare la velocità dell encoder"
però in realtà sto cercando di creare un progetto dove controllo un motore in corrente continua. Il suddetto motore deve seguire un riferimento che varia al variare del tempo ( e quindi faccio utilizzo di millis() )

PaoloP

Perché dovresti azzerare millis invece di fare T-T0.


astrobeed


Praticamente per adesso vi ho presentato questo problema: "trovare la velocità dell encoder"


Dipende molto dalle caratteristiche del motore, dell'encoder e dove è montato, non ultimo da quello che vuoi fare esattamente, però potrebbe essere possibile l'uso della pulsein() per misurare il tempo tra due click dell'encoder.
Comunque Arduino e controllo motori tramite encoder sono due cose che non vanno molto d'accordo assieme a meno che non parliamo di applicazioni molto semplici dove non interessa la precisione, l'encoder è a bassa risoluzione e non gira veloce.

lesto


se qualcuno di voi ha uno sketch pronto se possibile me lo postate cosi prendo qualche spunto?
cmq sembrerebbe + facile la soluzione proposta da astrobeed...però in ogni caso dovrei far uso della funzione millis() e poi dovrei azzerarla.
Il problema principale è che già utilizzo la funzione millis() e la azzero per un altro scopo...


(rad2-rad1)/(s2-s1) = rad/s

dove "rad" sta per posizione attuale dell'encoder in radianti (o in qualsiasi altra misura, ovviamente il risultato non sarà più in radianti/secondi ma in AltraMisura/secondi) diviso "i secondi" a cui sono state fatte le due misure, se non usi i secondi o millisecondi ovviamente vale lo stesso discorso di usare un altra misura con i rad.

pseudocodice:

Code: [Select]

tempo1=0
rad1=0
loop
   tempo2=micros()
   rad2=posizioneAttuale()
   velocitaRadAlMicrosecondo = (rad2-rad1)/(tempo2-tempo1);
   velocitaRadAlSecondo = velocitaRadAlMicrosecondo *1000*1000; //*1000 = al millisecondo, di nuovo *1000 al secondo
   //salva i dati per la prossima "derivata", ovviemete al primo giro non avendo dati reali per rad1 e tempo1 la velocità sarà errata
   tempo1=tempo2
   rad1=rad2


ricordo in oltre che valgono gli errori introdotti dalla derivazione; come dice astro arduino ha una precisione minima (deltaT) di 4microsecondi, di conseguenza la velocità massima rilevabile è.... (compitino per casa ahah)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

astrobeed


(rad2-rad1)/(s2-s1) = rad/s

dove "rad" sta per posizione attuale dell'encoder in radianti (o in qualsiasi altra misura, ovviamente il risultato non sarà più in radianti/secondi ma in AltraMisura/secondi)


Va bene che lavori all'UCCAS (Ufficio Centrale Complicazione Affari Semplici) però questo è troppo pure per te  :smiley-mr-green:
La cosa è semplicissima, basta sapere quanti click ha l'encoder e calcolarsi una volta per tutte la costante di conversione con cui moltiplicare/dividere il tempo tra due, o più, click per ottenere la velocità nell'unità di misura desiderata.
Esempio pratico, l'encoder fornisce 12 impulsi per ogni rotazione dell'asse motore, per conoscere la sua velocità in rpm basta dividere 60 con il tempo, espresso in secondi, tra due impulsi consecutivi moltiplicato per 12 (tempo per una rotazione completa), ovvero "5/tempo" (60/12=5), ovviamente è possibile aggiustare la costante per usare i millisecondi, o i microsecondi, al posto dei secondi per il computo del tempo.

lesto

eh ma il bello della formulina UCAS è che se la applichi di nuovo hai l'accelerazione :)

e poi lavorando dimensionalmente si capisce subito se saltano fuori baggianate
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

astrobeed


eh ma il bello della formulina UCAS è che se la applichi di nuovo hai l'accelerazione :)


L'accelerazione è data dalla variazione del tempo tra due misure successive.

Quote

e poi lavorando dimensionalmente si capisce subito se saltano fuori baggianate


Perché cosa c'è di strano nel calcolo "costante / tempo" che fornisce una frequenza (1/s = Hz) ? Dimensionalmente corretto e verificabile se inserisci le unità di misura nel calcolo.

lesto

Quote
Perché cosa c'è di strano nel calcolo "costante / tempo" che fornisce una frequenza (1/s = Hz) ? Dimensionalmente corretto e verificabile se inserisci le unità di misura nel calcolo.

non capivo se ucas per il metodo o per il fatto di aver scritto la formula usando le unità di misura (unità dimensionali, si dice?)

Quote
L'accelerazione è data dalla variazione del tempo tra due misure successive.

eh appunto, se la applichi al rad/s invece che al rad ottieni rad/s^2
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up