[an error occurred while processing this directive]
Все это элементарно вычисляется в целых числах
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено =AVR= 18 ноября 2006 г. 18:34
В ответ на: Ребята подскажите,кто как выщитывает напряжение на АЦП,я тута порылся в нете- отправлено <font color=gray>stas-mas</font> 18 ноября 2006 г. 16:43

Допустим, есть у тебя 10-битный АЦП, который при входном напряжении, равном опорному (5 вольт) дает максимальный код, т.е. 1023. Тебе нужно представить это значение в виде 5.000 вольт. Десятичную точку поставишь потом там, где надо, а пока определи, что надо делать с отсчетом АЦП. Это просто - раз из 1023 нужно получить 5000, то надо решить уравнение 1023*x=5000, что дает x=5000/1023. Финт в том, что X НЕ НАДО приводить к виду X = 4.8875855, а использовать как есть - сначала отсчет АЦП умножить на 5000, затем полученное значение разделить на 1023. Так как команда деления в МК, как правило, либо отсутствует, либо выполняется долго, то гораздо эффективнее использовать команду сдвига - ведь 1023 = 1024-1, а 1024 = 2^10. Поэтому надо пересчитать коэффициент так, чтобы в знаменателе оказалось 1024 (а еще лучше - 256, чтобы вместо сдвига просто брать старшие байты). Вот и решаем пропорцию - 5000/1023=Y/1024, получая Y=(1024*5000)/1023~=5005. Теперь нужно умножить отсчет АЦП на Y - 1023*5005=5120115, и разделить это число на 1024 (то есть сдвинуть его на 10 бит вправо) - 5120115 >> 10 = 5000, что и требовалось.

В зависимости от типа и разрядности МК операции умножения и сдвига можно и нужно делать наиболее эффективным способом, например:


Отсчет АЦП = 1023 = 0x03FF
Множитель = 5005 = 0x138D
Произведение = 5120115 = 0x004E2073
Результат = 0x004E2073 >> 10 = 0x00001388, берем младшее слово 0x1388 = 5000.

Вместо >> 10 и взятия результата из младшего слова можно применить << 6 и взятие результата из старшего слова:

Результат = 0x004E2073 << 6 = 0x13881CC0, берем старшее слово 0x1388 = 5000.

Не забывай, что какие бы ты вычисления ни делал - с плавающей запятой или целочисленные - в результате всегда будет присутствовать дискретность входного квантования, умноженная на коэффициент масштабирования. Шаг твоего АЦП составляет порядка 5 милливольт (точнее 4.88769), соответственно, он и отразится в выходном результате - значению 5000 будет предшествовать не 4999, а 4995, а неизбежная ошибка округления/отсечения будет проявляться в том, что каждый К-тый шаг будет на единицу больше или меньше остальных. К можно посчитать как 1/(ШАГокругл-ШАГточн) = 1/(5-4.88769) ~= 8.9 ~ 9, т.е. каждый 8-й (иногда 9-й) шаг будет не в 5, а в 4 единицы

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа
Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание