Auteur Sujet: BASIC_AUTO_LOOP_REVERSER  (Lu 12067 fois)

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1083
  • HO avec DCC++
    • Voir le profil
Re : Re : BASIC_AUTO_LOOP_REVERSER
« Réponse #15 le: février 06, 2024, 02:04:54 pm »
Bonjour

La progression du nouveau montage sans relais progresse!
Celui ci va permettre de gérer soit indépendamment  2 "FROG" (2 cœurs) de façon autonome,  soit de traiter une "boucle" - sélection via un jumper du mode de fonctionnent désiré)
Dans le mode "LOOP" une commande externe est prévue ainsi qu'une sortie de monitoring de situation (FEEDBACK)
La structuration du code, le choix optimal de I/O se fait en parallèle afin de concevoir une solution innovante et efficace.

Les temps de bascule sont TRES significativement réduits! ( de l'ordre de quelques us à présent loin des 3 à 8 ms nécessaires pour le relais!)

Aperçu du circuit en cours de réalisation.

Ltr

C'est intéressant. Hâte de voir le final.

Cette technique sans relais ne pourrait-elle pas s'adapter à ce que je souhaite faire pour isoler électriquement un canton en cas de court-circuit ? Je suis vraiment intéressé par la suite de ton développement.

Christophe

laurentr

  • Hero Member
  • *****
  • Messages: 648
    • Voir le profil
Re : BASIC_AUTO_LOOP_REVERSER
« Réponse #16 le: février 06, 2024, 05:20:37 pm »
Hello

Je viens de l'ajouter au montage initial:

Lecture de la conso globale confiée à l'ACS712.

Si dépassement du seuil, bascule en sécurité et donc les MOS sont alors tous OFF ce qui évite un relais supplémentaire et coupe la distribution.

J' ai mis un terme marketing dessus et défini cela comme "POWER GUARD".

Pour le réarmement plusieurs solutions:

Auto après un laps de temps ( en boucle jusque à un seuil de X itérations par exemple où il faut une action externe)
Reset par push bouton local
Reset par commande externe.

Tout est déjà à bord sur la carte. :)

Ltr

« Modifié: février 06, 2024, 05:39:49 pm par laurentr »

laurentr

  • Hero Member
  • *****
  • Messages: 648
    • Voir le profil
Re : BASIC_AUTO_LOOP_REVERSER
« Réponse #17 le: février 07, 2024, 04:45:56 pm »
Sur le code initial j apporte une première modification somme toute triviale quand on y pense!

En effet c est l'interruption qui va modifier les valeurs et elle uniquement donc on peut y glisser les valeurs de pilotage des I/O.

Je profite pour les initialiser dans le setup ce qui n avait pas été fait précédemment!

Voila le code revu en conséquence.

La LOOP est vide à présent est c est tout à fait normal!


#include <Arduino.h>

/*
  DCC AUTO LOOP REVERSER: BASIC V1.0
  Author: Laurent ROEKENS LTR
  Version 1.0.0
  Date rev: 31/01/2024: initial release
  Version 1.0.1
  Date rev: 07/02/2024: interruption manages port change directly.

  Specially design for MEGATINY x02 ( 202,402, 212, 412 CPU Parts)

  SWAP PIN NAMES OFR ANY AVRx CPU. ( ex AVR Serie0 (NANO_EVERY), AVR Dx, ...)

*/

//VARIABLES:

#if !defined(PIN_PA1)
  #define PIN_PA1 2
#endif

#if !defined(PIN_PA2)
  #define PIN_PA2 3
#endif

#if !defined(PIN_PA3)
  #define PIN_PA3 4
#endif

#define TOGGLE GPIOR0 //use global register GPRIOR0 to store value for faster speed reaction

#define CDE_RLY_SET_PIN     PIN_PA2
#define CDE_RLY_RESET_PIN   PIN_PA1

#define RST_PIN             PIN_PA3

void toggle_state();



#define RLY_COIL_SET_ON   PORTA.OUTSET = PIN2_bm //faster than PORTA.OUT |= PIN2_bm
#define RLY_COIL_SET_OFF  PORTA.OUTCLR = PIN2_bm //faster than PORTA.OUT  &= ~PIN2_bm

#define RLY_COIL_RESET_ON   PORTA.OUTSET = PIN1_bm //faster than PORTA.OUT |= PIN1_bm
#define RLY_COIL_RESET_OFF  PORTA.OUTCLR = PIN1_bm //faster than PORTA.OUT  &= ~PIN1_bm


void toggle_state()
{
 TOGGLE = !TOGGLE;

 switch(TOGGLE)
 {
  case false:

    RLY_COIL_RESET_OFF;
    RLY_COIL_SET_ON;

  break;

  case true:

    RLY_COIL_SET_OFF;
    RLY_COIL_RESET_ON;

  break;

 }
}

///////////////////////////////
//SETUP
///////////////////////////////
void setup()
{

  TOGGLE = false; //init state arbitrary

  pinMode(CDE_RLY_RESET_PIN, OUTPUT);
  pinMode(CDE_RLY_SET_PIN, OUTPUT);

  pinMode(RST_PIN, INPUT);

  //init STATE:

  TOGGLE = false; //init state arbitrary

  RLY_COIL_SET_ON;
  RLY_COIL_RESET_OFF;


  attachInterrupt(digitalPinToInterrupt(RST_PIN),toggle_state,FALLING); //ANY STATE DOWN DETECTED ON RST_PIN WILL SWAP STATE

}


////////////////////////////////
//LOOP
////////////////////////////////
void loop(){

}


laurentr

  • Hero Member
  • *****
  • Messages: 648
    • Voir le profil
Re : BASIC_AUTO_LOOP_REVERSER
« Réponse #18 le: février 08, 2024, 03:06:41 am »
Bonjour

Simplifiée mais tout aussi efficace ma plus récente version.

Esprit "pure LK200" si on peut dire.

Ltr