How to convert voltage (or frequency) floating number read backs to mV (or kHz)?

Question:

I am successfully able to read back data from an instrument:

  • When the read back is a voltage, I typically read back values such as 5.34e-02 Volts.

  • When the read back is frequency, I typically read values like 2.95e+04or 1.49e+05 with units Hz.

I would like to convert the voltage read back of 5.34e-02 to exponent e-3 (aka millivolts), ie.. 53.4e-3. next, I would like to extract the mantissa 53.4 out of this because I want all my data needs to be in milliVolts.

Similarly, I would like to convert all the frequency such as 2.95e+04 (or 1.49e+05) to kiloHz, ie… 29.5e+03 or 149e+03. Next would like to extract the mantissa 29.5 and 149 from this since all my data needs to be kHz.

Can someone suggest how to do this?

Asked By: Sinha

||

Answers:

Well, to convert volts to millivolts, you multiply by 1000. To convert Hz to kHz, you divide by 1000.

>>> reading = 5.34e-02
>>> millivolts = reading * 1000
>>> print(millivolts)
53.400000000000006
>>> hz = 2.95e+04
>>> khz = hz /1000
>>> khz
29.5
>>>

FOLLOW-UP

OK, assuming your real goal is to keep the units the same but adjust the exponent to a multiple of 3, see if this meets your needs.


def convert(val):
    if isinstance(val,int):
        return str(val)
    cvt = f"{val:3.2e}"
    if 'e' not in cvt:
        return cvt
    # a will be #.##
    # b will be -##
    a,b = cvt.split('e')
    exp = int(b)
    if exp % 3 == 0:
        return cvt
    if exp % 3 == 1:
        a = a[0]+a[2]+a[1]+a[3]
        exp = abs(exp-1)
        return f"{a}e{b[0]}{exp:02d}"
    a = a[0]+a[2]+a[3]+a[1]
    exp = abs(exp-2)
    return f"{a}e{b[0]}{exp:02d}"


for val in (5.34e-01, 2.95e+03, 5.34e-02, 2.95e+04, 5.34e-03, 2.95e+06):
    print( f"{val:3.2e} ->", convert(val) )

Output:

5.34e-01 -> 534.e-03
2.95e+03 -> 2.95e+03
5.34e-02 -> 53.4e-03
2.95e+04 -> 29.5e+03
5.34e-03 -> 5.34e-03
2.95e+06 -> 2.95e+06
Answered By: Tim Roberts

In this case, I think multiplying/dividing by 1000 is enough to move between SI prefixes. But when units get more complicated it might help to use a library like Pint to keep track of things and make sure you’re calculating what you think you are.

In this case you might do:

import pint

ureg = pint.UnitRegistry()
Q = ureg.Quantity

reading_v = Q(5.34e-02, 'volts')
reading_mv = reading_v.to('millivolts')

print(reading_mv.magnitude)

but it seems overkill here.

Answered By: Sam Mason