Как преобразовать 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 ,

Другие вопросы по тегам