LusoRobótica - Robótica em Português
Robótica => Iniciantes => Tópico iniciado por: vasco em 21 de Outubro de 2018, 22:15
-
Boa noite,
À força de ler código de outras pessoas sobre a leitura de valores analógicos, acabei por ficar com a duvida se há realmente alguma diferença entre fazer simplesmente
X=analogRead(A0);
Ou se se deve usar
ADMUX=A0;
ADCSRA |= (1 << ADSC); /* start conversion */
while (ADCSRA & (1 << ADSC)); /* wait until conversion is done */
X=ADCW;
-
Vai dar à mesma coisa.
O primeiro é mais portátil, se mudares para um arduino com um processador diferente eventualmente não precisas de mudar nada (se mantiveres o sinal no A0), no segundo tens de descobrir quais os registos que controlam o ADC e usá-los da forma apropriada, que podem ser completamente diferentes.
A (eventual) vantagem do segundo é que é mais rápido, as bibliotecas arduino são sempre mais complexas. Olha para o código do AnalogRead para AVR: https://github.com/arduino/ArduinoCore-avr/blob/b7c607663fecc232e598f2c0acf419ceb0b7078c/cores/arduino/wiring_analog.c
muita dessa coisa é despachada na compilação (os #if), mas ainda sobra uma chamada a uma função ( analogPinToChannel() ).
-
A maneira correcta no Arduino é usares a função que eles providenciam, analogRead().
O código deles podia ser melhor (ya, grande novidade...), em particular no ciclo de espera pelo fim da conversão. Mas também, para o público alvo em questão, não é preciso muito rigor.
Já a maneira correcta, ou melhor dizendo, a melhor, no AVR, depende da aplicação, do que é mais importante, se baixo ruído, resolução, precisão, largura de banda....