2015-11-13 1030 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