|
Дробная арифметика, Делаю вольтметр |
|
|
|
 |
Ответов
(1 - 10)
|
Aug 7 2009, 18:52
|
Местный
  
Группа: Участник
Сообщений: 310
Регистрация: 11-07-09
Из: Екатеринбург
Пользователь №: 51 154

|
Если я правильно догадался у вас опорное напряжение 5 В. В этом случае: Код int16_t raschet(void) { int16_t b_uff;//выходное значение в милливольтах
b_uff=((int32_t)ADCD*5000)/1024; return b_uff; } Ну и далее: uint8_t mas_ADC [4];//содержит цифры для вывода void out (int16_t in) { uint16_t d; d=in&0x7fff;
mas_ADC[0]=d/1000+0x30; d=d%1000; mas_ADC[1]=d/100+0x30; d=d%100; mas_ADC[2]=d/10+0x30; mas_ADC[3]=d%10; }
Причина редактирования: Оформление цитаты исходника.
|
|
|
|
|
Aug 7 2009, 20:36
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Топикстартеру. Как уже выше заметили для вашего случая плавающая арифметика не нужна совсем. Разрешение вашего АЦП хуже 1мВ, поэтому результат измерения можно представлять именно в миллиВольтах с помощью двухбайтового целого числа. Причем деление на 1024 заменяется сдвигом вправо на 10 бит. Код unsigned int data = (unsigned int)((unsigned long)ADCD*5000UL)>>10UL); //содержимое data - напряжение в мВ: число от 0мВ до 4995мВ По второй части вопроса. Цитата Потом надо отобразить на индикаторе. У меня есть функция, которая принимает на вход номер знакоместа на LCD и цифру от 0 до 9. Цифра от 0 до 9 в бинарном виде принимается или в виде ASCII-кода? Если в виде ASCII-кода, то нужно к каждому числу результата BCD-преобразования добавлять ASCII-код нуля '0' = 0x30. Для преобразования в BCD-формат делением (или боже вас упаси! функцией sprintf) пользоваться вовсе не обязательно. Можно последовательно вычитать степени числа десять (т.е. 10000, 1000, 100, 10), считая количество этих вычитаний.
|
|
|
|
|
Aug 12 2009, 10:31
|
Группа: Участник
Сообщений: 8
Регистрация: 9-07-09
Из: Рига, Латвия
Пользователь №: 51 080

|
Флоатами получается очень медленно и громоздко. Для своего вольтметра все делал делением и вычислением остатка на интегерах. Вывод на три 7-сегментных светодиодных индикатора. Могу сурсы дать. Существует какой-либо быстрый алгоритм разложения 16-битного целого на десятичные составляющие, с шифтами например? На аттини26 делением и остатками при 1МГц у меня эта операция занимает 200мкс. Интересно, подсчетом вычитаний 1000, 100, 10 быстрей будет?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|