Nouvelles:

20/08/2024 : Le bug des 18 au 20 août 2024 a été résolu. Toutes nos excuses pour la gêne occasionnée et merci à ceux qui nous ont apporté leur soutien moral.

Menu principal

ATtiny 85 (ou 45) - Une alimentation en PWM

Démarré par Ph Blondé, 18 Novembre 2024 à 15:07:14

« précédent - suivant »

0 Membres et 1 Invité sur ce sujet

Ph Blondé

Bonjour à tous,

Pour un petit circuit en HOe et parce que le décodeur en N m'a lâché, je suis repassé d'une version numérique à une alimentation « classique » en PWM (*). Vu le prix d'un décodeur en N (dans les 35€), j'ai préféré cette solution de moins de 10€.

Cette alimentation à montée et descente progressives peut tout aussi bien servir à d'autres échelles que le HOe.

Je vous présente cela sur un circuit qui est une simple boucle avec un point de détection (détecteur à effet Hall) et une zone d'arrêt. On peut imaginer une petite gare en voie unique qui reçoit régulièrement un autorail ou un petit marchandises/voyageurs avec une ou deux boites à tonnerre, un fourgon M et un ou deux couverts.

IMPLANTATION 2.jpg



(*)  Le principe du PWM (sans mots du dimanche) :

On prend une tension continue (ici en 12 V) et, à une fréquence donnée, on la « hache » en signaux de forme carrée dont la durée est plus ou moins longue.
Nos moteurs sont des moteurs à courant continu. Ils recevront ses signaux d'une valeur maxi en tension (12 V dans ce cas) et auront donc leur couple maxi mais ils « verront » une tension moyenne plus ou moins haute à leurs bornes et leur vitesse sera plus ou moins grande.
C'est ce qu'il se passe à la sortie traction des décodeurs...

PWM est l'acronyme de Pulse Width Modulation ou ... Modulation de Largeur d'Impulsion (MLI) en français.


Pour le fun :
 
En passant d'une durée de signal de 25% (A) à 100% (D) on voit que la hauteur des signaux est toujours à 12V et que la tension moyenne passe de 3 V (A) à 12 V (D).

PWM.jpg
Philippe Blondé
Un 59 dans le 22

Ph Blondé

La séquence sur ce circuit :

IMPLANTATION 2.jpg

- Le train est à l'arrêt sur la zone d'arrêt (ça c'est bien !)
- Le double inverseur marche/arrêt est activé ; sa LED rouge est éteinte. La LED verte « circulation » est allumée.
- Le train démarre et la vitesse monte progressivement vers celle réglée par le potentiomètre « Vitesse ».
  Pendant le roulement la vitesse est ajustable par ce même "Potentiometre_Vitesse".
- A la fin de son parcourt, le train passe au-dessus d'un détecteur à effet Hall.
- Après un retard de 2 s (réglable) le ralentissement commence puis le train s'arrête exactement à l'endroit prévu dans la zone d'arrêt.
- Le Potentiomètre « Temps de stationnement » fixe le temps d'arrêt entre 10 s et 180 s.
- La LED verte « circulation »  est éteinte et sa copine rouge « stationnement » (en dessous) est allumée.
- La séquence redémarre après ce temps d'arrêt.
HOe - ATtiny45 - PWM - 03.JPG

Philippe Blondé
Un 59 dans le 22

Ph Blondé

Avant de présenter le code, quelques compléments :

- La "Vitesse_Mini" est un paramètre à ajuster à la tension de démarrage du moteur dans DECLARATION DES VARIABLES.
  On pourrait faire démarrer la valeur du PWM à 0. Mais le moteur ne va pas démarrer tout de suite et il va « vibrer ». En prenant la valeur du PWM juste avant le début de rotation du moteur on évite d'entendre ce sifflement. Dans le cas du locotracteur HOe utilisé, il se trouve que cette valeur se situait vers 32 avant le début de rotation de son moteur.

- "Vitesse_Maxi" est à ajuster dans DECLARATION DES VARIABLES. C'est la valeur qui sera prise en compte dans le « map » du potentiomètre vitesse.

- Les taux d'inertie en accélération et en freinage sont à ajuster au type de matériel.
  "Inertie_Acceleration" et "Inertie_Freinage" sont à préciser dans DECLARATION DES VARIABLES. Elles jouent sur le temps des boucles de montée ou de descente lors des variations de la valeur du PWM.

- Le temps maxi d'arrêt peut être modifié dans "Temps_Maxi_Arret" dans DECLARATION DES VARIABLES. Comme pour la lecture du potentiomètre de vitesse, cette valeur sera prise en compte dans le « map » du potentiomètre « Potentiometre_Temps_Arret».

- La tension max d'alimentation du moteur est de 12 V. Sa consommation moyenne est de 200 mA (dans mon cas).
  L'ATtiny85 (ou 45) ne peut pas commander directement un moteur de loco. Une broche de sortie délivre un maximum de 40 mA sous 5 V.
  Et bien on se met une interface pour pouvoir alimenter le moteur du locotracteur jusqu'à 12 V avec une intensité suffisante.
  C'est le rôle du circuit ULN2803 (0,50€).Il a 8 circuits internes pouvant donner chacun jusqu'à 500 mA ; ils sont mis en parallèle et le « potentiel » est de 8 x 0,5 A soit 4 A. Je pense que cela devrait suffire :)) .

- Deux LEDs (rouge et verte) indiquent l'état de marche du train ou celui de son arrêt en coulisse.



Donc on doit construire un système avec montée et descente progressives et une logique d'automatisation pour que le train reste à l'arrêt un certain temps après chaque tour. On pourrait faire d'autres choix comme compter les tours et faire en sorte qu'il s'arrête à un nombre de tours donnés. Ce ne serait que quelques lignes de programmation supplémentaires, tout au plus .



Les schémas :

schema.jpg

HOe - ATtiny45 - PWM - 01.JPG HOe - ATtiny45 - PWM - 02.JPG

Détecteur à effet Hall que l'on peut remplacer par un ILS :

DETECTEUR HALL 3144.jpg
Philippe Blondé
Un 59 dans le 22

Ph Blondé

Le code :

// MAJ 2024-11-09 - Chargement à 16MHz
// Utilisation de PWM (ou MLI en français : Modulation de Largeur d'Impulsion).

// REPERAGE DES BROCHES D'UN ATtiny45 OU 85 :
// Broche 1 : Reset       Broche 8 : 5V
// Broche 2 : A3 ou 3     Broche 7 : A1 ou 2
// Broche 3 : A2 ou 4     Broche 6 : 1 (PWM)
// Broche 4 : GND         Broche 5 ; 0 (PWM)

// LE CIRCUIT EN HOe:
// Simple boucle dont la moitié est visible.
// En coulisse : un point de détection (détecteur à effet Hall) et une zone d'arrêt.
// Composition du train :
//  - Un locotracteur ROCO suivi d'un autre démotorisé (prise de courant supplémentaire).
//  - des wagonnets.

// DÉROULEMENT DE LA SEQUENCE :
// L'inverseur marche/arrêt (MA_AT) est activé.
// Le train démarre en coulisse et la vitesse passe de "Vitesse_Mini" à celle de "Potentiometre_Vitesse".
// Pendant le roulage la vitesse est ajustable par "Potentiometre_Vitesse".
// De retour dans la coulisse, il passe au dessus du détecteur à effet Hall.
// Début du ralentissement après un décompte de 2 s ; Le train n'est plus sur la zone de détection.
// Le "Potentiometre_Temps_Arret" fixe le temps d'arrêt de 10 s à "Temps_Maxi_Arret" (180 s).
// La séquence redémarre après ce temps d'arrêt.

// NOTES :

// 1 - "Vitesse_Mini" est à ajuster à la tension de démarrage du moteur dans DECLARATION DES VARIABLES.
//     "Vitesse_Maxi" est à ajuster dans DECLARATION DES VARIABLES.
// 2 - Les taux d'inertie en accélération et en freinage sont à ajuster au type de matériel.
//    "Inertie_Acceleration" et "Inertie_Freinage" sont à ajuster dans DECLARATION DES VARIABLES.
// 3 - Le temps maxi d'arrêt peut être modifié dans "Temps_Maxi_Arret" dans DECLARATION DES VARIABLES.
// 4 - La tension max d'alimentation du moteur est de 12 V. Sa consommation moyenne est de 200 mA.
//     Faute de puissance, l'ATtiny85 ne peut pas commander directement le moteur du locotracteur.
//     Une broche de sortie délivre un maximum de 40 mA sous 5 V.
//     Un ULN2803L, assure l'interface et peut délivrer jusqu'à 4 A sous 12 V.
// 5 - Deux LEDs (rouge et verte) indiquent l'état de marche du train ou celui de son arrêt en coulisse.

// ****************************************************************************************************

// DECLARATION DES VARIABLES

int const Detection_MA_AT = 4;  // Détection à effet Hall ou bascule de l'inverseur Marche-arrêt
int Etat_Detection_MA_AT;

int const Potentiometre_Vitesse = A3;
int Valeur_Vitesse;
int Vitesse;

int const Potentiometre_Temps_Arret = A1;
int Valeur_Temps_Arret;
int Temps_Arret;

int const PWM = 1;
int Valeur_PWM;

int const Led_Rouge_Vert = 0;

// Valeurs à ajuster suivant type de matériel :
int Inertie_Acceleration = 35;
int Inertie_Freinage = 50;
int Vitesse_Maxi = 130;
int Vitesse_Mini = 30;
int Temps_Maxi_Arret = 180; // En secondes


void setup()
{
pinMode (Detection_MA_AT, INPUT_PULLUP); // PULLUP : maintien à HIGH si pas de signal

pinMode (Potentiometre_Vitesse, INPUT);

pinMode (Potentiometre_Temps_Arret, INPUT);

pinMode (PWM, OUTPUT);
analogWrite (PWM, 0);

pinMode (Led_Rouge_Vert, OUTPUT);
}


void loop()

{
// TEST SUR LA POSITION DE L'INVERSEUR MARCHE/ARRET (MA_AT)
do
  {
    Etat_Detection_MA_AT = digitalRead (Detection_MA_AT);
    digitalWrite (Led_Rouge_Vert, LOW); // LOW = Rouge
  }
while (Etat_Detection_MA_AT == LOW);

// DÉPART - ACCÉLÉRATION
digitalWrite (Led_Rouge_Vert, HIGH); // HIGH = Vert
Valeur_PWM = (Vitesse_Mini);
do
  {
    Valeur_Vitesse = analogRead (Potentiometre_Vitesse);
    Vitesse = map (Valeur_Vitesse, 0, 1023, Vitesse_Mini, Vitesse_Maxi);
    analogWrite (PWM, Valeur_PWM);
    delay (Inertie_Acceleration); // En ms
    Valeur_PWM = (Valeur_PWM + 1);
  }
while (Valeur_PWM <= Vitesse);

// ROULAGE - ATTENTE DE DÉTECTION DE PASSAGE
do
  {
    Valeur_Vitesse = analogRead (Potentiometre_Vitesse);
    Vitesse = map (Valeur_Vitesse, 0, 1023, Vitesse_Mini, Vitesse_Maxi);
    analogWrite (PWM, Vitesse);
    Etat_Detection_MA_AT = digitalRead (Detection_MA_AT);
  }
while (Etat_Detection_MA_AT == HIGH);

// LA DÉTECTION N'EST PLUS EN "HIGH"
delay (2000); // Retard de 2 s pour passer la zone de détection

// RALENTISSEMENT
Valeur_PWM = Vitesse;
do
  {
    analogWrite (PWM, Valeur_PWM);
    delay (Inertie_Freinage); // En ms
    Valeur_PWM = (Valeur_PWM -1);
  }
while (Valeur_PWM >= 0);

// TEMPS D'ARRÊT
Valeur_Temps_Arret = analogRead (Potentiometre_Temps_Arret);
Temps_Arret = map (Valeur_Temps_Arret, 0, 1023, 5, Temps_Maxi_Arret);

do
  {
    digitalWrite (Led_Rouge_Vert, LOW); // LOW = Rouge
    delay (1000);
    Temps_Arret = (Temps_Arret - 1);
  }
while (Temps_Arret >= 0);
Valeur_PWM = 0;
}



Et une petite vidéo :
Philippe Blondé
Un 59 dans le 22

Attiny

Bonjour Philippe, de nouveau un beau projet!  :) 
L'utilisation d'un ULN2803 pour l'étage de puissance est une de mes habitudes...
Une bonne chose d'avoir prévu l'accélération et la décélération progressives.

A fréquence 8Mhz, la PWM sur l'ATtiny est à 490Hz, logiquement à 16MHz (programmation avec l'ATTinyCore de SpenceKonde?) elle devrait être de 980 Hz, dans les deux cas ce sont des fréquences audibles, ta machine ne "siffle" pas?

Ma dernière question: Je ne vois pas de fusible de protection sur ton schéma.

Ton projet me donne des idées et je t'en remercie. :D






Ph Blondé

Citation de: Attiny le 19 Novembre 2024 à 10:41:01Bonjour Philippe, de nouveau un beau projet!  :) 
L'utilisation d'un ULN2803 pour l'étage de puissance est une de mes habitudes...
Une bonne chose d'avoir prévu l'accélération et la décélération progressives.

A fréquence 8Mhz, la PWM sur l'ATtiny est à 490Hz, logiquement à 16MHz (programmation avec l'ATTinyCore de SpenceKonde?) elle devrait être de 980 Hz, dans les deux cas ce sont des fréquences audibles, ta machine ne "siffle" pas?

Ma dernière question: Je ne vois pas de fusible de protection sur ton schéma.

Ton projet me donne des idées et je t'en remercie. :D
Bonjour à toi,

Merci pour l'appréciation :)

Non, cela ne siffle pas à partir du moment où le moteur commence à tourner. Mais je suis un peu sourd (comme tous les hommes  :))  )
C'est ce que j'ai constaté. Constaté également qu'il n'y a pas vraiment de "règle" et que c'est fonction du moteur en place.
Par contre de 0 à 30 (PWM) on entends un peu. C'est pour cela que j'ai mis "Vitesse_mini" en déclaration des données et que j'ai cherché la valeur seuil de rotation du moteur.

Le module d'alimentation (12 V / 5 V) a sa propre protection. Pour le 12V qui arrive à l'ULN2803 c'est l'alimentation de 12 V (en amont de l'ensemble) qui a la protection.

Pour moi c'est une animation mais rien n'empêche de prévoir le train du père Noël sur cette base  :)  :)
Philippe Blondé
Un 59 dans le 22

Attiny

Merci pour tes réponses.

J'espère que certains reproduiront ton montage et que d'autres se lanceront dans l'utilisation de l'Arduino et de l'ATtiny pour animer leur réseau.

Bonne continuation à toi.