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

hinano70

  • Newbie
  • *
  • Messages: 10
    • 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

  • Newbie
  • *
  • Messages: 47
    • 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: 10
    • 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: 10
    • 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: 10
    • 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

  • Newbie
  • *
  • Messages: 47
    • 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

  • Jr. Member
  • **
  • Messages: 52
    • 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: 10
    • 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

  • Newbie
  • *
  • Messages: 47
    • Voir le profil
Re : Problème pour utiliser l'horloge externe du PCA9685
« Réponse #8 le: Aujourd'hui à 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