[RISOLTO] Contagiri sensore hall impreciso

Vorrei ricordare che l'interrupt gira all'interno del delay. Pertanto ipotizzando il motore che gira a 1400giri/min si otterra' 720 giri/min sulla puleggia che corrispondono a 12 giri/sec. (periodo T=83.3msec.). Quando si blocca l'interrupt con noInterrupt() la variabile ha contato, se il segnale e' buono, N=12. Per sfizio ho programmato un generatore esterno a producendo 12 impulsi (fronte salita-30us-fronte discesa cosi' sono piu' chiaro) ciascuno della durata di 30uS (scelta mia) e il risultato e' stato che dopo il no Interrupt() la variabile di conteggio era 12 e lasciando girare il programma la Seriale visualizzava sempre 12. Se moltiplichi 12*60 ottieni 720 giri/min. Per correttezza devo dire che per visualizzare i giri ho utilizzato la seriale e non un LCD, ma non credo che la scrittura sull'LCD pocca impegnare la CPU per piu ' 80ms. se non c'e' qualcosa che non va nel main.
A proposito, non ho capito la cosa della risoluzione di 60 sec. Se apri una finestra temporale di 1 secondo e conti gli impulsi in quel periodo ottieni la frequenza del segnale che stai contando. I frequenzimetri funzionano cosi'.

baubabit:
Se apri una finestra temporale di 1 secondo e conti gli impulsi in quel periodo ottieni la frequenza del segnale che stai contando. I frequenzimetri funzionano cosi'.

Esatto, se in un secondo conto 11 calcolo 660 rpm, se conto 12 calcolo 720 rpm, ma non potrò mai ottenere i valori compresi tra 660 e 720. Con un frequenzimetro l'unico modo per aumentare la risoluzione è aumentare il tempo di misura.

Innanzitutto in un secondo non ottieni 660 o 720 giri/min. ma ottieni giri/sec. Poiche' la posizione fisica del sensore e del magnete sono fissate a priori, anche se tu aprissi un gate di 2 secondi saresti obbligato dopo a dividere per 2 per ottenere i giri al secondo o a moltiplicare l'N ottenuto non per 60 ma per 30. Come vedi non cambia nulla. Ricordo che il perioto T e' l'inverso della frequenza. Se conti per 10 secondi avrai 12*10=120 impulsi/10secondi. Se vuoi ottenere i giri al minuto dovrai moltiplicare 120 *6 ottenendo 720 giri/min. Girala come vuoi ma la teoria e' questa. In piu' se attendi 10 secondi avrai un aggiornamento sul display ritardato di 10 secondi.

Con gate di 2 secondi la risoluzione passa a 30 rpm:

leggo 22 * 30 = 660
leggo 23 * 30 = 690
leggo 24 * 30 = 720

Con gate di 10 secondi la risoluzione passa a 6 rpm:

leggo 110 * 6 = 660
leggo 111 * 6 = 666
leggo 112 * 6 = 672

Per arrivare a gate di 60 secondi con risoluzione di 1 rpm.

Gli esempi che fai partono dalla premessa di misurare sempre lo stesso numero di impulsi/secondo con finestre temporali diverse, per cui il risultato finale ovviamente non cambia. Quello che cambia è il peso che ha un'unità del conteggio. Con la finestra di un secondo un'unità vale 60rpm, con la finestra da 10 secondi un'unità vale 6 rpm.

E quindi? Tradotto in soldoni? si può modificare il codice per ottenere risoluzioni più basse o no?

tradotto in soldoni: che te ne fai?
il motore è asincrono, scommettiamo? la sua velocità cambierà pochissimo
se speri di sapere se sovraccarichi il motore, sì, forse ci riesci, ma .... è questo il tuo scopo?

Standardoil:
tradotto in soldoni: che te ne fai?
il motore è asincrono, scommettiamo? la sua velocità cambierà pochissimo
se speri di sapere se sovraccarichi il motore, sì, forse ci riesci, ma .... è questo il tuo scopo?

Ho fatto una domanda ben precisa, se ti da fastidio i soldoni...li tolgo!!
Se non sai rispondere lascialo fare agli altri, voglio solo conoscere la velocità di rotazione della lama con più precisione possibile, uno volta che avrò uno strumento affidabile dovrò fare anche altre rilevazioni di velocità. Tutto qui. Il sovraccarico non centra nulla.

Se non so rispondere?
guarda che io i tuoi problemi te li ho indicati 7 pagine fa, non c'è bisogno di offendere, qualle che non è stato capace sei tu, non io
e assieme a me altri ti hanno anche indicato come fare quello che vuoi fare
segnalato

Standardoil:
non c'è bisogno di offendere, qualle che non è stato capace sei tu, non io

1° non ho offeso nessuno
2° certo che sono io quello che non sono capace...altrimenti non sarei venuto a chiedere aiuto qui nel forum.

Ringrazio tutti quelli che mi hanno aiutato, compreso te, volevo solo farti notare che a volte hai dei "modi di aiutare" che non condivido. E' giusto spronare un a persona a imparare, non è giusto fargli trovare la "pappa pronta" ma ci sono modi e modi. E con questo vorrei chiudere la discussione privata, senza rancore, anche perchè stiamo aggiungendo post inutili al thread.

Deve essere la primavera ... ::slight_smile:
... ovunque vedo persone che si "offendono" per un non nulla e rispondino in modo "stizzito" considerando le risposte poco cortesi.

Allora, come ho più volte ribadito, NON siete su un forum di "bonton" o di "buone maniere", siete su un forum "tecnico" dove la gente vi da risposte coincise e vi dice chiaramente "in faccia" ciò che va e ciò che non va! Inoltre dovete sempre condiderare che chi vi risponde sta comunque cercando di risolvere il vostro problema e non un suo problema, quindi ... tenete almeno conto di questo!

Tutto ciò premesso, non considero l'espressione che ha utilizzato Standardoil "tradotto in soldoni: che te ne fai?" né come una particolare "offesa" né una domanda che merita una risposta "stizzita" come quella che ha ricevuto ... era solo una giustificata richiesta per capire lo scopo di queste 8 pagine di thread!

Per cui, datevi tutti una calmata che se mi innervosisco anche io ... cominciano ad arrivare BAN come se piovesse.

Buon proseguimeto.

Guglielmo

P.S.: ... e no, prima che me lo si domandi, non ho nessuna particolare simpatia o antipatia per nessun utente e non difendo o accuso nessuno per simpatia o antipatia ... ho solo una visione distaccata ed obiettiva del tutto.

>Standaroli: ho rimosso il tuo ultimo post (quello delle ore 07:04). Come ti ho più volte chiesto, evita post che non siano prettamente tecnici e che, nel clima attuale, servono solo ad accendere "flames".

L'andamento del thread lo conosciamo tutti. Grazie.

Guglielmo

Grazie Guglielmo per i tuoi richiami, spero che gli animi si siano calmati in quanto questo non e' il Bar Sport. Manteniamo il dialogo entro i giusti binari.
Per Claudio. Hai ragione, il discorso che ho fatto ipotizzando che la velocita' a vuoto del motore non cambia. Se questa varia conterai un numero di impulsi minore o maggiore ma il ragionamento non cambia. Se apri una finestra temporale maggiore dovrai, a causa della variazione dei giri, eseguire una media per visualizzarla sul display. ma ripeto il discorso non cambia. Non e' il giro in piu' o in meno che preoccupa Flav ma e' la differenza abnorme che viene visualizzata rispetto a quella che dovrebbe leggere. Se in 1 secondo leggi 10Hz avrai 600 giri/sec, se al giro successivo ne leggi 11 allora avrai 660 giri/sec. ed inoltre non pensare che la velocita' di un motore ascincrono sia di per se fissa in quanto dipende dalla tensione di armatura, specialmente se collegato ad un carico. Per mantenerla fissa occorre un sistema di regolazione a retroazione. Vuoi la precisione assoluta del periodo di 1 giro, usa l'input capture oppure usa un encoder incrementale con due fasi in quadratura e otterrai la max precisione ma sempre all'interno di un giro in quanto non sai cosa accade al giro successivo. Se ti pone problemi la lettura che varia giro per giro allora puoi eseguire anche in questo caso la media delle letture fatte dividendo per il numero delle letture e visualizzare quella. Tenere un gate aperto per 10 secondi e contare gli impulsi che non sono mai uguali per ogni giro significa farne successivamente la media e quindi mascherare il comportamento del motore. Ma la domanda e' : serve?. Ricordiamoci di che tipo di grandezze stiamo parlando. Si ha un periodo di 84ms/giro che 'e una eternita' per la cpu. Faccio un rapido esempio. Ho costruito un misuratore di induttanza basato su un oscillatore Colpitts la cui frequenza varia al variare della induttanza incognita da misurare. Fissati i limiti max e min dell'induttanza incognita (pochi nH-1mH) ho squadrato il segnale sinusoidale di provenienza dall'oscillatore e poi diviso con un divisore che mi permettesse di entrare nell'input capture dell'ATMEGA328 e urilizzando l'inteerupt del timer interrut del Timer1 e l'antro interrupt dell'OVF sempre del Timer 1 ho acquistito il periodo completo dato dal numro di OVF + il tempo che intercorreva dall'ultimo OVF al tempo misurato dall'input capture. Con una serie di moltiplicazioni e divisioni ho ottenuto il valore della induttanza che, confrontato con lo strumento campione che ho era pressoche' identico. Questo non per vantarmi ma perche' occorre sempre tenere in mente su quali grandezze si sta operando e questa si chiama analisi di progetto.
Termino qui, io non ho piu' altro da dire in quanto quello che dovevo dire, non spiegare per carita cristiana, penso di averlo fatto gia' molte volte e il 3D comincia a diventare pesante.
Saluti a tutti e buon lavoro
Franco

baubabit:
Si ha un periodo di 84ms/giro che 'e una eternita' per la cpu

E infatti è dal post #13 di dieci giorni fa che dico che per frequenze così basse va misurato il periodo e non la frequenza (se lo si misura in microsecondi la risoluzione migliora di oltre mille volte arrivando a 0.05rpm) e le misure durano un decimo di secondo ciascuna :wink: Il codice è al post #79, basta provarlo.

Claudio_FF:
E infatti è dal post #13 di dieci giorni fa che dico che per frequenze così basse va misurato il periodo e non la frequenza (se lo si misura in microsecondi la risoluzione migliora di oltre mille volte arrivando a 0.05rpm) e le misure durano un decimo di secondo ciascuna :wink: Il codice è al post #79, basta provarlo.

Si Claudio oggi lo provo, l' ho sistemato ieri sera quell' errore che mi dava nel codice.

Fatta la prova col codice di Claudio FF (post#79) e devo dire che funziona egregiamente, 744 rpm fissi, vedi foto allegata, cioè una velocità verosimilmente possibile in base ai calcoli manuali fatti.

Grazie a tutti coloro che hanno dato un contributo alla soluzione del mio problema e ulteriori osservazioni sono ben accette.

Scusa Claudio FF se dovessi rilevare velocità superiori a 1000 RPM come va modificato il codice? (Post#79)
Grazie

if (t > 60000L)      // se < 1000 rpm

significa "se il periodo è maggiore di 60000"

metti un numero più piccolo di 60000L, ad esempio 30000L dovrebbe valere per giri <2000 rpm, se non sto scrivendo castronerie.

zoomx:
metti un numero più piccolo di 60000L, ad esempio 30000L dovrebbe valere per giri <2000 rpm

Si >Zoomx ho ridotto il valore a 30000 e mi rileva anche sopra i 1000 giri.
Ho rilevato la velocità di rotazione sulla puleggia motore e sono 1490 giri/min, cioè esattamante la metà che trovavo misurando sul volano (745) che rispetta quindi il rapporto di trasmissione di 2 : 1.

Perfetto.

Magari se cambi il titolo aggiungendo all'inizio un [Risolto] aiuterai altri a trovare questo utile post.