реклама на сайте
подробности

 
 
> Как не тащить в проект float, ради одного отображения ADC
toweroff
сообщение Oct 6 2015, 19:18
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Добрый вечер

Есть ADC, меряет напряжение питания. Значение напряжения должно отображаться
Как не тащить ради только одной этой штуки за собой целый float?

Фактически, мне нужно целочисленное значение ADC умножить на 0.006123 и отобразить до первого знака после запятой, бОльшая точность не требуется
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
Dog Pawlowa
сообщение Oct 6 2015, 19:38
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(toweroff @ Oct 6 2015, 22:18) *
значение ADC умножить на 0.006123 и отобразить до первого знака после запятой


Как-то так:

unsigned int adc;
unsigned int voltage;

voltage=(unsigned int) (((long)adc * (long)6123)/100000L);
printf ("%u.%u", voltage/10,voltage%10);




--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Эдди
сообщение Oct 6 2015, 19:39
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Здесь я использовал для отображения напряжений и температур только целочисленную арифметику. При помощи цепных дробей (ЕМНИП, функция rat в Octave) можно с достаточной точностью десятичную дробь представить в виде отношения целых чисел A/B.
Вот только нужно заранее позаботиться, чтобы при умножении не возникло переполнения.

Пример: ваше число == 1/(163 + 1/(3 + 1/(7 + 1/4)))
а) 1/163 = 0.0061350
б) 1/(163+1/3) = 3/(163*3+1) = 3/490 = 0.0061224
ну или на худой конец 6123/1000000.
Чтобы были сотые, умножаем результат на 100 → для варианта б) имеем: 300/490 → значение переводится элементарно: X*300/490 и будет искомой величиной в сотых долях.
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Oct 6 2015, 19:40
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(toweroff @ Oct 6 2015, 20:18) *
Фактически, мне нужно целочисленное значение ADC умножить на 0.006123 и отобразить до первого знака после запятой, бОльшая точность не требуется


Хм, а целочисленно разделить значение ADC на 163 не прокатит ? sm.gif
Ну или умножить значение ADC на 10, целочисленно разделить 1633, потом сделать ldiv на 10, получить частное и остаток.
Go to the top of the page
 
+Quote Post
_pv
сообщение Oct 6 2015, 19:44
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



помножить на 4013, добавить 32768 (ну или не добавлять если правильное округление не нужно) и отбросить два младших байта.
результат будет в десятых долях.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Oct 6 2015, 20:00
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Всем спасибо.
Выбросил float, использовал "легкий" xprintf, в результате освободилось почти 3.5 кбайт
Go to the top of the page
 
+Quote Post
toweroff
сообщение Oct 16 2015, 16:31
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Напишу сюда, дабы не плодить лишних тем

xprintf - отлично, большое спасибо старику Чену

где бы накопать из того же ряда xsscanf?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 1st August 2025 - 20:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01399 секунд с 7
ELECTRONIX ©2004-2016