Bonjour à toutes et à tous,
Faisant un essai de rapidité de lecture d'une entrée analogique avec un Nano, j'ai trouvé qu'il faisait de l'ordre de 8900 lectures par secondes. Ça va pas loin !
Je me suis dit c'est un CAN 10 bits, peut-être est-il configurable en 8 bits pour accélérer la cadence. J'ai lu des articles sur les registres correspondants, et, à mon avis, c'est un 10bits, c'est un 10 bits, point final.
Dans ces registres, j'ai vu que le CAN était piloté par la fréquence du quartz divisée par la valeur des trois bits de poids faibles du registre ADCSRA et qui sont, par défaut à 128 soit 125 kHz.
Je me suis dit, pour jouer, je vais voir si en changeant ces bits, j'obtiens quelque chose.
Et ben là, j'en reste sur le c.. Voilà ce que j'obtiens :
ADSSRA = 10000111 : Fcan = 125 kHz ; Nb lectures / seconde = 8900
ADSSRA = 10000110 : Fcan = 250 kHz ; Nb lectures / seconde = 17800
ADSSRA = 10000101 : Fcan = 500 kHz ; Nb lectures / seconde = 33200
ADSSRA = 10000100 : Fcan = 1 MHz ; Nb lectures / seconde = 62500
ADSSRA = 10000011 : Fcan = 2 MHz ; Nb lectures / seconde = 102000
ADSSRA = 10000010 : Fcan = 4 MHz ; Nb lectures / seconde = 155000
ADSSRA = 10000001 : Fcan = 8 MHz ; Là, ça déconne
Jusqu'à 4 MHz, la valeur mesurée est toujours bonne !
On voit qu'il n'y a pas doublement du nombre de mesures/s à chaque fois que je multiplie la fréquence par 2, c'est sûrement lié au temps "constant" de mise en œuvre de la fonction "analogRead()".
C'est bluffant ! On doit certainement pouvoir aller encore plus vite si, au lieu d'utiliser la fonction analogRead(), on le fait par la programmation directe des registres. Mais je ne sais pas (encore) faire.
Voici le petit sketch qui me permet de voir ça ( j'ai un petit pont diviseur résistif entre VCC et GND et relié à A3:
int analog;
uint8_t freq;
void setup() {
Serial.begin(9600);
pinMode(A3, INPUT);
freq = ADCSRA;
Serial.println(freq, BIN);
ADCSRA = 130; // faire baisser cette valeur jusqu'à 130
freq = ADCSRA;
Serial.println(freq, BIN);
}
void loop() {
unsigned long t0 = millis();
for (int i = 0; i < 10000; i++) {
analog = analogRead(A3);
}
Serial.println("A = " + String(10000000 / (millis() - t0)) + " " + String(analog));
}
Cordialement.
Pierre