2015-02-25 8 views
0

У меня есть ADC (AD7767), который я использую для измерения дифференциального сигнала. Данные, поступающие с АЦП, являются первым дополнением MSB к первому 24-битовому значению. Я хочу преобразовать это значение в напряжение. Опорное напряжение используется 5 вольт. Я использую IDE Arduino. То, что я до сих пор в основном это:Преобразование комплимента 24 бит 2 (MSB first) в напряжение

const long minValue = 0x800000; 
const long maxValue = 0x7FFFFF; 
signed long result = 0; 
.... 
long voltage = (result * 0x5)/maxValue; 
Serial.println(voltage); 

Это печатает значение 0.

Что значения:

result = 1010101101010101 

0x5: ака Vref

(result * 0x5) = 110101100010101001 
(result * 0x5)/maxValue = 0 
+0

В чем вопрос? – Radiodef

+0

http://stackoverflow.com/questions/2916191/c-c-convert-24-bit-signed-integer-to-float может вам помочь. –

+0

Возможный дубликат [Результат разделения всегда равен нулю] (http://stackoverflow.com/questions/2345902/division-result-is-always-zero) –

ответ

0

-Е» Повторяя попытку сохранить дробь в длинную. Результат всегда будет равен нулю. Вам нужно сделать один из операндов двойным и сохранить результат в двойном.

0

Проблема в длинном типе, который вы используете. Это целое число и в результате получается меньше 1, в результате получается 0. Использования поплавков вы будете иметь:

(результат * 0x5) = 110101100010101001 = 219.305

MaxValue = 0x7FFFFF = 8.388.607

Результат = 219305/8388607 = 0,026 [Volts]