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))
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.
astrobeed:
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?
Stilita:
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 Gammon Forum : Electronics : Microprocessors : Arbitrary precision (big number) library port for Arduino un porting per arduino, ma non è super recente.
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.
uwefed:
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
Stilita:
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)
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:
marcomg:
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?
Stilita:
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.
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%.
Stilita:
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.
uwefed:
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
Stilita:
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.
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
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.
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.
docsavage:
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.