2015-11-13 1032 views
0

我正在使用模數轉換器來讀取0到3.3V的電壓值。 ADC提供從0x000x0FFF(0到4095)的輸出。我想打印兩位小數的電壓讀數。我已經閱讀了許多答案,但我沒有嘗試過任何工作。這裏是我的代碼:如何將uint32_t轉換爲double或float並打印?

uint32_t pui32ADC0Value[1]; // ADC0 data value 
double D0v;     // Decimal value 

// Read value from ADC 
ADCSequenceDataGet(ADC0_BASE, 3, pui32ADC0Value); 

// Convert to decimal 
D0v = (double)pui32ADC0Value[0]/4095 * 3.3; 

// Print to console 
UART0printf("\n\r> D0 = %.2d V", D0v); 

我得到的輸出是:D0 = ERROR2d V

pui32ADC0Value打印沒有任何問題,並給出了預期值,所以我知道這是工作。

這個錯誤是什麼意思?

注意:UART0printf是我使用的TIVA TM4C微控制器上的預定義UART功能。

UPDATE:我錯誤地認爲UART0printf相同printf,正如我與%u%s,和%x之前使用它。但是對於數字,它只支持%c,%i%u。如果我沒有找到任何地方,我正在重新編寫代碼並更新。

UPDATE 2: 我可以這樣做嗎?我知道這將圓錯誤......

uint32_t pui32ADC0Value[1]; // ADC0 data value 
uint32_t D0v[2];     // Decimal value 

// Read value from ADC 
ADCSequenceDataGet(ADC0_BASE, 3, pui32ADC0Value); 

// Convert to decimal 
for (int i = 0; i <= 2; i++){ 
    D0v[i] = (pui32ADC0Value[0]/10^i)/4096 * 3.3; 
} 

// Display the AIN0 (PE0) digital value on the console. 
UART0printf("\n\r> D0 = %d.%d%d V", D0v[0],D0v[1],D0v[2]); 
+1

什麼是'UART0printf'?你確定它支持與C的'printf'相同的格式字符串語法嗎? – Dai

+2

爲什麼uint32_t pui32ADC0Value [1]; ?而不是uint32_t pui32ADC0Value; ?? – Nandu

+0

@Nandu:我打算繼續前進,並假設ADCSequenceDataGet接受一個指向'uint32_t'的指針,所以'uint32_t [1]'得到了免費的隱式轉換。但我認爲這不是一個好主意。 –

回答

4

如果該功能的工作原理printf,如:

UART0printf("\n\r> D0 = %.2f V\n", D0v); 

而且你的代碼可能工作快一點,如果你使用:

D0v = (double)pui32ADC0Value[0] * (3.3/4095); 

的編譯器將預先計算3.3/4095並將執行單個浮點乘法操作。否則,可能首先完成除法(這通常需要比乘法多得多的CPU週期),然後乘法* 3.3將完成。

此外,由於您似乎只需要2位精度,您可以使用float(單精度)而不是double。它可能執行更快(但可能會更慢),這取決於平臺。

的問題更新UPDATE2

試試這個:

uint32_t pui32ADC0Value[1]; // ADC0 data value 
uint32_t D0v;    // Decimal value 

// Read value from ADC 
ADCSequenceDataGet(ADC0_BASE, 3, pui32ADC0Value); 

// Convert to millivolts 
D0v = pui32ADC0Value[0] * (3300.0/4095); 

// Display the AIN0 (PE0) digital value on the console. 
UART0printf("\n\r> D0 = %d mV", D0v); // If it's OK for you to display in mV 
UART0printf("\n\r> D0 = %d.%03d V", D0v/1000, D0v % 1000); // Print in V 
+0

@Dai仍然需要做一個整數除法,然後在特定的平臺上,我已經看到單精度乘法(float)比整數除法更快。 – nnn

+0

我不認爲'float'通常比'double'快,我很確定在大多數體系結構中它們的計算方式是相同的。唯一的區別是存儲過程中的準確性。 –

+0

@MooingDuck對,這可能取決於實際的平臺。但是對於沒有FPU的微控制器(在SW中實現float div),我認爲它會更快。 – nnn

2

有沒有這樣的printf格式字符串作爲

%.2d 

格式化%d意味着整數,所以沒有小數精度選項爲了它。 %.正被解析爲錯誤(因爲它不存在),並且2d正在逐字輸入到您的輸出中。

The formatter for floating-point values is %f,所以:

%.2f 

然而,這一切是基於這樣的假設UART0printf,你不要在任何你的問題識別,等同於printf