Как преобразовать uint32_t в удвоение или с плавающей точкой и распечатать?
Я использую аналого-цифровой преобразователь, чтобы прочитать значение напряжения от 0 до 3,3 В. АЦП дает вывод из 0x00
в 0x0FFF
(От 0 до 4095). Я хочу напечатать показания напряжения с двумя десятичными разрядами. Я прочитал несколько ответов, но ничего, что я пробовал, не сработало. Вот мой код:
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
предопределенная функция UART на используемом мной микроконтроллере TIVA TM4C
ОБНОВЛЕНИЕ: я ошибочно предположил 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]);
2 ответа
Если эта функция работает printf
лайк:
UART0printf("\n\r> D0 = %.2f V\n", D0v);
Также ваш код может работать немного быстрее, если вы используете:
D0v = (double)pui32ADC0Value[0] * (3.3 / 4095);
Компилятор будет предварительно вычислять 3.3 / 4095
и выполнит одну операцию умножения с плавающей запятой. В противном случае возможно, что сначала выполняется деление (которое обычно занимает гораздо больше циклов ЦП, чем умножение), а затем умножение * 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
Такого нет printf
форматировать строку как
%.2d
Форматер %d
означает целое число, поэтому для него нет опций с десятичной точностью. %.
анализируется как ошибка (так как она не существует), и 2d
делает это дословно в ваш вывод.
Форматтер для значений с плавающей точкой %f
, так:
%.2f
Однако все это основано на предположении, что UART0printf
, который вы не идентифицируете в своем вопросе, идентичен printf
,