Go Down

Topic: Gestione numeri elevati (Read 1 time) previous topic - next topic

Stilita

Mar 18, 2017, 05:41 pm Last Edit: Mar 18, 2017, 05:49 pm by Stilita
Salve, vorrei provare a costruire uno strumento da laboratorio, con Arduino, il programma gira bene su desktop con Qbasic, vorrei convertirlo, ma ho una sola difficoltà, spiego che cosa deve fare :
digito su tastiera il valore di una resistenza che mi serve per taratura, ma di valore non standard e il programma mi genera le due resistenze(standard) da mettere in parallelo per ottenere l'incognita.
Il programma è semplice, ma quando arrivo alla formula del parallelo al numeratore c'è da moltiplicare
due valori, che possono essere molto alti e superare il limite dato da unsigned long che è 4,294,967,295
Esempio la resistenza da 666.666 viene generata da queste due  R1=1.200.000   R2= 1.500.000
ma se faccio la prima moltiplicazione viene un numero enorme, potrei prima dividerle per esempio 1000
e poi rimoltiplicare per 1000...mah
In conclusione come posso gestire la formula ((R1*R2)/(R1+R2))

Grazie
...non sapete quanto ho cercato...pfui pfui
prima di rivolgermi al forum...

astrobeed

Il problema non è il valore oltre 4 miliardi, per quello si possono usare i float visto che possono contenere un numero compreso tra 1,175494351 E - 38 e 3,402823466 E + 38, il problema è la precisione perché i float al massimo hanno 6-7 cifre significative, tutte le altre sono degli zero.
Su i micro a 8 bit i compilatori sebbene prevedono i double, per motivi di portabilità, li trattano come dei float, quindi solo 32 bit e non 64.
Se non mi ricordo male dovrebbe esistere una libreria per Arduino che permette gestire valori interi molto grandi, mi pare oltre le 12 cifre, però supporta solo le quattro operazioni matematiche di base, nel tuo caso questo non dovrebbe essere un problema.
Scientia potentia est

Stilita

Se non mi ricordo male dovrebbe esistere una libreria per Arduino che permette gestire valori interi molto grandi, mi pare oltre le 12 cifre, però supporta solo le quattro operazioni matematiche di base, nel tuo caso questo non dovrebbe essere un problema.
Una volta trovata  la libreria che dici, poi devo sempre usare unsigned long?

Grazie
...non sapete quanto ho cercato...pfui pfui
prima di rivolgermi al forum...

marcomg

#3
Mar 18, 2017, 06:25 pm Last Edit: Mar 18, 2017, 06:31 pm by marcomg
Una volta trovata  la libreria che dici, poi devo sempre usare unsigned long?
Non conosco la libreria in questione, ma o si tratta di una struttura dati in c e quindi sarà di tipo struct NomeStruttura e la manipolerai con funzioni apposite, oppure utilizzi una classe c++ tipo C++ Big Integer Library (però questa qui che ti ho messo non è più mantenuta, non ho idea se ce ne siano di nuove) e in questo caso il tipo di dato sarà BigInteger.
In ogni caso c'è GMP e qui http://www.gammon.com.au/forum/?id=11519 un porting per arduino, ma non è super recente.

uwefed

Poi c'é un altro problema di fondo che non stai considerando.
Una resistenza da 1kOhm non ha la resistenza 1000,000 Ohm ma a secondo la tolleranza il 5% o se sono migliori 1%. Questa tolleranza non é solo di quanto é preciso il valore ma include tutte le fonti di errore come l' invecchiamento, effetto della temperatura, inprecisione nella produzione ecc.

Il Tuo programma in questo modo non ha nessun senso. Se hai bisogno di reseistenze con valori ultraprecisi devi prenderli con una toleranza bassa e in quel caso ci sono molto piú valori disponibili.

Ciao Uwe

Stilita

#5
Mar 19, 2017, 10:35 am Last Edit: Mar 19, 2017, 10:46 am by Stilita
Poi c'é un altro problema di fondo che non stai considerando.


Il Tuo programma in questo modo non ha nessun senso. Se hai bisogno di reseistenze con valori ultraprecisi devi prenderli con una toleranza bassa e in quel caso ci sono molto piú valori disponibili.

Ciao Uwe
Il programma sono 15 anni che funziona, su pc, e tariamo le apparecchiature alla grande e senza usare le tabelle di ricerca di resistenze in parallelo, che sono più approssimate.
Uso resistenze all' 1%.
Le procedure di taratura prevedono il posizionamento di resistenze in parallelo, e quindi le metto senza stare a farmi tanti pensieri.
Ciao



     
...non sapete quanto ho cercato...pfui pfui
prima di rivolgermi al forum...

marcomg

#6
Mar 19, 2017, 10:43 am Last Edit: Mar 19, 2017, 10:48 am by marcomg
ne metto 2 in parallelo da 1100 e l' errore è 0% è resta la sola tolleranza dell'1%
Beh, in teoria gli errori si sommano... Quindi con 2 in parallelo la tolleranza è al 2% (in realtà non proprio al 2% ma come prima approssimazione possiamo dire di si) :(

astrobeed

Una soluzione alternativa che consente di lavorare esclusivamente con gli uint32_t mantenendo una precisione sul calcolo migliore del 0.5%, a patto che il massimo valore di ohm utilizzato sia inferiore a 15 Mhom.
Come prima cosa prendiamo in considerazione la formula generica per le resistenze in parallelo, e non quella per il caso particolare di solo due resistenze, ovvero R = 1/(1/R1 + 1/R2 + 1/Rn), poi usiamo il "trucco" di mettere al posto di 1 il valore 4.000.000.000, in questo modo possiamo usare solo valori interi senza ricorrere ai float.
In pratica il calcolo diventa 4.000.000.000/(4.000.000.000/R1 + 4.000.000.000/R2), perfettamente alla portata di Arduino e l'errore finale rimane nettamente minore della tolleranza delle resistenze.
Esempio pratico, ipotizzando di applicare il calcolo a una coppia di resistenze da 1 Mohm abbiamo:

4.000.000.000/ 1.000.000 = 4000
4.000.000.000 / 8000 = 500.000

Scientia potentia est

Stilita

#8
Mar 19, 2017, 11:32 am Last Edit: Mar 19, 2017, 11:48 am by Stilita
Una soluzione alternativa che consente di lavorare esclusivamente con gli uint32_t


Il suggerimento matematico sembra molto valido.
Però adesso devo capire cosa sono uint32_t...ehm
...mi aggiorno...bye


...non sapete quanto ho cercato...pfui pfui
prima di rivolgermi al forum...

Stilita

Beh, in teoria gli errori si sommano... Quindi con 2 in parallelo la tolleranza è al 2% (in realtà non proprio al 2% ma come prima approssimazione possiamo dire di si) :(
Non credo!

Voglio una resistenza da 550, non c'è, il programma mi dice di metterne 2 in parallelo da 1100.
Caso più favorevole le trovo sbilanciate in verso opposto:
una è da 1111, e l'altra è 1089, resistenza totale  549,945 ohm, 0,0055 % errore
e non più l' 1%, andata di lusso.

Caso sfavorevole, sbilanciate dell' 1% dello stesso verso:
1111 e 1111, resistenza equivalente  555,5 errore 1,1% ma non del 2%.
Dico bene o dico giusto?
...non sapete quanto ho cercato...pfui pfui
prima di rivolgermi al forum...

astrobeed

Però adesso devo capire cosa sono uint32_t...ehm
uint32_t è la definizione univoca per gli unsigned long int (32 bit) sugli 8 bit, introdotta con l'ANSI C99 (ISO/IEC 9899:1999), sono contenute in "stdint.h", il loro scopo è evitare problemi tra i vari processori dove abbiamo int a 32 bit e int a 64 bit, o addirittura maggiori.
Scientia potentia est

astrobeed

Dico bene o dico giusto?
Si, con le resistenze in parallelo la tolleranza finale è, nel caso peggiore, leggermente più alta di quella nominale delle R, mentre nel caso migliore è molto più bassa, mediamente si attesta a 1/2 di quella nominale, quindi con R da 1% è lecito attendere una tolleranza media dello 0.5%.
Scientia potentia est

uwefed

#12
Mar 20, 2017, 12:27 am Last Edit: Mar 20, 2017, 12:30 am by uwefed
Il programma sono 15 anni che funziona, su pc, e tariamo le apparecchiature alla grande e senza usare le tabelle di ricerca di resistenze in parallelo, che sono più approssimate.
Uso resistenze all' 1%.
Le procedure di taratura prevedono il posizionamento di resistenze in parallelo, e quindi le metto senza stare a farmi tanti pensieri.
Ciao
Che il programma funzioni non ho dubbi, Che quello che fate aumenti la precisione di un circuito ne dubito tanto.

Se metti 2 resistenze da 1% in paralello ottieni sempre una resistenza da 1% di precisione. Le resistenze da 1% hanno abbastanza valori diversi da non dover fare questo lavoro ma di prendere il valore piú adeguato della singola resistenza.

Forse é il caso di rivedere le procedure di taratura perché non sono valide.

Ciao Uwe

Stilita

#13
Mar 20, 2017, 08:24 am Last Edit: Mar 20, 2017, 08:35 am by Stilita
Forse é il caso di rivedere le procedure di taratura perché non sono valide.

Ciao Uwe
Le procedure le ha stilate il costruttore, che è una primaria industria italiana.
Una volta per tutte:
ad esempio in ingresso di una scheda gli do 20,00 volt, misurati con strumenti precisi da 1000 euro, Fluke, e in uscita devo ottenere 40,00 mA.
Vado a mettere due resistente in parallelo, taratura fine, a quella presente sul circuito, e nelle sue apposite "pagliette", e con il programma e le resistenze da 1 % ottengo precisamente 20,00 mA.
Devo mettere su un filmato per convincerti? Non è il caso, fidati.
La finezza sta nel mettere due resistenze di taratura fine in parallelo a quella principale, quindi si lavora su un margine di correzione minimo, e così l'errore non prevale.
Si rende necessario la taratura periodica perché i convertitori v\a invecchiano e cambiano l'uscita.
Ciao
...non sapete quanto ho cercato...pfui pfui
prima di rivolgermi al forum...

gpb01

#14
Mar 21, 2017, 03:11 pm Last Edit: Mar 21, 2017, 03:11 pm by gpb01
ps: vorrei aggiungere una bozza dello sketch ma non so come fare.
                                                                           
Se inferiore al limite massimo del post (che, se ben ricordo è 9KB), la metti dentro un tuo post usando i tag CODE che, in fase di edit, ti inserisce il bottone </> ... primo a sinistra.

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up