Licence CC BY

Arduino : Accélérer analogRead

ADC et fast sampling

Billet rapide aujourd’hui, qui fera peut-être un jour l’objet d’un article plus complet, concernant l’accélération de la fonction analogRead.

La fonction analogRead, sur un Arduino, s’exécute en 115 µs environ, alors qu’un AtMega328 permets un temps de conversion aussi faible que 13 µs, soit neuf fois moins (cf. Datasheet, §28.1) ; comment est-il possible d’avoir des mesures plus rapides ? Et à quel prix ? C’est ce à quoi nous nous intéresserons dans ce billet.

Notre test de rapidité

Rentrons directement dans le vif du sujet et voyons le code utilisé afin de tester la rapidité de notre fonction analogRead. La méthode employée ici est très archaïque - et peu précise - ce qui m’intéresse est plutôt de présenter un aperçu général sur ce qu’il est ou non possible de faire.

Nous allons ainsi simplement réaliser cent mesures sur la broche A2 de notre Arduino, avec un dixième de seconde d’intervalle entre chaque mesure. Un potentiomètre est relié sur cette broche et je le tournerais à la main en essayant d’avoir le plus de mesures possibles entre 0 et 1023 à chaque fois.

Voici le code utilisé pour les mesures :

 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
37
38
39
40
41
42
43
// On stocke les temps avant et après notre analogRead
unsigned long start_times[100];
unsigned long stop_times[100];
// Les valeurs lues sont aussi stockées, pour avoir une approximation de la précision
unsigned long values[100];

void setup() {
  // Vous verrez pourquoi le baud rate n'est pas important ici
  Serial.begin(9600);
  pinMode(2, INPUT);
}


void loop() {
  unsigned int i;

  Serial.println("Test lancé\n");
  // Petit délai, juste pour que j'ai le temps de commencer à tourner avant de mesurer à tout va
  delay(1000);

  for(i=0; i < 100; i++) {
    start_times[i] = micros();
    values[i] = analogRead(2);
    stop_times[i] = micros();

    // 100 ms entre chaque mesure
    delay(100);
  }

  // Une seconde boucle pour afficher nos résultats, afin d'être sûrs que le Serial.print n'affectera pas nos mesures de temps
  Serial.println("Résultats :");

  for(i=0; i < 100; i++) {
    Serial.print("Valeur lue : ");
    Serial.print(values[i]);
    Serial.print(" en ");
    Serial.print(stop_times[i] - start_times[i]);
    Serial.println(" microsecondes.");
  }

  // On relance le test après 5 secondes
  delay(5000);
}

Expérience témoin

Lançons notre code de test sur un Arduino Nano classique, et voyons le résultat :

  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
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
Valeur lue : 0 en 116 microsecondes.
Valeur lue : 0 en 112 microsecondes.
Valeur lue : 0 en 112 microsecondes.
Valeur lue : 0 en 116 microsecondes.
Valeur lue : 0 en 116 microsecondes.
Valeur lue : 0 en 116 microsecondes.
Valeur lue : 0 en 112 microsecondes.
Valeur lue : 2 en 116 microsecondes.
Valeur lue : 20 en 116 microsecondes.
Valeur lue : 36 en 116 microsecondes.
Valeur lue : 52 en 112 microsecondes.
Valeur lue : 63 en 112 microsecondes.
Valeur lue : 74 en 116 microsecondes.
Valeur lue : 83 en 116 microsecondes.
Valeur lue : 88 en 116 microsecondes.
Valeur lue : 92 en 112 microsecondes.
Valeur lue : 98 en 116 microsecondes.
Valeur lue : 106 en 116 microsecondes.
Valeur lue : 125 en 116 microsecondes.
Valeur lue : 133 en 112 microsecondes.
Valeur lue : 139 en 112 microsecondes.
Valeur lue : 146 en 116 microsecondes.
Valeur lue : 162 en 116 microsecondes.
Valeur lue : 176 en 116 microsecondes.
Valeur lue : 186 en 112 microsecondes.
Valeur lue : 198 en 112 microsecondes.
Valeur lue : 213 en 116 microsecondes.
Valeur lue : 235 en 116 microsecondes.
Valeur lue : 251 en 116 microsecondes.
Valeur lue : 262 en 112 microsecondes.
Valeur lue : 272 en 116 microsecondes.
Valeur lue : 287 en 116 microsecondes.
Valeur lue : 297 en 116 microsecondes.
Valeur lue : 303 en 112 microsecondes.
Valeur lue : 308 en 112 microsecondes.
Valeur lue : 312 en 116 microsecondes.
Valeur lue : 323 en 116 microsecondes.
Valeur lue : 330 en 116 microsecondes.
Valeur lue : 341 en 112 microsecondes.
Valeur lue : 351 en 116 microsecondes.
Valeur lue : 359 en 116 microsecondes.
Valeur lue : 364 en 116 microsecondes.
Valeur lue : 372 en 112 microsecondes.
Valeur lue : 378 en 112 microsecondes.
Valeur lue : 388 en 116 microsecondes.
Valeur lue : 398 en 116 microsecondes.
Valeur lue : 405 en 116 microsecondes.
Valeur lue : 412 en 112 microsecondes.
Valeur lue : 423 en 116 microsecondes.
Valeur lue : 433 en 116 microsecondes.
Valeur lue : 441 en 116 microsecondes.
Valeur lue : 448 en 112 microsecondes.
Valeur lue : 455 en 112 microsecondes.
Valeur lue : 465 en 116 microsecondes.
Valeur lue : 481 en 116 microsecondes.
Valeur lue : 489 en 116 microsecondes.
Valeur lue : 499 en 112 microsecondes.
Valeur lue : 504 en 116 microsecondes.
Valeur lue : 516 en 116 microsecondes.
Valeur lue : 531 en 116 microsecondes.
Valeur lue : 542 en 112 microsecondes.
Valeur lue : 558 en 112 microsecondes.
Valeur lue : 573 en 116 microsecondes.
Valeur lue : 583 en 116 microsecondes.
Valeur lue : 595 en 116 microsecondes.
Valeur lue : 604 en 112 microsecondes.
Valeur lue : 614 en 116 microsecondes.
Valeur lue : 627 en 116 microsecondes.
Valeur lue : 638 en 116 microsecondes.
Valeur lue : 650 en 112 microsecondes.
Valeur lue : 656 en 112 microsecondes.
Valeur lue : 666 en 116 microsecondes.
Valeur lue : 676 en 116 microsecondes.
Valeur lue : 689 en 116 microsecondes.
Valeur lue : 701 en 112 microsecondes.
Valeur lue : 715 en 116 microsecondes.
Valeur lue : 730 en 116 microsecondes.
Valeur lue : 748 en 116 microsecondes.
Valeur lue : 763 en 112 microsecondes.
Valeur lue : 779 en 112 microsecondes.
Valeur lue : 792 en 116 microsecondes.
Valeur lue : 805 en 116 microsecondes.
Valeur lue : 815 en 116 microsecondes.
Valeur lue : 824 en 112 microsecondes.
Valeur lue : 831 en 116 microsecondes.
Valeur lue : 839 en 116 microsecondes.
Valeur lue : 846 en 116 microsecondes.
Valeur lue : 853 en 112 microsecondes.
Valeur lue : 861 en 112 microsecondes.
Valeur lue : 870 en 116 microsecondes.
Valeur lue : 879 en 116 microsecondes.
Valeur lue : 889 en 116 microsecondes.
Valeur lue : 900 en 112 microsecondes.
Valeur lue : 911 en 116 microsecondes.
Valeur lue : 924 en 116 microsecondes.
Valeur lue : 936 en 116 microsecondes.
Valeur lue : 948 en 112 microsecondes.
Valeur lue : 961 en 112 microsecondes.
Valeur lue : 970 en 116 microsecondes.
Valeur lue : 982 en 116 microsecondes.

Que remarquons-nous ?

Hormis le fait que je n’aie pas eu le temps d’aller au bout du potentiomètre, chaque appel à analogRead prends minimum 112 µs, je ne mesure pas la précision ici, car ça n’aurait pas de sens, mais les valeurs semblent toutes cohérentes, et bien réparties (pas de "blocage" au niveau d’une valeur).

ADC et AtMega

Afin d’augmenter la vitesse de nos mesures analogiques, nous allons devoir passer par une interface plus bas niveau, qui est celle du microcontrôleur, ici, l’AtMega328.

Ce qui nous pose problème est que l’ADC (le composant qui convertit notre valeur analogique en une valeur numérique lisible par Arduino) travaille avec une fréquence plus basse que celle de l’Arduino, afin d’améliorer sa précision.

Le rapport de division de la fréquence de l’ADC par rapport à la fréquence principale de l’Arduino peut être réglé parmi les valeurs suivantes : 128, 64, 32, 16, 8, 4 et 2. Ce rapport est choisi par des variables réglées au niveau du processeur (des registres, mais peu importe). Ces variables - à valeurs booléennes - sont ADPS0, ADPS1 et ADPS2.

La configuration de la fréquence en fonction de ces variables est la suivante :

ADPS2 ADPS1 ADPS0 Facteur de division
1 1 1 128
1 1 0 64
1 0 1 32
1 0 0 16
0 1 1 8
0 1 0 4
0 0 1 2
0 0 0 2

Si nous jetons un œil à la configuration de cet ADC dans le code d’Arduino, voici comment est configuré ADC :

 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
#if defined(ADCSRA)
    // set a2d prescaler so we are inside the desired 50-200 KHz range.
    #if F_CPU >= 16000000 // 16 MHz / 128 = 125 KHz
        sbi(ADCSRA, ADPS2);
        sbi(ADCSRA, ADPS1);
        sbi(ADCSRA, ADPS0);
    #elif F_CPU >= 8000000 // 8 MHz / 64 = 125 KHz
        sbi(ADCSRA, ADPS2);
        sbi(ADCSRA, ADPS1);
        cbi(ADCSRA, ADPS0);
    #elif F_CPU >= 4000000 // 4 MHz / 32 = 125 KHz
        sbi(ADCSRA, ADPS2);
        cbi(ADCSRA, ADPS1);
        sbi(ADCSRA, ADPS0);
    #elif F_CPU >= 2000000 // 2 MHz / 16 = 125 KHz
        sbi(ADCSRA, ADPS2);
        cbi(ADCSRA, ADPS1);
        cbi(ADCSRA, ADPS0);
    #elif F_CPU >= 1000000 // 1 MHz / 8 = 125 KHz
        cbi(ADCSRA, ADPS2);
        sbi(ADCSRA, ADPS1);
        sbi(ADCSRA, ADPS0);
    #else // 128 kHz / 2 = 64 KHz -> This is the closest you can get, the prescaler is 2
        cbi(ADCSRA, ADPS2);
        cbi(ADCSRA, ADPS1);
        sbi(ADCSRA, ADPS0);
    #endif
    // enable a2d conversions
    sbi(ADCSRA, ADEN);
#endif

Nous remarquons que la fréquence de travail de notre ADC est fixée à 125 kHz quelle que soit la fréquence du processeur, en utilisant à chaque fois les valeurs adaptées pour ADPS0, ADPS1 et ADPS2.

Le cas intéressant est la partie 16 MHz / 128, puisqu’elle concerne notre Arduino Nano, nous voyons que ADPS0, ADPS1 et ADPS2 sont mis à l’état haut (valeur logique 1) ; notre rapport de division est donc bien de 128, en se référant au tableau ci-dessus.

Augmenter la rapidité des mesures

Avec le fonctionnement de cette partie ADC en tête, il nous est possible de réutiliser ces fonctions sbi et cbi afin d’imposer à l’Arduino notre propre rapport de division.

Revoyons notre setup :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// On stocke les temps avant et après notre analogRead
unsigned long start_times[100];
unsigned long stop_times[100];
// Les valeurs lues sont aussi stockées, pour avoir une approximation de la précision
unsigned long values[100];

// Si les fonctions ne sont pas définies (improbable), nous les ajoutons nous-même
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

void setup() {
  // Vous verrez pourquoi le baud rate n'est pas important ici
  Serial.begin(9600);
  pinMode(2, INPUT);

  // Réutilisation du même rapport de 128
  sbi(ADCSRA, ADPS2);
  sbi(ADCSRA, ADPS1);
  sbi(ADCSRA, ADPS0);
}

Le principe est que la fonction sbi marque le bit à 1, et la fonction cbi le passe à 0. ADCSRA est le registre principal dans lequel sont contenus ADPS0, ADPS1 et ADPS2, ce n’est pas très important à comprendre ici, pour plus d’informations, voir la datasheet de l’AtMega.

Ainsi, nous allons maintenant tester une division par 16 :

1
2
3
  sbi(ADCSRA, ADPS2);
  cbi(ADCSRA, ADPS1);
  cbi(ADCSRA, ADPS0);

Expérience avec une ratio de division à 16

Relançons notre code de test de tout à l’heure avec un ratio de division de 16, cette fois. Voici un résultat :

  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
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
Valeur lue : 15 en 32 microsecondes.
Valeur lue : 0 en 20 microsecondes.
Valeur lue : 7 en 20 microsecondes.
Valeur lue : 13 en 20 microsecondes.
Valeur lue : 22 en 20 microsecondes.
Valeur lue : 30 en 20 microsecondes.
Valeur lue : 36 en 20 microsecondes.
Valeur lue : 50 en 16 microsecondes.
Valeur lue : 61 en 20 microsecondes.
Valeur lue : 74 en 20 microsecondes.
Valeur lue : 87 en 16 microsecondes.
Valeur lue : 100 en 20 microsecondes.
Valeur lue : 111 en 20 microsecondes.
Valeur lue : 121 en 20 microsecondes.
Valeur lue : 132 en 16 microsecondes.
Valeur lue : 145 en 24 microsecondes.
Valeur lue : 159 en 16 microsecondes.
Valeur lue : 176 en 20 microsecondes.
Valeur lue : 191 en 20 microsecondes.
Valeur lue : 199 en 20 microsecondes.
Valeur lue : 207 en 16 microsecondes.
Valeur lue : 216 en 20 microsecondes.
Valeur lue : 225 en 20 microsecondes.
Valeur lue : 236 en 20 microsecondes.
Valeur lue : 243 en 20 microsecondes.
Valeur lue : 248 en 20 microsecondes.
Valeur lue : 258 en 16 microsecondes.
Valeur lue : 283 en 20 microsecondes.
Valeur lue : 306 en 20 microsecondes.
Valeur lue : 324 en 20 microsecondes.
Valeur lue : 335 en 16 microsecondes.
Valeur lue : 348 en 24 microsecondes.
Valeur lue : 361 en 20 microsecondes.
Valeur lue : 374 en 16 microsecondes.
Valeur lue : 384 en 20 microsecondes.
Valeur lue : 393 en 20 microsecondes.
Valeur lue : 404 en 20 microsecondes.
Valeur lue : 415 en 16 microsecondes.
Valeur lue : 431 en 16 microsecondes.
Valeur lue : 440 en 20 microsecondes.
Valeur lue : 444 en 20 microsecondes.
Valeur lue : 451 en 20 microsecondes.
Valeur lue : 463 en 20 microsecondes.
Valeur lue : 473 en 20 microsecondes.
Valeur lue : 483 en 20 microsecondes.
Valeur lue : 494 en 16 microsecondes.
Valeur lue : 500 en 20 microsecondes.
Valeur lue : 511 en 20 microsecondes.
Valeur lue : 524 en 16 microsecondes.
Valeur lue : 536 en 20 microsecondes.
Valeur lue : 548 en 20 microsecondes.
Valeur lue : 560 en 20 microsecondes.
Valeur lue : 572 en 20 microsecondes.
Valeur lue : 583 en 20 microsecondes.
Valeur lue : 596 en 20 microsecondes.
Valeur lue : 608 en 16 microsecondes.
Valeur lue : 622 en 16 microsecondes.
Valeur lue : 636 en 16 microsecondes.
Valeur lue : 652 en 20 microsecondes.
Valeur lue : 664 en 20 microsecondes.
Valeur lue : 678 en 20 microsecondes.
Valeur lue : 691 en 16 microsecondes.
Valeur lue : 704 en 20 microsecondes.
Valeur lue : 718 en 16 microsecondes.
Valeur lue : 732 en 20 microsecondes.
Valeur lue : 748 en 20 microsecondes.
Valeur lue : 769 en 20 microsecondes.
Valeur lue : 791 en 20 microsecondes.
Valeur lue : 813 en 20 microsecondes.
Valeur lue : 839 en 20 microsecondes.
Valeur lue : 865 en 20 microsecondes.
Valeur lue : 892 en 20 microsecondes.
Valeur lue : 911 en 16 microsecondes.
Valeur lue : 931 en 16 microsecondes.
Valeur lue : 949 en 20 microsecondes.
Valeur lue : 967 en 20 microsecondes.
Valeur lue : 978 en 20 microsecondes.
Valeur lue : 989 en 16 microsecondes.
Valeur lue : 999 en 20 microsecondes.
Valeur lue : 1009 en 16 microsecondes.
Valeur lue : 1020 en 20 microsecondes.
Valeur lue : 1023 en 16 microsecondes.
Valeur lue : 1023 en 24 microsecondes.
Valeur lue : 1023 en 16 microsecondes.
Valeur lue : 1023 en 20 microsecondes.
Valeur lue : 1023 en 20 microsecondes.
Valeur lue : 1023 en 20 microsecondes.
Valeur lue : 1023 en 20 microsecondes.
Valeur lue : 1023 en 16 microsecondes.
Valeur lue : 1023 en 16 microsecondes.
Valeur lue : 1023 en 20 microsecondes.
Valeur lue : 1023 en 16 microsecondes.
Valeur lue : 1023 en 20 microsecondes.
Valeur lue : 1023 en 20 microsecondes.
Valeur lue : 1023 en 20 microsecondes.
Valeur lue : 1023 en 20 microsecondes.
Valeur lue : 1023 en 20 microsecondes.
Valeur lue : 1023 en 16 microsecondes.
Valeur lue : 1023 en 20 microsecondes.
Valeur lue : 1023 en 20 microsecondes.

J’ai poussé le potentiomètre un peu trop vite, cette fois. Sinon, le temps d’exécution est largement inférieur, on passe à 20 µs dans le pire des cas.

Il semble ici que la précision de la mesure n’ait pas été impacté, cela est dû à l’impossibilité de vérifier, en réalité, si nous étions très précis, il y a de grandes chances que la mesure soit plus imprécise que tout à l’heure.

Les limites

Je parlais des limites au niveau de la précision dans la partie précédente, et il est effectivement nécessaire de trouver un compromis entre vitesse d’exécution et précision.

En effet, voici ce que cela donne si nous poussons les limites en passant le diviseur à 2 :

  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
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
Valeur lue : 1023 en 12 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 16 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 8 microsecondes.
Valeur lue : 1023 en 4 microsecondes.
Valeur lue : 1023 en 8 microsecondes.

Oui, oui, j’ai bien tourné le potentiomètre, promis.

L’ADC est ici dépassé par la fréquence de mesure, et ne peut donc plus mesurer correctement, renvoyant 1023 pour unique valeur.


Bien, c’est tout pour cette courte expérience, j’espère que cela vous donnera des idées pour utiliser vos entrées analogiques, et je vous laisse sur un petit tableau récapitulatif des temps de mesure pour chaque division possible :

Rapport de division Temps min. Temps max. Fréquence moyenne
128 112 µs 116 µs 8.7 kHz
64 54 µs 64 µs 17.2 kHz
32 32 µs 36 µs 30.3 kHz
16 16 µs 20 µs 55.5 kHz
8 12 µs 20 µs 71.4 kHz
4 8 µs 12 µs 100 kHz
2 4 µs 12 µs 125 kHz

Les valeurs me semblent correctes jusqu’à 16, mais commencent à devenir étranges à partir de 8, et c’est n’importe quoi à partir de 2 (voir la partie 5 sur les limites).

L’icône de ce billet a été réalisée par Vect+ et publiée sous licence CC-BY, j’y ai ensuite disposé les couleurs de ZdS ainsi que le logo d’Arduino.

5 commentaires

Voilà, tu fais ce que peu de gens font : lire la datasheet et ne pas prendre l’API Arduino (ou autre) comme référence absolue :)

Arduino permet un développement simplifié, mais il ne faut hésiter à mettre les mains dans le cambouis et retourner au code C ou à l’assembleur pour optimiser les choses.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte