Auteur Sujet: Problème pour utiliser l'horloge externe du PCA9685  (Lu 30609 fois)

hinano70

  • Newbie
  • *
  • Messages: 18
    • Voir le profil
Problème pour utiliser l'horloge externe du PCA9685
« le: novembre 07, 2020, 10:33:58 pm »
Bonjour
Je veux commander une quarantaine de cantons en PWM avec plusieurs PCA9685. Lorsqu'une loco change de canton, les 2 signaux de commande sont identiques pour éviter un court-circuit. Ca marche très bien si 2 cantons successifs sont reliés au même PCA9685. Mais si je les relie à 2 PCA9685 différents, il y a un court-circuit. J'ai mis du temps à trouver la raison : les signaux PWM doivent être déphasés entre PCA différents !
J'ai vu qu'on pouvait utiliser une horloge externe qui règlerait ce problème de désynchronisation et qu'on pouvait la "piloter" avec la fonction : setExtClk ()
http://adafruit.github.io/Adafruit-PWM-Servo-Driver-Library/html/class_adafruit___p_w_m_servo_driver.html
Mais à partir de là, je coince ! Mon circuit est commandé avec un Arduino Méga, où puis-je récupérer un signal d'horloge et qu'en faire avec le PCA9685 ?
Il y a bien une broche EO, mais je ne sais quoi en faire...
Merci pour votre aide ....
J'ai oublié de dire qu'il y a derrière les PCA des ponts en H L298N sur chaque alimentation de canton et que malheureusement je n'ai pas commandé tous les PCA9685 en même temps et chez le même fournisseur
« Modifié: novembre 08, 2020, 12:28:05 pm par hinano70 »

simontpellier

  • Full Member
  • ***
  • Messages: 115
    • Voir le profil
Re : Problème pour utiliser l'horloge externe du PCA9685
« Réponse #1 le: novembre 08, 2020, 10:06:01 pm »
Bonsoir,

J'ai la même configuration : PWM généré par PCA9685 et un L298N pour chaque section. Sauf que j'ai (beaucoup) moins de 16 sections et donc un seul PCA9685, pour l'instant en tous cas.
Sans avoir donc l'expérience de ce qui peut se produire dans votre cas, je pense toutefois que le problème n'est pas un problème de désynchronisme.
Ce problème existe, on le constate si l'on utilise les ports d'un Arduino, les ports PWM sont distribués sur plusieurs timers non synchrones. Mais sauf erreur de polarisation des ponts H, ça ne peut pas conduire à un court-circuit ; l'effet se limite à une accélération transitoire de la motrice au moment où elle s'alimente en même temps sur deux sections différentes : les "ondes" de PWM se superposent (leur temps "1") ce qui se traduit par une augmentation de la tension moyenne.
Ce problème a été traité (et résolu !) par "Jean-Luc", un des pionniers de ce site et je n'ai pas fait l'effort de fouiller pour vous fournir le lien du sujet mais vous pourriez y arriver avec cette info. Je ne me souviens pas mais je ne crois pas qu'une horloge externe était nécessaire. (Peut-être qqn d'autre saura-il retrouver le lien facilement ?)



hinano70

  • Newbie
  • *
  • Messages: 18
    • Voir le profil
Re : Problème pour utiliser l'horloge externe du PCA9685
« Réponse #2 le: novembre 09, 2020, 06:32:45 pm »
Merci
Cela m'a permis de trouver ça :
https://www.locoduino.org/spip.php?article203
"Dans un prochain article nous attaquerons le problème de la synchronisation des PWM entre les cantons qui pourront donc être commandés par des Arduino séparés."
C'est tout à fait ce qu'il me faut, mais je n'ai pas trouvé l'article.
Je suis tombé la dessus: http://forum.locoduino.org/index.php?topic=36.0. Je n'ai pas tout compris, il y a une bibliothèque à télécharger https://dl.dropboxusercontent.com/u/67740546/SyncPWM.zip mais le lien ne fonctionne plus !
Chez moi, ça devrait être plus simple puisque je n'ai qu'un seul Méga qui commande tout (pour l'instant)

hinano70

  • Newbie
  • *
  • Messages: 18
    • Voir le profil
Re : Problème pour utiliser l'horloge externe du PCA9685
« Réponse #3 le: novembre 09, 2020, 08:14:34 pm »
Le problème est que les PCA9685 possèdent leur propre horloge et que celles-ci ne sont pas synchro.
Je viens de parcourir le datasheet https://www.nxp.com/docs/en/data-sheet/PCA9685.pdf (c'est assez obscur pour moi), mais on voit bien qu'il y a possibilité de mettre une horloge externe, mais j'ai beau retourner dans tout les sens le shield, il n'y a pas de pin supplémentaire. Aïe ! Mauvais signe :
external clock input[2]   --->   [2]This pin must be grounded when this feature is not use
Dommage ! Plus loin on trouve
To use the EXTCLK pin, this bit must be set by the following sequence:1.  Set the SLEEP bit in MODE1. This turns off the internal oscillator.2.  Write logic 1s to both the SLEEP and EXTCLK bits in MODE1. The switch is now made. The external clock can be active during the switch because the SLEEP bit is set.This bit is a ‘sticky bit’, that is, it cannot be cleared by writing a logic 0 to it. The EXTCLK bit can only be cleared by a power cycle or software reset.EXTCLK range is DC to 50 MHz
Je ne comprends pas tout, mais il semble que la solution était là. Encore fallait-il que je sois capable d'accéder aux registres !!!
Il me reste une solution : si les décalages de phase sont faibles (j'en doute vu ce qui se passe entre 2 : l'alim disjoncte, avec 2 autres les trains broutent aux changement de canton) je peux décaler les signaux PWM:  pwm3.setPWM(N°, 0, vitesse) ---> pwm3.setPWM(N°, 0+x, vitesse+x)

Toutes les remarques pouvant m'aider sont les bienvenues !

hinano70

  • Newbie
  • *
  • Messages: 18
    • Voir le profil
Re : Problème pour utiliser l'horloge externe du PCA9685
« Réponse #4 le: novembre 20, 2020, 04:16:25 pm »
En fait décaler un signal par rapport à un autre est ridicule !
J'ai utilisé un oscillo pour visualiser les signaux PWM. Ils glissent l'un par rapport à l'autre (les horloges étant légèrement décalées) ce qui ne génère pas de court-circuit au passage du train en juxtaposant les signaux dans 2 cantons consécutifs. Je ne me l'explique pas ! Par contre les trains broutent (signaux en phase, décalés, en phase ....). J'ai eu des problèmes de court-circuit en alimentant les 2 cantons consécutifs avec 2 disjoncteurs différents (faits avec des MAX471 + relais...)
Il me reste donc à m'arranger pour mettre les jonctions entre cantons alimentés par des PCA9685 différents dans les parties cachées, mais avec 35 cantons, ça va être dur !
Il y a peut être des modules équivalents au PCA9685 ?

simontpellier

  • Full Member
  • ***
  • Messages: 115
    • Voir le profil
Re : Problème pour utiliser l'horloge externe du PCA9685
« Réponse #5 le: novembre 20, 2020, 05:48:48 pm »
Bien, on est donc d'accord, le court-circuit ne pouvait pas venir d'un désynchronisme.

Le broutage... NON PLUS ! quasi sûr que c'est un problème de définition de variable : attention les PCA 9685 codent les PWM sur 12 bits, soit 4096 valeurs ; Arduino sur 8 => une PWM Arduino doit donc être multipliée par 16. Et la variable ne doit pas être un byte sinon ça déborde... et ça broute.

(je n'ai pas compris  "décaler un signal par rapport à un autre est ridicule !"  ??)
« Modifié: novembre 20, 2020, 05:58:11 pm par simontpellier »

trimarco232

  • Sr. Member
  • ****
  • Messages: 266
    • Voir le profil
Re : Problème pour utiliser l'horloge externe du PCA9685
« Réponse #6 le: novembre 22, 2020, 04:42:41 pm »
Bonjour,
je crains qu'il ne soit pas possible de synchroniser les timers des PCA9685
l'entrée EXTCLK est faite pour faire marcher un PCA9585 à une fréquence customisée
si on a la même entrée EXTCLK pour deux PCA9685, ils fonctionneront à la même vitesse, sans glissement, mais ils ne seront pas synchronisés, car il est impossible de faire démarrer les 2 timers pile poil au même moment ...
ce décalage fait que si un engin se trouve à cheval sur 2 cantons, les 2 signaux pwm peuvent s'ajouter, et dans le pire des cas, 2 signaux à 50% peuvent donner du 100% (s'ils sont complètement déphasés)
je vais encore creuser un peu, mais jai peu d'espoir de trouver une solution avec PCA9685

autrement, je vois cette solution :
utiliser 4 arduinos ; le premier génère une impulsion de synchronisation qui fait chez les 3 suivants une raz des timers logiciels (softPwm)
« Modifié: novembre 22, 2020, 08:07:29 pm par trimarco232 »

hinano70

  • Newbie
  • *
  • Messages: 18
    • Voir le profil
Re : Problème pour utiliser l'horloge externe du PCA9685
« Réponse #7 le: novembre 25, 2020, 04:56:18 pm »
Merci pour les réponses.
Le problème n'est pas un problème de décalage, mais un problème de fréquences très légèrement différentes. J'imagine qu'il doit y avoir une sorte de battement lorsque les 2 signaux de fréquences différentes se superposent ce qui fait "brouter" les trains (arrêt-avance-arrêt-...).
trimarco232 m'a donné l'idée de faire un RAZ au moment du changement de canton, mais les battements ont une période inférieure à la durée du passage de l'un à l'autre donc j'ai peur de ne pas régler le problème. Ce qui risque de se passer avec 3 Arduino ayant chacun leur propre horloge.
Pour répondre à simontpellier,le codage des PWM doit bien être de 0 à 4095, vitesse étant un byte et je limite la vitesse à 200 :
if ((millis() - lastTime) > VitesseDelay)
                                                           {
                                                           if (vitesse < consigne) {vitesse += 1;} // phase d'accélération marche avant.
                                                           else if (vitesse > consigne) {vitesse -= 2;} // phase de décélération marche avant.
                                                           if (pin1<16) pwm3.setPWM(pin1, 0, 20*vitesse);    //pin1=pwm
                                                           else if (pin1<32) pwm4.setPWM(pin1-16, 0, 20*vitesse);
                                                                else if (pin1<48) pwm5.setPWM(pin1-32, 0, 20*vitesse);
                                                                     else  pwm6.setPWM(pin1-48, 0, 20*vitesse);
                                                           lastTime = millis();

simontpellier

  • Full Member
  • ***
  • Messages: 115
    • Voir le profil
Re : Problème pour utiliser l'horloge externe du PCA9685
« Réponse #8 le: novembre 27, 2020, 12:25:05 pm »
Citer
pwm3.setPWM(pin1, 0, 20*vitesse);

pardon d'insister... quand je vois ce 20*vitesse, et vu que je me suis fait piéger de la même façon avec des "broutages" bien mystérieux...
si pour une raison ou une autre (que je peux bien sûr pas deviner mais qui se planque dans le code) la variable "vitesse" dépasse 200, alors 20*vitesse dépasse 4096
=> jusqu'à 4096 ça roule (vite !)
=> au dessus , par débordement ça fait 20*vitesse - 4096 et ... ça s'arrête d'un coup

hinano70

  • Newbie
  • *
  • Messages: 18
    • Voir le profil
Re : Problème pour utiliser l'horloge externe du PCA9685
« Réponse #9 le: novembre 28, 2020, 06:05:50 pm »
Le "broutage" a lieu uniquement au changement de canton, lorsque l'alimentation du train se fait par l'intermédiaire de 2 sections alimentées par 2 PCA9685 différents. Aucun problème lorsque le train est à cheval sur 2 sections alimentées par le même PCA9685. J'ai 2 endroits où j'ai le problème, la cause est la même. Je vais essayé de changer la fréquence d'un des PCA9685 pour qu'il n'y ai plus de battements avec 2 fréquences trop proches.

hinano70

  • Newbie
  • *
  • Messages: 18
    • Voir le profil
Re : Problème pour utiliser l'horloge externe du PCA9685
« Réponse #10 le: novembre 28, 2020, 07:23:53 pm »
Je viens d'essayer avec des fréquences de 60 et 73 (60 et 80 donnent de moins bon résultats)
pwm5.begin();
pwm5.setPWMFreq(60);
pwm6.begin();
pwm6.setPWMFreq(73);
Il y a un ralentissement mais plus de broutement. C'est plus tolérable ! Il faut que je répartisse mes alimentations de sections dans les parties visibles pour limiter les changements de PCA9685, avec 36 sections, ça ne va être simple !

simontpellier

  • Full Member
  • ***
  • Messages: 115
    • Voir le profil
Re : Problème pour utiliser l'horloge externe du PCA9685
« Réponse #11 le: décembre 01, 2020, 07:36:09 pm »
Bonsoir,
merci pour ces retours, c'est instructif car ... ça peut servir un jour !

pour l'instant, faute d'expérience, j'avoue que je commence tout juste à "conceptualiser" le phénomène : je "vois" bien des créneaux de PWM qui se juxtaposent aux moment où une motrice se sert sur deux sections à la fois (ça je l'ai vu de mes propres jolis yeux), mais jusque là ça ne peut produire qu'une accélération momentanée... mais si le décalage temporel entre ces deux sources est EN PLUS non constant dans le temps, alors l'effet cumulatif est lui aussi variable et ça peut faire bizarre! Or n'est ce pas précisément ce qui doit se produire immanquablement si les deux fréquences en plus de ne pas être synchrones ne battent pas à la même cadence ?
Mais je raisonne "à blanc" ; en tous cas je ne vois toujours pas comment ça peut se traduire par un broutage ou un ralentissement.

Sauf...
que lorsqu'une motrice fait le pont sur deux sections, c'est aussi un pont électrique et il y a un retour d'une section sur l'autre et donc d'un PCAmachin sur l'autre... l'explication et la solution n'est elle pas à regarder par là ?
J'attends la suite avec grand intérêt

JPM06

  • Newbie
  • *
  • Messages: 49
    • Voir le profil
Re : Problème pour utiliser l'horloge externe du PCA9685
« Réponse #12 le: décembre 03, 2020, 12:09:23 pm »
Bonjour,

J'ai équipé plusieurs réseaux (analogiques) comme ça (avec un PWM par canton), mais sans PCA9685 ni Arduino, juste un PC (dont l'un est en cours de remplacement par un Arduino).
Effectivement, si on ne synchronise pas les signaux traction, le train accélère lors qu'il est à cheval sur deux cantons.
Personnellement je synchronise le signal sur le secteur (100Hz), parce qu'en plus de synchroniser les cantons entre eux, ça simplifie l'alimentation primaire, qui n'a plus besoin d'être régulée ni même filtrée.
Comme le PC/Arduino gère les accélérations et ralentissements progressifs, il faut aussi synchroniser les vitesses au moment du changement de canton (ça correspond le plus souvent au démarrage devant un signal qui vient de s'ouvrir).

Avec les PCA9685, et d'après ce que je comprends de la datasheet, même en utilisant la même horloge, les PWM risquent de ne pas être synchrones: ça dépendra de l'instant du chargement (parce qu'il y a un prescaler entre l'horloge et les registres de sortie). Mais bien sûr c'est à tester.

Par ailleurs, si on utilise des ponts en H en sortie, il y a un autre facteur à prendre en compte: ce que font les L298 pendant la phase de non-alimentation. Ils peuvent être soit en sortie ouverte, soit en sortie à zéro, c'est à dire en court-circuit, et le résultat n'est pas le même sur les trains, à moins d'avoir des diodes en sortie.

Cordialement.
« Modifié: décembre 03, 2020, 02:58:53 pm par JPM06 »

hinano70

  • Newbie
  • *
  • Messages: 18
    • Voir le profil
Re : Problème pour utiliser l'horloge externe du PCA9685
« Réponse #13 le: décembre 04, 2020, 03:20:28 pm »
Chez moi, c'est plutôt un ralentissement, peut être est-ce parce que la jonction est dans une zone de ralentissement où le temps d'alimentation est d'environ 1/3. Je vais tester un rapport 1/2.
Mes cantons sont toujours alimentés ainsi :pwm3.setPWM(pin1, 0, 20*vitesse); la vitesse variant de 1 à 200. A l'arrêt la vitesse est 1, l'alimentation est insuffisante pour faire avancer le train, mais suffisante pour charger un condensateur au travers d'une diode et qui se décharge dans les LEDS des lumières (loco + wagons).
Le gros avantage des PCA9685, c'est qu'on peut en mettre autant qu'on veut en parallèle. Je les utilise aussi pour alimenter les servomoteurs qui commandent les aiguillages, pour alimenter les feux de signalisation : il est très facile de faire varier la luminosité des LEDS en faisant varier le duty-cycle.

Je viens de tester un rapport de 1/2 du PWM, c'est beaucoup mieux. Cela me donne une possibilité supplémentaire pour juxtaposer les cantons alimentés par des PCA9685 différents. La discussion fait progresser les choses ! Merci aux contributeurs.
« Modifié: décembre 04, 2020, 03:42:23 pm par hinano70 »

CATPLUS

  • Sr. Member
  • ****
  • Messages: 407
    • Voir le profil
Re : Problème pour utiliser l'horloge externe du PCA9685
« Réponse #14 le: décembre 04, 2020, 06:28:37 pm »
Bonsoir INANO70
STP aurais-tu un fichier pour tester, je suis curieux
Marcel
Best Regards