[non résolu, abandonné]Problème I²C et extinction de périphs

Bonjour,

Pour un vélo électrique, je me fait un système affichant la tension moyenne par cellules de la batterie, et un petit graph des écarts à la moyenne, aussi il inclura une alarme anti-vol et donc un système de verrouillage.

Le système est en veille 24h/24 et se réveille dans 3 cas : un aimant est détecté sur un capteur effet Hall, une vibration est détectée sur un capteur de vibrations (SW-420) ou un bouton a été pressé.
Ces conditions sont activées ou désactivés selon l’état du vélo : déverrouillé (on s’en fout des interrupt vibrations, on se fout de la détection d’aimant) ou verrouillé (on attend un aimant ou une vibration)
Si une vibration est détectée, une jolie mélodie sortira d’une alarme 130dB.

Ma batterie contient 12 cellules LiPo, précisément 4 batteries de 3 cellules mis en séries. Donc 12 mesures de tension à faire

Le cerveau de ma carte (custom) est un ATmega328P, je n’ai pas assez de port analogiques. Donc j’ai sur ma carte deux MAX1238, qui permettent 24 entrées analogiques simples ou 12 différentielles (mesure sans GND commun : utile dans mon cas, la batterie atteignant 50V) et communiquent en I²C.

Vu que je veux afficher tout ça, j’ai un écran OLED I²C

Je veux alimenter le tout par un accu type 18650 3.7v li-ion, je veux éviter d’avoir à le charger tout le temps. Du coup je veux me faire un système très économe niveau énergie.
je vise une moyenne de conso inférieur à 1mA, pour ça : veille autant que possible et extinction des périphériques I²C.

J’ai il y a deux jours fini de réaliser la carte électronique et je commence à peaufiner mon code pour que tout fonctionne correctement

Petit résumé du fonctionnement de la carte :

Entrée 2.7-12V convertie en ~5V via S7V7F5
5V convertie en 3.3V pour l’ATmega328P
MAX1238 alimentés en 5V, un PCA9306 se charge de changer le niveau logique entre l’µc et les MAXs
L’alim des MAX est pilotée par des MOSFETs
L’alim de l’écran est gérée par l’µc

Les MAX1238 possèdent une adresse fixe, pour éviter que ce soit le bordel avec l’I²C, j’éteins le MAX1238 auquel je ne veut pas parler. Quand l’écran n’est pas utilisé, il est éteint.

Quand la carte s’allume, l’écran OLED est actif et affiche “hello !” pendant 1,5sec
Ensuite pendant 15 sec, l’écran s’actualise toute les secondes pour afficher la tension.
Une fois les 15 actualisations réalisées, tout le monde part en veille.
Quand un appui de bouton est détecté, tout le monde debout, 15 actualisations se refont, toute les secondes puis dodo.
Si appui de bouton pendant plus de 3sec, le mode “sécu” s’enclenche. Si le vélo bouge, l’alarme gueule.
Pour le déverrouiller : placer un aimant près du capteur Hall.

l’actualisation des valeurs se fait comme suit :

  • allumage MAX1238 n°1 et demande des valeurs via I²C
  • extinction du MAX1238 n°1
  • allumage MAX1238 n°2 et demande des valeurs via I²C
  • extinction du n°2
  • calculs
  • affichage

Le problème :

  • quand j’allume la carte, l’écran s’allume, mais quand la carte se met en veille, l’écran ne veut plus s’allumer. Aïe.

  • Quand la carte s’allume au début, la tension moyenne reste à 0 avec rien de connecté, j’ai essayé de connecter une batterie (3cellules /12) mais tjrs rien. Visiblement les MAX1238 ne répondent pas. Ouille.

  • J’ai mesuré la tension aux bornes d’un des MAX, et il semble qu’il ne reste pas allumé assez longtemps pour être correctement alimenté (condo de 4.7µF à coté, trop ?) je vais creuser là dessus.

Ça m’emmerde pas mal.
Je miserais sur un problème d’I²C qui n’aimerais pas la déconnexion de ses copains. Réinitialiser le bus après la veille ou après chaque réveil de composant pourrait résoudre ça ? Comment faire ?

Du coup je vous appel à l’aide pour résoudre ça.

Je vous passe les liens de quelques datasheet en lien avec le soucis :
MAX1238 : https://datasheets.maximintegrated.com/en/ds/MAX1236-MAX1239M.pdf
PCA9306 : http://www.ti.com/lit/ds/symlink/pca9306.pdf
mosfets : https://www.infineon.com/dgdl/Infineon-BSZ120P03NS3_G-DS-v02_01-en.pdf?fileId=db3a304326dfb13001271f0c11864edd

Le code est donné et normalement à peu près compréhensible, si vous avez des questions n’hésitez pas !

Le schéma électrique est aussi dispo (en deux parties)

Schematic1.pdf (121 KB)

Schematic2.pdf (114 KB)

CodeTBSS.ino (8.88 KB)

Salut

Apparemment les MAX1238 consomment peu : 0.5µA in Power-Down Mode Pourquoi couper leur alimentation ?

Personnellement je les laisserais alimentés. Le mode veille est automatique.

Automatic shutdown occurs between conversions when the MAX1236–MAX1239 are idle.

@+

Les MAX1238 me posent problème parce qu'ils ont la même adresse I2C. Donc j'allume celui qui m'intéresse, j'éteins l'autre.

La conso ne me pose pas trop de problème, mais c'est surtout l'adressage qui ne vas pas.

Sauf si vous avez une idée coté software pour corriger ça :-/

Edit : Alors, après avoir joué avec un oscillo, j'ai trouvé ça :

  • Le module OLED pull-down les lignes I2C quand il est éteint. Heureusement, j'ai mesuré sa conso en affichage écran noir : 0.012mA il restera donc allumé tout le temps. (résolu)

  • Les MAX1238 ne pull-down pas les lignes I2C quand ils sont éteint (l'affichage fonctionnait donc on pouvait s'en douter)

  • Les condensateurs placés à coté des MAX sont effectivement trop gros (un 0.1uF et un 4.7uF) je vais enlever le 4.7uF pour voir le résultat. Actuellement, la courbe de tension ne ressemble pas à un créneau arrondi mais plutôt à une courbe qui part de 5v et tend vers 0v façon fonction inverse allongée sur la durée

Les MAX1238 me posent problème parce qu'ils ont la même adresse I2C

Ah ça c'est pas sympa.

C'est sûr que 4.7uF quand on fonctionne en basse conso, c'est gros. A chaque fois que l'alimentation monte, ils se remplissent, et ils se vident ensuite lentement. Autant d'énergie perdue.

@+

J'ai dégagé le 4.7uF, ça change pas mal, même avec juste un 0.1uF la tension prend 20ms pour revenir à 0 !

Ah du coup j'ai aussi trouvé une autre couille dans le code, j'ai mélangé les sorties "Alarm" "ADCa" et "ADCb"

Je ne comprenais pas la courbe de tension aux borne d'un des deux MAX1238 parce que son alim était reliée au pin dédié à l'alarme...

Du coup quand je voulais allumer le MAX1238 n°1, le second était allumé, et si j'allumais le n°2 l'alarme s'allumais... Heureusement qu'elle n'était pas branchée pour les tests.

Bref.

Il me reste toujours le soucis de com avec les deux MAXs

Je m'en vais mettre le nouveau code

Quand on fait la commande

Wire.begin();

Il faut que les périphériques I2C soient allumés ? Il se passe qqchose sur le bus à ce moment ?

Je ne pense pas. begin() configure les registres de l'I2C c'est tout.

Bon.

Après plusieurs tentatives, j'abandonne.

J'ai réussi à cramer un MAX Le code va encore me prendre du temps et j'en ai pas. Fait chier.

En plus au final le truc sera pas indispensable.

Donc fin de projet.

Youhou.

A+