http://we.easyelectronics.ru/GYUR22/stm32-adcdmaitcusrednenie.html#comment94893

 ADCout (uint) — уже откалиброваные данные (которые надо получить)
 ADCin (uint)- сырые данные
 ADCref (uint)- измеренный внутренний референс. Он на 17м канале сидит вроде бы.

 А дальше следим за руками:
 1. ADCin = (Vin/Vdd)*4095 (измерение относительно питания, 12 бит)
 2. ADCref = (Vref/Vdd)*4095 (Vref смотрим в даташите, не помню сколько) (1489)
 3. Выведем Vin:
 Vin = Vref*ADCin/ADCref
 4. Но это бесполезные в целочисленной арифметике вольты. А нам нужны попугаи:
 ADCout = (Vin/Vdd) * 4095 (эмулируем АЦП )))) )
 ADCout = (ADCin * (Vref*4095/Vdd) )/ ADCref
 5. Обозначим K = Vref*4095/Vdd (коэффициент типа uint)
 6. Итоговый вариант:
 ADCout = ((u32)ADCin * K)/ADCref;
 K — какой коэффициентугодно можно. Но для красоты и предсказуемости данных я его высчитываю относительно номинального напряжения питания.

 Как уже было подмечено, калибровку делаем после каждого измерения. А потом хоть заусредняйтесь.
 Еще момент (было в сообществе кстати), на точность измерения очень сильно влияет сэмплинг тайм. На ваш вкус. Но для рефа мы делаем не менее 28.5 циклов тактирования АЦП.
 Как-то так
---
http://www.robobuild.ru/index.php?itid=4
---
http://microtechnics.ru/stm32-uchebnyj-kurs-adc-acp/
