sergeyiv писал(а):что делать как быть , куда копать ))
добавил 18:41
проверил во всем диапазоне от 0 до 39.99 врет , разъезжается по всему диапазону
Есть идея, как это можно исправить, при условии, что погрешность тут систематическая (то есть, собранный вольтметр врет всегда одинаково, вне зависимости, например, от температуры).
Для начала подправляем код так, чтобы результат выводился в битах от 0 до 1023 (потом вернем как было). Берем блок питания, подключаем к нему тестер и наше создание и начинаем делать лабу

, а именно, вбиваем в Excel истинное напряжение и показания АЦП. По истинному напряжению высчитываем, что
должен показывать правильный АЦП. Потом открываем Origin, строим график зависимости правильных показаний от реальных и аппроксимируем его полиномом (третьей степени за глаза хватит). (Если тут есть новички, которые впервые видят слово "аппроксимация", то скажу, что это такая математическая процедура, когда по экспериментальному графику некоторой зависимости под нее подгоняют функцию заданного типа). Теперь мы можем созерцать нелинейность во всей ее красе. По полученной формуле в Екселе можно рассчитать и округлить нашу зависимость для 1024-х точек.
Дальше надо научить атмегу ее компенсировать. Первый способ очень некошерный, профессионалы сделают так

. В программе создадим массив длиною 1024, и запишем туда рассчитанные данные. Это будет такая таблица для контроллера. Мы ему говорим:"ага, ты намерял 333 тугрика. На самом деле это неправильно, пойди и возьми значение из 333-й ячейки массива - это будет истинный результат".
Такой массив из 16-битных чисел займет ни много, ни мало 2 кБ. Вообще говоря, это расточительно. НО! С другой стороны, если это законченный прибор вольтметр, то прошивка занимает 1,54 кБ, а у меги их целых 8. Всё равно 6,45 кБ пропадают, так почему бы и нет...
Второй способ - это не вбухивать всю таблицу, а каждый раз считать значение полинома. Только тут уж очень исхитряться надо, потому что микроконтроллеры под математику не заточены. Всякие умножения-деления надо заменять сдвигами, суммирование и максимально упрощать, а то будет весело.