Isto acontece muitas vezes porque o compilador acha-se mais inteligente que tu e usa variáveis inteiras no cálculo intermédio truncando assim o resultado.
Isto acontece com experiência e pode ser evitado com truques como:
mv = adc10 * (5000 / 1023 ); //o código original
//ou
mv = (adc10 * 5000) / 1023; // aqui não importa se as variáveis usadas pelo compilador são inteiros ou não e a última operação dá-te um float que é o que a variável mv está à espera.
//podes também fazer um cast para forçar o tipo...
mv = (float) (adc10 * 5000) / 1023;
//ou
mv = adc10 * 4.88758553275;
Poxa , que coisa hein. Eu programando Arruíno há uns 3 anos e só agora estou vendo isso.... Não lembro de ter visto isso em nenhuma referencia. Fico agora imaginando se nos inúmeros programas que já escrevi quais poderiam ter ido com esse bug...