Verificando a taxa de amostragem do ADC de algumas placas Arduino

Arduinos

[Nota: Post guardado nos rascunhos faz tempo...]

Esses dias fiz um experimento com áudio no Arduino Due (em breve mais informações) e fiquei pensando qual seria a taxa de amostragem do ADC. Até procurei mais informações, mas no final decidi fazer um teste de verdade na placa para ter ideia da frequência. Aproveitei que o mesmo código roda em qualquer placa compatível de Arduino e testei em outras duas que tinha aqui. Na foto acima tem o Arduino Due, um Uno R3 (claro) e uma placa Feather Huzzah da Adafruit (resumidamente é um ESP8266 com um carregador de bateria).

Dá pra testar a taxa de amostragem de duas formas. Uma seria subir um pino digital qualquer, medir uma entrada analógica e, depois de concluída a medida, baixar o pino. Um osciloscópio ligado no pino digital mede o tempo de amostragem. Inverte o valor e tem-se a frequência. A outra maneira só precisa da placa e de um PC. Li sobre esse método em algum fórum, mas perdi o link. Você faz milhares de medidas numa entrada do ADC, conta o tempo decorrido e, ao final, divide pelo número de amostras. É este segundo método que implementei no código abaixo (disponível no meu Github):


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*
  Arduino ADC Sampling rate test
  Rodrigo Feliciano - 10/01/2018
  www.pakequis.com.br
*/
#define N_SAMPLES 10000

unsigned long test;
float tmp = 0;
word i;
word dumb_read; 

void setup() 
{
  //resolution 8, 10 or 12 bits
  //analogReadResolution(12); //Arduino Due
  //analogReadResolution(10); //Arduino Due
  //analogReadResolution(8);  //Arduino Due
  Serial.begin(9600);
}

void loop() 
{  
  test = millis();

  //ADC Test
  for(i=0;i<N_SAMPLES;i++) dumb_read = analogRead(0);

  tmp = (millis() - test);
  tmp = (N_SAMPLES/tmp) * 1000; //1000ms = 1s
  
  Serial.print(tmp);
  Serial.print(" - ");
  Serial.println(dumb_read);
  delay(1000);
}

Os resultados no Arduino Uno foram estes:
Arduino Uno ADC Sampling Rate

Deu algo em torno de 8,9 kHz, com uma pequena variação entre um teste e outro. 

Já no Arduino Due o taxa ficou em absurdos 217 kHz cravados, sem variação. Muito boa para áudio, como eu já havia confirmado em outros testes.
Arduino Due ADC Sampling Rate

Agora a Feather Huzzah que tem apenas um canal ADC que funciona só até 1 V, no máximo (todos os testes foram feitos sem sinal nas entradas). Ela também tem uma variação nos testes. A taxa é bem baixa para um processador que roda a 80 MHz.
Feather Huzzah ADC Sampling Rate

E pra concluir o consumo de memória do código dos testes em cada placa. No Uno o código consome 11% da Flash e 10% da RAM (grande parte deve ser por causa da serial):

Arduino Uno Memoria

No Due são 5% da Flash, sem informações da RAM:
Arduino Due Memoria

Já na Feather são absurdos 24% da Flash e 40% da RAM. Claro que isso deve ser do código para o Wi-fi e outros enchimentos.
Feather Huzzah memory

3 comentários:

  1. Boa tarde Rodrigo, fiz testes semelhantes e cheguei a resultados praticamente iguais aos seus. Estou trabalhando agora com a placa da Intel, Edison. Você tem alguma experiência com a mesma? estou desenvolvendo uma aplicação e gostaria de saber como alterar a taxa de amostragem para 30Khz. obrigado

    ResponderExcluir

1. Alguns comentários são moderados automaticamente. Caso isso ocorra pode levar algum tempo até que eu veja e o libere.
2. Comentários fora do assunto do post podem ser apagados.
3. Não, eu não posso consertar os seus aparelhos!