Pages: [1]   Go Down
Author Topic: Funzione derivata?  (Read 755 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21252
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Ivrea
Offline Offline
God Member
*****
Karma: 5
Posts: 680
"La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché." Albert Einstein
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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() )
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 110
Posts: 6975
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10448
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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)
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

(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.
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10448
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

e poi lavorando dimensionalmente si capisce subito se saltano fuori baggianate
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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.
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10448
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: [1]   Go Up
Jump to: