Skip to content

TinyRail v0.14.0-beta.6

Pre-release
Pre-release

Choose a tag to compare

@chpeps chpeps released this 31 Aug 10:27
· 21 commits to main since this release

Changer une sortie ne fait plus sursauter les autres

Commuter une sortie faisait sursauter brièvement toutes les autres — visible à
l'œil, et gênant pour ce qui est alimenté.

Deux observations ont fait le diagnostic, et la première a tué la piste la plus
évidente : le sursaut se voyait même quand la sortie commutée n'avait aucune
charge
. Aucun courant appelé, donc rien à voir avec l'appel de courant au
démarrage — et le remède qu'on aurait naturellement appliqué, un démarrage en
douceur, n'aurait rien réglé.

La cause était dans le composant pca9685 d'ESPHome, et ce sont deux défauts
qui se cumulent :

  • il réécrit les seize canaux dès qu'un seul change. À 400 kHz, huit canaux
    prennent ~1,5 ms, soit plus d'une période PWM entière à 1 kHz : chaque canal
    se fait recharger ses comparateurs à un instant arbitraire de son cycle. Ce
    n'est pas la valeur écrite qui pose problème — les autres canaux reçoivent
    des valeurs identiques — c'est l'acte de recharger, qui peut faire manquer
    la transition du cycle en cours ;
  • son mode par défaut met la sortie à jour à chaque octet acquitté, donc
    quatre fois par canal, dont trois sur des registres à moitié écrits.

Commuter une sortie écrit désormais quatre octets au lieu de trente-deux, et
les canaux qui n'ont pas bougé ne sont plus touchés du tout.

Coût : 16 octets de RAM, et 182 octets de flash rendus.

Rien d'autre ne change : ni le protocole, ni les réglages, ni le comportement
des sorties.

Sur la carte, et c'est le seul juge qui vaille : un glitch d'un cycle PWM
dure une milliseconde, hors de portée de tout ce qui se mesure ici — la carte
échantillonne à 500 ms. Le sursaut a disparu à l'œil.

Le composant est copié localement, ce qui est un piège à retardement : une
montée d'ESPHome pourrait l'écraser sans un mot. tools/check-pca9685.py
surveille les deux moitiés du risque — les correctifs toujours là, et le reste
qui n'a pas divergé de l'amont.

Le défaut de surintensité est rémanent : il reste levé après la coupure et
ne s'efface qu'au rallumage de la sortie. Un client ne doit pas le traiter comme
une impulsion. ⚠️ Cette partie-là n'a toujours pas disjoncté pour de vrai :
l'éprouver demande une charge d'au moins 1 A et tests/test_overcurrent.py.