Arduino Forum

International => Italiano => Software => Topic started by: Stilita on Mar 18, 2017, 05:41 pm

Title: Gestione numeri elevati
Post by: Stilita on Mar 18, 2017, 05:41 pm
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
Title: Re: Gestione numeri elevati
Post by: astrobeed on Mar 18, 2017, 05:56 pm
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.
Title: Re: Gestione numeri elevati
Post by: Stilita on Mar 18, 2017, 06:07 pm
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
Title: Re: Gestione numeri elevati
Post by: marcomg on Mar 18, 2017, 06:25 pm
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 (https://mattmccutchen.net/bigint/) (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 (https://gmplib.org/) e qui http://www.gammon.com.au/forum/?id=11519 un porting per arduino, ma non è super recente.
Title: Re: Gestione numeri elevati
Post by: uwefed on Mar 19, 2017, 12:57 am
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
Title: Re: Gestione numeri elevati
Post by: Stilita on Mar 19, 2017, 10:35 am
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



     
Title: Re: Gestione numeri elevati
Post by: marcomg on Mar 19, 2017, 10:43 am
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) :(
Title: Re: Gestione numeri elevati
Post by: astrobeed on Mar 19, 2017, 11:15 am
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

Title: Re: Gestione numeri elevati
Post by: Stilita on Mar 19, 2017, 11:32 am
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


Title: Re: Gestione numeri elevati
Post by: Stilita on Mar 19, 2017, 11:41 am
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?
Title: Re: Gestione numeri elevati
Post by: astrobeed on Mar 19, 2017, 12:06 pm
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.
Title: Re: Gestione numeri elevati
Post by: astrobeed on Mar 19, 2017, 12:16 pm
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%.
Title: Re: Gestione numeri elevati
Post by: uwefed on Mar 20, 2017, 12:27 am
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
Title: Re: Gestione numeri elevati
Post by: Stilita on Mar 20, 2017, 08:24 am
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
Title: Re: Gestione numeri elevati
Post by: gpb01 on Mar 21, 2017, 03:11 pm
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
Title: Re: Gestione numeri elevati
Post by: Stilita on Mar 21, 2017, 05:42 pm
Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(19, 18, 17, 16, 15, 14);
float val;
int x;
float  a;
float  b;
float  c;
float  r1=4700000;
float  r2=1200000;
void setup(){
lcd.begin(16, 2);
Serial.begin(9600);
}
void loop()
{
 a=4000000000/r1;
 b=4000000000/r2;
 c=a+b;
 val=4000000000/c;
 lcd.print(val);
 Serial.println(val);
 delay(50000);
  }

Salve, il trucco aritmetico di Astrobed funziona bene, ma funziona meglio se le variabili le dichiaro Float.
Perché sui valori bassi l'errore non è accettabile, adesso è precisissimo, il timore era che
sballava sui numeri alti, ma va bene lo stesso...mi sfugge qualcosa?
Allego una bozza "maccheronica" e vedo che funziona bene...mah!
Ciao
Title: Re: Gestione numeri elevati RISOLTO
Post by: Stilita on Apr 10, 2017, 08:38 pm
Ecco in calce il risultato del progettino, oltre alle funzioni che vedete ho applicato anche il
controllo battery low, che oltre a segnalarlo visivamente e acusticamente spegne la retroilluminazione del display. Inoltre con un solo pulsante accendo e spengo l' apparecchiatura
piccolezze che voi esperti fate a occhi chiusi.
Grazie a chi mi ha dato qualche dritta.

https://vid.me/OPhR

Title: Re: Gestione numeri elevati
Post by: Stilita on Apr 11, 2017, 09:44 am
Ho messo solo le resistenze che abbiamo a disposizione, ci troviamo bene, e tariamo in modo perfetto.
Per quanto riguarda la precisione delle tarature che dobbiamo effettuare dovrei dimostrartelo con un altro
filmato, ma credo che ti fidi.
Title: Re: Gestione numeri elevati
Post by: Stilita on Apr 11, 2017, 10:33 am
Vuoi dire che non usate resistenze standard, ma su commessa?

 Ordinala irettamente del valore che ti serve....
Scusa, ma che ordiniamo migliaia di valori, sono anni che c'è le ricaviamo noi e ci troviamo
bene, poi prima di dire che non è vero t'invito in laboratorio e lo dimostro.
Title: Re: Gestione numeri elevati
Post by: gpb01 on Apr 11, 2017, 10:38 am
Ok, direi che la discussione sul problema "matematico" iniziale è conclusa e tutte le altre chiacchiere potete farle via MP.

Ogni altro post, non strettamente relativo al problema iniziale, ovvero alle tecniche di calcolo, verrà eliminato senza ulteriori preavvisi.

Grazie,

Guglielmo
Title: Re: Gestione numeri elevati
Post by: gpb01 on Apr 11, 2017, 10:52 am
... ok ... vedo che il mio messaggio NON è stato affatto recepito ... ho dovuto cancellare ben 4 messaggi che nulla avevano a che vedere con Arduino e la genstione di numeri grandi ... mi dispiace :(

Non mi resta altro da fare ... thread chiuso.  :smiley-confuse:

Guglielmo

P.S.: ... magari non sempre è ci si ricorda che ... questo NON è un forum di "elettronica generale", questo è il forum di Arduino.cc dove si fornisce aiuto agli utenti su problematiche che coinvolgono Arduino.
Post riguardanti la bontà o meno di un sistema di calibrazioni (e velate polemiche connesse), NON hanno nulla a che vedere né con il forum, né con il thread.