Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Operazioni matematiche tra binare e esadecimali

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Operazioni matematiche tra binare e esadecimali

Messaggioda Foto Utentetim » 19 ott 2015, 16:37

Salve a tutti, sto cercando di programmare una freescale mkl25z. Fin ora sono riuscito a far funzionare la SPI per comunicare con un DAC esterno e ad attivare l' ADC integrato nella scheda per leggere una determinata caduta di tensione su una resistenza. Il mio problema è che ora devo utilizzare il valore del registro ADC0_RA, cioè il registro dati del ADC dove vengono salvati i valori, facendo per esempio sottrazione, divisione ecc.Mi spiego meglio: a me serve che, conoscendo un certo valore di corrente, io possa conoscere il valore di una resistenza, quindi leggo la caduta su tale resistenza grazie all'ADC e la divido per la corrente e ottengo la resistenza. Prima di tutto non so come ottenere la corrente,noi abbiamo due resistenze: R1 che regola la corrente e R2 è la resistenza della quale voglio conoscere il valore. Quindi nella pratica la corrente è uguale a (V2-V1)/R1 cioè per esempio (3.3V-1v)/0.5ohm, con V1 e V2 le tensioni ai suoi capi e R1 il valore di tale resistenza.Il codice che ho scritto è il seguente ma dubito che possa funzionare:

uint16_t supply=0XFFFF; // Valore dell'alimentazione 3.3 V (16 bit)
uint16_t resistor= 0X26C9; // Ipotizzo una R1 da 500 mohm (16bit)
uint16_t current; //corrente sull heater
uint16_t Control_Voltage=19859; //1V (16bit)
current=(supply-Control_Voltage)/resistor; //(3.3-1)/0.5=2.6A

A questo punto dovrei utilizzare questo "current" :

R2=ADC0_RA/current;

Il problema è che non so si possano fare queste operazioni matematiche tra binari e esadecimali come ho fatto io o eventualmente come vanno fatte.
Grazie anticipatamente x l'aiuto.
Avatar utente
Foto Utentetim
10 5
New entry
New entry
 
Messaggi: 69
Iscritto il: 15 ott 2015, 16:21

0
voti

[2] Re: Operazioni matematiche tra binare e esadecimali

Messaggioda Foto UtenteEcoTan » 19 ott 2015, 17:05

Se ho ben capito, devi misurare due tensioni (la V1 e la tensione sull'altra resistenza) quindi usare 2 canali dello ADC.
Su 16 bit la risoluzione non è molta e facendo divisioni diventa davvero troppo poca, quindi devi scegliere fra destreggiarti con gli shift per sfruttare sempre al meglio la risoluzione o usare il formato floating.
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5420
Iscritto il: 29 gen 2014, 8:54

0
voti

[3] Re: Operazioni matematiche tra binare e esadecimali

Messaggioda Foto UtenteIlGuru » 19 ott 2015, 17:19

O usi i tipi float, o casti i valori con (float), o se non ti serve una gran precisione, puoi sommare b a sè stesso n volte fino a che non diventa maggiore di a, a quel punto n è il risultato della divisione.
Es:
a = 3
b = 2

n=1 b=b+b a=3 ; n=1 b=4 a=3 ; b>a -> n=1 è il risultato della divisione
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
5.482 2 10 13
G.Master EY
G.Master EY
 
Messaggi: 1924
Iscritto il: 31 lug 2015, 23:32

0
voti

[4] Re: Operazioni matematiche tra binare e esadecimali

Messaggioda Foto Utentetim » 19 ott 2015, 17:21

No devo calcolare solo una tensione. Ho allegato un semplicissimo schema di quello che devo fare.Il MOS lo controllo io dalla scheda tramite op-amp, quindi prima di tutto devo calcolare l corrente

current=(supply-Control_Voltage)/resistor; //(3.3-1)/0.5=2.6A

ipotizzando una tensione V2 di 1 volt, a questo punto che so la corrente voglio sapere quanto è la resistenza in basso nello schema e faccio il valore che leggo dall adc fratto la corrente, ma non so come fare tutti questi passaggi avendo numeri binare o esadecimali e il regitro adco_ra
Allegati
AA.png
AA.png (10.79 KiB) Osservato 3893 volte
Avatar utente
Foto Utentetim
10 5
New entry
New entry
 
Messaggi: 69
Iscritto il: 15 ott 2015, 16:21

0
voti

[5] Re: Operazioni matematiche tra binare e esadecimali

Messaggioda Foto UtenteIsidoroKZ » 19 ott 2015, 17:54

GLi schemi disegnali giusti, e al posto di allegare l'immagine allega il sorgente del disegno fidocadj, che viene molto meglio.

Se il circuito e` quello del riscaldatore, stai impostando male il problema. Inoltre nel mio circuito avevo messo degli ampli da strumentazione: sono indispensabili!
Per usare proficuamente un simulatore, bisogna sapere molta più elettronica di lui
Plug it in - it works better!
Il 555 sta all'elettronica come Arduino all'informatica! (entrambi loro malgrado)
Se volete risposte rispondete a tutte le mie domande
Avatar utente
Foto UtenteIsidoroKZ
121,2k 1 3 8
G.Master EY
G.Master EY
 
Messaggi: 21059
Iscritto il: 17 ott 2009, 0:00

0
voti

[6] Re: Operazioni matematiche tra binare e esadecimali

Messaggioda Foto Utentetim » 19 ott 2015, 18:02

Ok la prossima volta metterò il file sorgente, comunque gli amplificatori da strumentazione non li ho messi nel disegno perché ho pensato che non fosse necessario inserirli dato che si tratta di una domanda riguardo al firmware. perché sto impostando male il problema?
Avatar utente
Foto Utentetim
10 5
New entry
New entry
 
Messaggi: 69
Iscritto il: 15 ott 2015, 16:21

0
voti

[7] Re: Operazioni matematiche tra binare e esadecimali

Messaggioda Foto UtenteIsidoroKZ » 19 ott 2015, 18:09

Perche' stai tirando fuori delle tensioni da 3.3V che non dovrebbero esserci. La misura della corrente non la si fa, per definizione e` la corrente che comandi con il DA. L'errore che ci puo` essere nel sistema e` la tolleranza della resistenza di sense R1. Anche se misurassi la tensione ai capi di R1, che e` un errore perche' fra l'altro non hai la stessa alimentazione, la corrente sarebbe sempre indeterminata dalla tolleranza di R1.

Non misuri la corrente: dai il comando con il DA e sai che corrente passa. Al piu` potresti misurare l'uscita dell'ampli da strumentazione su Rs per verificare che funzioni tutto bene.
Per usare proficuamente un simulatore, bisogna sapere molta più elettronica di lui
Plug it in - it works better!
Il 555 sta all'elettronica come Arduino all'informatica! (entrambi loro malgrado)
Se volete risposte rispondete a tutte le mie domande
Avatar utente
Foto UtenteIsidoroKZ
121,2k 1 3 8
G.Master EY
G.Master EY
 
Messaggi: 21059
Iscritto il: 17 ott 2009, 0:00

0
voti

[8] Re: Operazioni matematiche tra binare e esadecimali

Messaggioda Foto UtenteEcoTan » 19 ott 2015, 20:08

Aggiungo che (almeno coi microcontrollori che conosco io) non ci si può fidare del valore assoluto di fondo scala della tensione fornita dal DAC
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5420
Iscritto il: 29 gen 2014, 8:54

0
voti

[9] Re: Operazioni matematiche tra binare e esadecimali

Messaggioda Foto UtenteCandy » 19 ott 2015, 23:22

Mah. Io dico che mancano concetti bade. Prima di tutto la corrente deve essere nota in ubo schema come il tuo, e magari anche variabile a comando per rimuovere degli offset di misura.

Poi non capisco il problema. Il convertitore restituisce un valore decimale in un registro. Se programmi in assembly dovrai scalarlo alla corrispondente grandezza. Se per farlo vuoi anche ottenere il dato in un formato diverso, o lo converti od usi un linguaggio che converta implicitamente.

Di che linguaggio stiamo parlando?
Avatar utente
Foto UtenteCandy
32,5k 7 10 13
CRU - Account cancellato su Richiesta utente
 
Messaggi: 10123
Iscritto il: 14 giu 2010, 22:54

0
voti

[10] Re: Operazioni matematiche tra binare e esadecimali

Messaggioda Foto Utentetim » 20 ott 2015, 12:26

Ok la corrente la so cke la imposto dal DAC, ipotizziamo una reistenza iniziale del riscaldatore di 350 milli ohm e 500 m ohm a 80 gradi, quindi io fisso una certa corrente per esempio 1A quindi io saprò di aver raggiunto gli 80 gradi quando l adc legge un valore di 500mV. A questo punto voglio scendere a 60 gradi ( ipotizzo 400m ohm), quindi le soluzioni che mi vengono in mente sono o tengo costante la corrente ma la spegno e l accendo così da ottenere un "valor medio" piu basso, oppure per esempio porto la corrente ad 0.8A, ma a questo punto sull adc devo leggere una caduta data dalla nuova corrente per la resistenza, quindi devo conoscere a priori sempre la corrente e l unico modo che mi viene in mente è definire il valore della resistenza in alto ( nn quella del riscaldatore per capirci) e fare 3.3 meno l uscita del dac fratto la resistenza in alto. Questa è la mia idea, se c'è un metodo mogliore ditemi pure...per quanto rigurda il linguaggio di programmazione è c, e il registro del adc mi restituisce 16 bit, nn un decimale
Avatar utente
Foto Utentetim
10 5
New entry
New entry
 
Messaggi: 69
Iscritto il: 15 ott 2015, 16:21

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti