How to convert a 24 bit, two’s complement value into a signed integer?
61 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Michael Simson
il 10 Giu 2014
Commentato: Balamurugan S
il 19 Apr 2018
I want to read an AD converter using the Raspberry Pi SPI interface controlled by Matlab. The AD converter outputs 24 bit data in the two's complement format, MSD first. The Matlab writeRead command returns the data as a row vector of data type char
How can I quickly translate the data into an integer of data type int32 ?
8 Commenti
Walter Roberson
il 19 Apr 2018
>> P=[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1]
P =
Columns 1 through 23
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Columns 24 through 46
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Columns 47 through 64
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1
>> swapbytes(typecast(uint8(bin2dec(char(reshape(P,8,[]).' + '0'))),'int64'))
ans =
int64
-3
Looks like -3 to me.
Risposta accettata
James Tursa
il 10 Giu 2014
Modificato: James Tursa
il 10 Giu 2014
s = 2's complement 24-bit string to convert
b = [s([1 1 1 1 1 1 1 1]) s]; % sign extension
k = typecast(uint32(bin2dec(b)),'int32'); % equivalent decimal number
5 Commenti
Evangelos
il 17 Ott 2014
This is also very helpful to me. However I have one question. When you say 24-bit string you mean something like 0bxxxxxxxxxxxxxxxxxxxxxxxx or a 24-bit hex string like 0xaaaaaa ?
Guillaume
il 17 Ott 2014
This is is obviously a 24-bit binary string. Hence the extension by 8 bits to 32 bits.
Più risposte (1)
Murat Belge
il 10 Giu 2014
There is an example MATLAB class in Raspberry Pi support package that does something similar for MCP300x ADC's. Here is the readVoltage() method for this class:
function voltage = readVoltage(obj, adcChannel)
validateattributes(adcChannel, {'numeric'}, ...
{'scalar', '>=', 0, '<=', obj.NumAdcChannels-1}, '', 'adcChannel');
adc = obj.getAdcChannelSelect(adcChannel);
data = uint16(obj.spiObj.writeRead([1, adc, 0]));
highbits = bitand(data(2), obj.Lsb2);
voltage = double(bitor(bitshift(highbits, 8), data(3)));
voltage = (obj.VoltageReference/1024) * voltage;
end
where obj.Lsb2 is defined as bin2dec('00000011'). The value read from ADC is 10-bits stashed into two 8-bit values. The upper two-bits is in byte 2 and the 8 least significant bits are in byte 3.
You can take a look at the entire class definition here:
<Support package installe dir>\raspi\+raspi\+internal\mcp300x.m
1 Commento
Vedere anche
Categorie
Scopri di più su Logical in Help Center e File Exchange
Prodotti
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!