LOCODUINO

Parlons Arduino => Bibliothèques => Discussion démarrée par: Binch le avril 11, 2021, 02:36:23 pm

Titre: SyncArduino+PWMà32KHz
Posté par: Binch le avril 11, 2021, 02:36:23 pm
Bonjour à vous tous,

Je suis actuellement en train de tester un Arduino par canton sur une petite boucle de 4 cantons, comme le fais Jean-Luc mais en plus performant que moi.
L’arrêt de DrivingRailway m'a laissé un moment avec un problème de gestion du réseau. J'apprends par moment le C/C+ que depuis l'année dernière .
C'est grâce à la mine d'informations qu'il y a sur LocoDuino que j'ai pu démarrer.

Après avoir démarré une série de tests concluant j'arrive à la synchronisation des cantons, en effet comme en parle Jean-Luc quand la PWM n'est pas en phase le train accélère lorsqu'il est à cheval entre deux cantons.
J'ai fouillé de partout pour trouvé des bibliothèques ou comprendre la synchronisation des PWM entre canton. C'est un sujet très peu abordé.
Lors de mes essais j'ai utilisé deux bibliothèques SyncPWM (Provient du forum Arduino) et PWMFreq (abordé lors du cours sur les PWM)

Je me suis aperçu qu'elles sont incompatibles. En effet le ralenti et l’arrêt d'un train ne fonctionnent pas avec les deux bibliothèques, alors qu'avec soit l'une soit l’autre tout fonctionne bien. Actuellement j'ai conservé la synchronisation.

J'ai entrepris de comprendre le fonctionnement et les points communs des deux bibliothèques sans pour autant parvenir à résoudre le problème. Tout ce que j'ai pu comprendre c'est que des timers sont modifier ainsi que des interruptions. (Il y a aussi un cours sur Locoduino)

Je joins les deux bibliothèques ainsi que le code que j'utilise actuellement pour les cantons.

En espérant que vous puissiez m’aider
Cordialement
Titre: Re : SyncArduino+PWMà32KHz
Posté par: Jean-Luc le avril 11, 2021, 06:47:02 pm
Bonjour,

Effectivement les deux codes (SyncPWM et PWMFreq) ne sont pas compatibles.

Il faut utiliser SyncPWM seul et modifier le code pour avoir la fréquence désirée. Ça se passe ligne 56 de SyncPWM.cpp. Actuellement vous avez :

    TCCR2B = _BV(WGM22) | _BV(CS22);

ce qui divise l'horloge de l'Arduino par 64 (CS22 à 1, CS21 et CS20 à 0) pour donner l'horloge de la PWM. Ce qui produit une PWM à 976Hz. Pour obtenir une autre fréquence, il faut changer cette ligne.

Par ailleurs, SyncPWM programme le timer en Fast PWM. Si vous voulez 32kHz il faudra le programmer en phase correct PWM et changer la ligne 55 comme ceci :

    TCCR2A = _BV(COM2B1)  | _BV(WGM20);

Ensuite ligne 56, pour avoir 31,373 kHz il faut mettre 

    TCCR2B = _BV(WGM22) | _BV(CS20);

Bon tout ça sans vérifier que ça fonctionne :)
Titre: Re : SyncArduino+PWMà32KHz
Posté par: Binch le avril 11, 2021, 07:02:16 pm
Bonsoir,

Merci beaucoup de votre réponse rapide.
Je m'en vais essayer la modification que vous proposez.

Bonne soirée

[EDIT] Je viens d'essayer avec succès. Merci beaucoup de votre aide