0

我正在使用模数转换器读取 0 到 3.3V 的电压值。ADC 提供从 (0 到 4095) 的0x00输出0x0FFF。我想用两位小数打印电压读数。我已经阅读了许多答案,但我尝试过的都没有奏效。这是我的代码:

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 功能。

更新:我错误地假设UART0printf它与 相同printf,因为我之前使用过%u,%s%x. 但是对于数字,它仅支持%c%i%u。我正在重新编写我的代码,如果我没有得到任何地方,我会更新。

更新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]);
4

2 回答 2

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
于 2015-11-13T21:47:48.123 回答
2

没有这样的printf格式字符串

%.2d

格式化程序%d表示integer,因此没有十进制精度选项。正在被%.解析为错误(因为它不存在),并且2d正在将其逐字记录到您的输出中。

浮点值的格式化程序是%f,所以:

%.2f

但是,所有这一切都是基于这样的假设UART0printf,即您在问题中没有明确指出的 与 相同printf

于 2015-11-13T22:23:31.900 回答