CAN d'une Uno avec pull-up

Bonjour,

J'ai fait deux mesures avec le schéma suivant:
image

avec le programme suivant:

void setup()
{
  Serial.begin(115200); // Régler aussi la console à 115200 bauds!
  pinMode(A5, INPUT_PULLUP);
}

void loop()
{
  Serial.println(analogRead(A5));
    delay(1000); // Pas trop souvent
}

Chose que je n'arrive pas à m'expliquer, j'obtiens 14 pour la mesure n°1 alors que je m'attendais à 0 et 995 pour la mesure n°2 au lieu des 1024 espérés.

Avec le programme:

void setup()
{
  Serial.begin(115200); // Régler aussi la console à 115200 bauds!
  analogReference(INTERNAL); // Pour passer à 1,1V
  pinMode(A5, INPUT_PULLUP);
}

void loop()
{
  Serial.println(analogRead(A5));
    delay(1000); // Pas trop souvent
}

En mettant la référence à 1,1V, j'ai 72 pour la mesure n°1 au lieu de 0, ce qui correspond à peu près à la mesure précédente (5 fois plus, la référence étant 5 fois plus petite).
Pour la mesure n°2, je retrouve bien mes 1024 que j'ai de toutes façon car la tension sur A5 est supérieure à 1,1V.

Note: la résistance de 35kΩ est la résistance de pull-up interne et sa valeur est celle qui est lue dans la datasheet.


Maintenant si je fais le montage:
image
Avec le programme:

void setup()
{
  Serial.begin(115200); // Régler aussi la console à 115200 bauds!
  pinMode(A5, INPUT); // Inutile car fait par le Reset de la carte
  pinMode(A4, INPUT_PULLUP);
}

void loop()
{
  Serial.println(analogRead(A5));
    delay(1000); // Pas trop souvent
}

Cette fois-ci la résistance de pull-up est celle de l'entrée A4, et les résultats sont conformes à ce que je pensais, à savoir je lis 0 pour la mesure n°1 et 1024 pour la mesure n°2. En passant à la référence de 1,1V, cela ne change rien non plus.


Et si j'utilise une résistance de pull-up externe:

image
cette image est dans le post suivant!

Avec le programme:

void setup()
{
  Serial.begin(115200); // Régler aussi la console à 115200 bauds!
  pinMode(A5, INPUT); // Inutile car fait par le Reset de la carte
}

void loop()
{
  Serial.println(analogRead(A5));
    delay(1000); // Pas trop souvent
}

Cela donne aussi 0 et 1024 aussi bien avec la référence de 5V que la 1,1V.


Question: pourquoi la pull-up de la broche A5 ne donne pas les bonnes valeurs? Si c'était dû au dropout du transistor qui insère la résistance de pull-up, je devrais avoir le même problème aussi lorsque j'utilise la pull-up de la broche A4. Et cela n'expliquerait pas le 14 ou 72 lu dans le montage n°1 (correspondant à une tension voisine de 0,077V).

Il faudrait réaliser les mêmes mesures sur plusieurs cartes pour savoir si c'est spécifique à cette carte ou si toutes les cartes avec un ATmega 328 ont ce comportement.
Si c'est spécifique à cette carte alors la A5 a pu être stressée (court-circuit, décharge électrostatique, ...) et cet I/O aurait un comportement atypique.

Les résistance de tirage ne font pas 35 k.
Actuellement je n’ai pas accès a la datasheet, de mémoire je dirais entre 35k et 70 k.
Elles sont a 30 % près ce qui est très classique dans un circuit intégré. Ce n’est pas gênant car elles sont toutes décalées du même pourcentage vu qu’elles ont été faites en même temps.

En mettant A5 en mode digital entrée et pull up activées.
Si tu place une résistance de 51.1 k entre masse et pin A5 pour faire un pont diviseur résistif tu trouve combien mesuré avec un voltmètre ?

Bonjour,

AnalogRead effectue la configuration de l'entrée en entrée analogique avant de faire effectivement la mesure. Il faudrait voir si la fonction ne supprime pas le pullup interne.

1 Like

J'ai reproduit la manip sur une Arduino Diecimila, je n'ai pas de UNO mais elles sont à priori identiques.
Le programme 1 me donne 0 et 1023.
Donc avant d'aller plus loin dans les spéculations vous devriez essayer cela ne prend pas plus de 2 minutes.

Il manquait un saut de ligne à la fin de la ligne au-dessus de l'image

Le code dans wiring_analog.c ne semble pas faire ça.

Il y a deja eu une discussion sur ce forum et la conclusion etait que CAD et pull up sont deux reglages indépendants.

En digital A4 et A5 sont particulières.
Une entrée numerique d’un atmega commute autour de Vcc/2 avec un faible hysteresis .
A4 et A5, quand elles sont en mode I2C , commutent aux normes CMOS -> voir la partie I2C des ”Electrical Characteristics” de la datasheet du micro.

Ce qu’il y a derriere la pin A4 ou A5 est différent de ce qu’il y a derrière A0-A3

1 Like

J'ai refait l'essai avec ma carte préférée, et le couple (998, 14) apparaît sur toutes les entrées, aussi bien sur A5 (seule broche libre quand je mets un afficheur parallèle) que sur les 5 autres.
J'ai aussi fait l'essai avec deux autres Uno, une chinoise et une italienne, neuves toutes les deux, c'est pareil.
L'essai est le même avec une Mega.
Avec une nano neuve, j'ai bien 1023, mais j'ai du coup 16 en connectant GND

Je me suis basé sur ce diagramme:


5V/140mA donne 36kΩ
Mais en fait, que ce soit 10kΩ ou 100kΩ, cela ne change rien pour cette mesure.

R CAN Voltmètre
39.6kΩ 515 2,46V
42,0kΩ 533 2,57V
58,3kΩ 611 2,94V

La tension d'alim est de 4,96V, je trouve bien une résistance voisine de 36kΩ.

Je le pensais aussi au début, mais les test montre que non. Si la pull-up y est j'ai environ 1000 en l'air, et cela fait n'importe quoi si la pull-up n'y est pas. C'est ce que j'observe d'ailleurs avec les broches A6 et A7 de la nano qui n'ont pas de pull-up.

Je n'ai pas toutes les cartes en main! Je n'ai pas de Diecimila. Mais elle est équipée d'un ATmega168 et pas d'un 328. Ce qui ne devrait pas changer, vu que j'ai la même chose sur une Mega.

Merci!

Mais cela n'a pas d'importance, je ne lis pas la broche en tout ou rien. Et avec mon programme, j'ai le même résultat.

Non, non, c'est bien un 328.

Ce n'est pas ce qui est dit :slight_smile: Arduino Diecimila | Arduino Documentation

Mais comme j'ai la même chose avec une AtMega2560...

Là, je commence à me poser des questions sur ta manip.

Je l'ai aussi faite sur une Mega et je trouve aussi 0 et 1023.

Dans le doute, j'ai aussi essayé avec une Nano et toujours 0 et 1023
Mêmes valeurs sur une carte maison avec un ATmega1284, toujours 0 et 1023.

J'utilise juste un fil "Dupont" entre A5 et les bornes GND ou +5V de la carte et j'ai des valeurs différentes de toi.

Une erreur s'est glissée dans mon premier post: C'est bien les entrées A4 ou A5; je n'ai pas utilisé les entrées 4 ou 5. C'est corrigé.

Il n'y a quasiment pas de manip: je copie le premier programme dans la carte qui n'a que le connecteur USB branché, et s'affiche sur la console 994 à 998. La carte est en l'air et ne touche rien. Il n'y a aucun fil Dupont branché. Pour le test 2, j'ai en plus un fil Dupont entre GND et A5.

En mettant un fil entre A5 et VCC, j'ai bien le 1023.


Si je télécharge le programme:

void setup()
{
  pinMode(A5, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
}

word lecture; // valeur lue
void loop()
{
  for (lecture = analogRead(A5); lecture < 1024; lecture++)
  { 
    digitalWrite(LED_BUILTIN, HIGH); // Autant de flashs que l'écart
    delay(300);
    digitalWrite(LED_BUILTIN, LOW);
    delay(300);
  }
  delay(2000); // Pour séparer les trains de flashs
}

et que j'utilise l'alim 5V de mon téléphone, j'ai une vingtaine de flashs. Test pour vérifier le 1023: je branche un fil entre Vcc et A et j'ai bien un seul flash toutes les 2 secondes.

La courbe que tu cites est en caractéristique "typique".
Pour avoir les cas extremes je me base sur :

35 k est bien au centre de l'intervalle 20k--50k
Si tu trouves 36 k c'est que soit Microchip est très prudent et sa production est plus resserrée que ce qu'il annonce, soit tu as eu du bol sur ton exemplaire. :smiley:

@dfgh a mesuré 37kΩ Je n'ai pas fait le test sur d'autres cartes, mais cela n'influence pas du tout le résultat de mon questionnement actuel. De toutes façon si je dois utiliser avec plus de précision cette valeur, j'en ferai la mesure carte par carte.

tu es particulièrement doué ...

1023 tu as raison!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.