Auteur Sujet: DCC : Détection par consommation avec des courants faibles  (Lu 9243 fois)

laurentr

  • Hero Member
  • *****
  • Messages: 580
    • Voir le profil
Re : Re : DCC : Détection par consommation avec des courants faibles
« Réponse #165 le: avril 02, 2024, 03:55:33 pm »


Pour les cantons c'est le zmct103 qui sort à travers une diode 1n4148 sur, en //, une résistance de 2.7MOhms, un condensateur de 470nF
et une zener de 3.3v.


Bonjour Etienne

Est ce que cette valeur RC (1200000 ohms * 0.000000470 Farads qui donne 1.2sec a été sélectionnée  pour ce seuil particulier compte tenu de la tension en entrée de R et de la capa (dispo) ou est ce libre de recomposition de valeurs pout obtenir cette même temporisation proche des 1.2sec ex 1.2uF et R 1 000 000

J essaye de voir ou sont les "optimums"...

(Ce qui m amènera à légèrement reprendre un design de bouclier pour tenir compte des révisions à ce sujet.)

Autre question si on se fie sur le rapport du COIL ayant le plus petit rapport 1:50 (pour 50 tours)
A t on bien si je ne me trompe pas un V max de V DCC/50 ? ( modulo le nombre de tour dans le coil (ici mini 1)( et donc ici max54V/50 =0.045V ?? puisqu'on a d autre part le ration 5A /50 = 0.1 A)

Ou alors il me manque une formule...?

Ltr



Ltr

Etienne66

  • Jr. Member
  • **
  • Messages: 97
    • Voir le profil
Re : DCC : Détection par consommation avec des courants faibles
« Réponse #166 le: avril 02, 2024, 04:29:07 pm »
En fait je suis à 2.7Mohms et 470nF
Le produit des deux te donne grosso modo le temps comme tu l'as compris.

La valeur de la résistance te donne la tension en sortie par rapport au courant produit par le coil.
On a le courant de départ (par exemple 1,5mA pour une roue résistive de 10kOhms et alimentation DCC à 15V)
Il est divisé par le nombre de spires du coil (1000 pour le zmct103c)
Et multiplié par le nombre de tours passés dans le trou du coil.
Le courant multiplié par la résistance te donne la tension en sortie, donc le seuil que tu dois tester.

Le temps de retour à la voie libre va dépendre du courant. Il faut plus de temps avec une loco qu'avec une seule roue.
Le temps minimum va dépendre de la proximité du seuil par rapport au courant d'une roue.
Le temps maximum va dépendre du seuil par rapport au voltage max.
Si on veut limiter l'écart entre les deux on peut utiliser une zener avec une tension plus faible, ou réduire le nombre de tours du coil,
ou augmenter la valeur de la résistance et diminuer celle du condensateur.
Je pense qu'il faut surtout avoir un temps assez grand pour une roue de manière à réduire les libérations intempestives par faux contacts.
A noter que la résistance ne joue pas sur le temps de charge du condensateur, seulement sur le temps de décharge.

laurentr

  • Hero Member
  • *****
  • Messages: 580
    • Voir le profil
Re : DCC : Détection par consommation avec des courants faibles
« Réponse #167 le: avril 02, 2024, 05:50:22 pm »
Merci Etienne

On voit bien que si on substitue les COILs (selon leur nombre de tours)  il faut alors ajuster les résistances et capa du montage... sinon on va être au delà des seuils.

Si je reprends le calcul évoqué précédemment et que je mets un COIL 50 tours j ai ceci

0.0015 A= 1.5mA
1.5mA / 50 Tours = 0.00003
NB de passages = 1
 27000000 r = 2.7Mo
0.00003 * 2 700 000 = 81 MORTEL!

Si on veut toujours être sous 5V alors R =< 150000r = 150Ko

car
 0.00003*150000 = 4.5V qui sont ici bien compatible avec la plage d entrée de notre Arduino/AVR qui accepte 5V sur ses entrées

On arriverait à des calculs analogues avec une entrée 3V3 et les valeurs devrait donc être adaptées
 pour R et
Cote capa pour mini 1sec avec 150Ko on pourra partir sur 10uF

car 150 000 x 0.000 010 = 1.5.

(on fait ici abstraction des 2/3 de temps ou des 5emes requis pour la charge complète et la décharge complète en gardant l idée d une linéarité plus simple à comprendre)

Etienne, tu me confirmes bien que le schéma suivant est le bon ?( avec les valeurs indiquées pour un COIL 1000 tours et pas celle pour un COIL 50 tours qui doivent alors avoir pour R 150Ko et C 10uF!)


Laurent





laurentr

  • Hero Member
  • *****
  • Messages: 580
    • Voir le profil
Re : DCC : Détection par consommation avec des courants faibles
« Réponse #168 le: avril 03, 2024, 02:13:13 pm »
Bonjour

Petit update sur les calculs des valeurs que j ai reprise dans le tableau suivant en appliquant les formules données.

Tout à droite on voit les hypothèses appliquées au montage d'ETIENNE66 avec les valeurs de R 2.7Mo C 470nF C = 1000 TUNRS et 1 en roulement autours.

Si on fait varier la tension VDCC  on peut dépasser
Idem si on a plus de 1 essieux de 10K en shunt on diminue la résistance d entrée ( mise en parallèle de résistances) ce qui influe aussi sur les valeurs du montage

On voit de fait que la ZENER ne vas pas être superflue pour écrêter tout ce qui dépasse. (elle va même avoir du boulot!)

Si je ne me trompe pas la puissance que doit absorber la zener va être du (delta entre Vin et Vzener) * I en sortie de R.

A priori pas un monstre à prévoir mais pas trop petit non plus.

En rouge les lignes ou les seuils V ou steps sont dépassés. SI la zener écrête on reste sur Vzener en VMax in cote CPU IN et donc au max des pas du convertisseur ADC ( 1023 si 10 bits, 4095 si 12bits,...)

Ou alors j ai mal fait mes calculs...?

De ce que j en déduit il faut:

ajuster les composants selon le nombre de tours du COIL
Déterminer le VDCC ( la norme pouvant aller jusqu à 24V....) nous serons peut être plus raisonnables en nous bornant à l intervalle [16V;18V]
Dimensionner les valeurs selon les seuils attendus et paramètres ayant court.

En montage SMD et fabrication industrialisée il est indispensable de connaitre les valeurs des composants. En revanche en montage traversant, chacun pourra avec ses inputs ajuster les valeurs à monter.

En SMD il serait toutefois possible de combiner avec des sélecteurs mais dans le volume imparti on passerait sur du double couche ( c est bcp plus cher à produire) et il n en est pas moins de devoir retenir quels valeurs imputer aux composants...

Donc reste confirmer ces hypothèses de calculs...

Ltr

 
« Modifié: avril 03, 2024, 05:10:52 pm par laurentr »

laurentr

  • Hero Member
  • *****
  • Messages: 580
    • Voir le profil
Re : DCC : Détection par consommation avec des courants faibles
« Réponse #169 le: avril 06, 2024, 12:51:31 pm »
Bonjour

Petit interlude pour connaitre le mapping de sensibilité(s) que vous arrivez à déceler depuis le primaire? ( et du range de valeurs en sorties).

Quid en fait du seul correspondant en "bruit" et donc d une valeur en deca la mesure de détection est à "nettoyer"?

Ltr

Etienne66

  • Jr. Member
  • **
  • Messages: 97
    • Voir le profil
Re : DCC : Détection par consommation avec des courants faibles
« Réponse #170 le: avril 06, 2024, 09:39:25 pm »
C'est plus compliqué à calculer car on est sur un signal carré en entrée, il y a le condensateur à charger,
et la diode nous fait aussi perdre un peu.
Et surtout, il y a la linéarité du coil. Le 0.2% de linéarité dans la datasheet du zmct103c est mesuré entre 250mA et 6A et on est loin en dessous à 1.5mA pour une roue.
Du coup on est bien en dessous de la valeur calculée.

Mais bon, l'important est qu'on a des valeurs utilisables et fiables.

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 914
  • HO avec DCC++
    • Voir le profil
Re : DCC : Détection par consommation avec des courants faibles
« Réponse #171 le: avril 06, 2024, 10:47:26 pm »
De mon côté, avec le montage que j'ai présenté précédemment, je ne rencontre aucune difficulté. Les lectures sont très stables et fiables. Au travers du switch, on a 4 choix possibles pour la détection de présence et 4 autres choix pour les seuils de courts-circuits. J'ai pu régler finement les détections sur mon réseau.

C'est un ATtyni44 qui assure la lecture analogique. Le code utilise la lecture et l'écriture directe des ports ce qui accélère grandement la vitesse d'exécution.

Par acquis de conscience, je réalise 4 lectures dont je fais la moyenne pour obtenir les consommations de courant.

En cas de court-circuit, le relais coupe très rapidement l'alimentation DCC sur les rails. Avant même que la centrale elle même ne coupe l'alimentation générale ce qui est bien sûr le but recherché. En même temps, un signal digital est envoyé sur la sortie CC.

/*

  Détection de présence et courts-circuits pour ATtiny44 (84)

  © Christophe BOBILLE 04/24 pour locoduino (www.locoduino.org)
  v 0.4

  Datasheet :
  https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7701_Automotive-Microcontrollers-ATtiny24-44-84_Datasheet.pdf

  Getting Started with ADC on ATTiny
  https://ww1.microchip.com/downloads/en/Appnotes/TB3209-Getting-Started-with-ADC-90003209A.pdf

  PA0 - PA1 / RX - TX

*/

#include <avr/io.h>


// Variables
uint32_t tempoCC = 5000UL;                             // Tempo réarmement suite à court-circuit
const uint16_t tabSeuilOcc[] = { 30, 40, 50, 60 };     // Seuil pour l'occupation
const uint16_t tabSeuilCc[] = { 250, 350, 450, 550 };  // Seuil pour le court-circuit
uint16_t seuilOcc;
uint16_t seuilCc;

// Etats
byte etatSwitchOcc;  // Etat des bits pour switch occupation
byte etatSwitchCc;   // Etat des bits pour switch court-circuit


uint16_t get_ADC_sample(void) {
  ADCSRA |= (1 << ADSC);  // start ADC measurement
  while (ADCSRA & (1 << ADSC))
    ;
  // return the ADC value
  return (ADCL | (ADCH << 8));
}



void setup() {

  DDRA |= (1 << PA2);   // Signal occupation
  DDRA &= ~(1 << PA4);  // Switch 0
  DDRA &= ~(1 << PA5);  // Switch 1
  DDRA &= ~(1 << PA6);  // Switch 2
  DDRA &= ~(1 << PA7);  // Switch 3
  DDRB |= (1 << PB1);   // Signal cc
  DDRB |= (1 << PB2);   // Relais

  etatSwitchOcc = (PINA & 0x30) >> 4;
  etatSwitchCc = (PINA & 0xC0) >> 6;

  seuilOcc = tabSeuilOcc[etatSwitchOcc];
  seuilCc = tabSeuilCc[etatSwitchCc];


  ADMUX =
    (0 << ADLAR) |  // do not left shift result (for 10-bit values)
    (0 << REFS1) |  // Sets ref. voltage to internal 1.1V
    (0 << REFS0) |  // Sets ref. voltage to internal 1.1V
    (0 << MUX3) |   // use ADC3 for input (PB4), MUX bit 3
    (0 << MUX2) |   // use ADC3 for input (PB4), MUX bit 2
    (1 << MUX1) |   // use ADC3 for input (PB4), MUX bit 1
    (1 << MUX0);    // use ADC3 for input (PB4), MUX bit 0

  ADCSRA =
    (1 << ADEN) |   // Enable ADC
    (1 << ADPS2) |  // set prescaler to 64, bit 1
    (1 << ADPS1) |  // set prescaler to 64, bit 1
    (1 << ADPS0);   // set prescaler to 64, bit 0


  PORTB |= (1 << PB2);   // Relais
  PORTA &= ~(1 << PA2);  // Signal occupation
  PORTB &= ~(1 << PB1);  // Signal cc
}


void loop() {

  uint16_t sample = 0;
  for (byte i = 0; i < 4; i++)  // 4 lectures pour lisser le résultat
    sample += get_ADC_sample();
  sample = sample >> 2;


  if (sample < seuilOcc) {
    PORTA &= ~(1 << PA2);  // Signal occupation
  }

  if (sample >= seuilOcc) {
    PORTA |= (1 << PA2);  // Signal occupation
  }

  if (sample >= seuilCc) {
    PORTB &= ~(1 << PB2);  // Relais
    PORTB |= (1 << PB1);   // Signal cc
    delay(tempoCC);
    PORTB |= (1 << PB2);   // Relais
    PORTB &= ~(1 << PB1);  // Signal cc
  }
  delay(1);
}
« Modifié: avril 07, 2024, 07:31:03 am par bobyAndCo »

laurentr

  • Hero Member
  • *****
  • Messages: 580
    • Voir le profil
Re : DCC : Détection par consommation avec des courants faibles
« Réponse #172 le: avril 08, 2024, 04:53:51 pm »
Bonjour

En effet se passer de "AnaloguRead() comme nous en avons discuté va éviter des temps de traitement relativement "longs" qui plus est sur les AVR "historiques"

Sur les AVR plus récents ( AVR Dx et MEGATINY) il y a 2 éléments à considérer:
1 l analoguRead est beaucoup plus rapide que sur les anciens AVR.

Les mesures faites par Spence KONDE en témoignent:
https://github.com/SpenceKonde/DxCore/blob/master/megaavr/extras/Ref_Analog.md voir la section mTC/DxC) bool analogSampleDuration(duration)

En grosso ici lecture unique sur 12us ( comme sur les anciens AVR) et temps de traitement (10us) amènent à 22us ( 4 fois plus rapide que sur AVR anciens)

2/ Ces nouveaux AVR on vu 3 versions successives d'ADC et ne se commandent pas de la même façon (ce que masque cependant le analoguRead() classique)

Et pour utiliser directement les registres il faudra selon le CPU retenu tout se "palucher" à la main...

J'ai déjà écrit une partie mais elle n'est pas déclinable à toutes les broches ( il faudrait la retravailler) mais comme l analoguRead est (à priori) "assez rapide" c'est peut être  pousser un peu loin sans réel besoin... A voir par quelques tests.

A noter que sur les nouveaux AVR l'échantillonnage étant réglable (par configuration) peut sortir directement une valeur dont il restera à diviser par le nombre d'échantillons demandés. (le fameux >>4 utilisé par Christophe dans le code ci dessus pour la moyenne de 4 lectures successives)

Lorsque j aurai reçu le matos nécessaire je ferai quelques tests et vous communiquerai les résultats.

Ltr