PROGRAMMATEUR POUR LAVE LINGE
avec un ATmega32 - firmware en C
par Silicium628

dernière mise à jour de cette page: 1er mars 2011

Mise en garde préalable

Cette réalisation comprend deux parties:
  • une carte basse tension regroupant le microprocesseur et quelques composants.
  • une carte haute tension reliée au secteur 230V comprenant des triacs, mais aussi des circuits d'isolation galvanique entre le secteur et la partie basse tension, à savoir des optotriacs (MOC3043), des relais, ainsi qu'un transformateur d'alimentation. De ce fait cette carte doit être routée et réalisée avec le plus grand soin de façon à ce que la partie basse tension ne puisse en aucun cas entrer en contact avec le secteur 230V.
Pour cette raison je ne publierai pas les typons de réalisation des cartes mais seulement les schémas théoriques. A partir du même schéma, une implantation des composants ou une réalisation mal faite peut vous amener tout droit au cimetière! Si vous n'êtes pas habitué aux montages fonctionnant sur le secteur, je vous déconseille vivement de réaliser ce programmateur.
Je précise que je ne vends rien, je ne réalise rien pour les autres. Je me contente d'exposer ce que je fais pour moi, à titre d'exemple à ne PAS suivre, afin d'illustrer les extraordinaires possibilités des microcontrôleurs.
En revanche je fournis tous mes codes sources en Pascal, et/ou en C, commentés.

D'autre part les lave-linges sont en principe équipés d'une sécurité (mécanisme de blocage électrique de la porte) qu'il est hors de question de supprimer, même si je ne l'ai pas fait figurer sur mes schémas.

Principe

Le  microcontrôleur ATmega32 contrôle l'ensemble des organes.

1) En sortie:
  •  marche - arrêt, vitesse et sens de rotation du moteur (moteur "type universel" à balais et charbons)
  •  électrovannes d'admission d'eau
  •  pompe de vidange
  •  résistance de chauffage
  • Afficheur LCD 4lignes de 20 caractères (bleu).
  • Quelques LED de toutes les couleurs
2) En entrée:
  • capteur de niveau d'eau (celui d'origine, à contacts, je prévois de la remplacer par un capteur de pression)
  • dynamo tachymétrique sur l'axe du moteur (d'origine)
  • sonde de température résistive (d'origine)
  • signal de référence de phase du 50Hz secteur.
  • récepteur de télécommande IR
  • boutons poussoirs.
La vitesse de rotation du moteur est asservie par le microcontrôleur. Sa tension d'alimentation 230V est découpée par un triac commandé par l'ATmega. En effet, directement alimenté en 230V le moteur tourne à la vitesse d'essorage. Il faut donc le ralentir pour le lavage. Mais l'asservissement de vitesse est rendu nécessaire du fait que le couple varie ENORMEMENT lors de chaque tour du tambour du à la répartition et aux déplacements du linge dans ce tambour. D'où la présence de la dynamo tachymétrique sur l'axe du moteur. l'ATmega mesure en permanence la vitesse réelle du tambour (par une fonction fréquencemètre programmée) et la compare à une consigne. Le résultat sert à régler l'angle de conduction du triac afin de maintenir la vitesse constante (asservissement de vitesse). C'est un des points les plus délicats du programme.

Le sens de rotation du moteur est choisi par permutation du branchement  du stator par rapport au rotor, par deux relais.
La pompe et les électrovannes sont commandées par des triacs.
La résistance de chauffage est commandée par un relais 230V - 10A.

Le microcontrôleur et les circuits basse tension (5V) sont isolés du secteur 230V:
  • l'alimentation par un transformateur 230V - 2x6V
  • les triacs par des opto-triacs à détection de passage à zéro MOC3043.
  • le triac de découpage de la tension du moteur par un opto-triac SANS détection de passage à zéro MOC3023 (réponse instantanée)
 Le tout est géré à distance par une télécommande pour TV ! (ça évite de toucher à quoi que ce soit pendant le fonctionnement de la machine)




Vue d'ensemble

programmateur electronique lave linge ATmega32
  • La petite carte tout en haut: c'est le programmateur AVR USB.
  • A gauche la carte haute tension.
  • A droite la carte logique avec l'ATmega32 et l'afficheur LCD.
  • et  la zappète TV (modèle universel en mode "TV") qui permet de mettre la machine en marche de choisir les programmes de lavage et bien d'autres choses.
programmateur electronique pour lave lingeUne carte d'affichage à LED disposées en cercle donne un petit air rétro.

C'est bien pratique pour apprécier du premier coup d'œil où en est le cycle de lavage.
programmateur electronique lave linge en fontionL'ensemble des cartes reliées à la machine, le tout en fonctionnement.

Le schéma de la carte haute tension

schema de la carte 230V


Le schéma de la carte logique


Bientôt seront rajoutées 18 LEDS pilotées pas deux CD4017 indiquant les 12 étapes des programmes de lavage.

La carte haute tension

Pour la partie haute de la carte, de gauche à droite:

-tout en haut en jaune les borniers de raccordement des (nombreux) fils du lave linge.
-le triac BT137 -600 de commande de la vitesse du  moteur
- les deux relais de commande du sens de rotation
- emplacement vide qui reçoit le relais de chauffage
- les triacs pour la pompe et les électrovannes

Viennent au dessous les optotriacs d'isolation secteur (petits boîtier blancs)
Le transfo d'alim. pour le 5V et quelques composants basse tension



La carte logique

carte logique programmateur lave linge ATmega32
  • Au centre de la carte se trouve le gros circuit 40 pins de l'ATmega32 (signalons au passage que la version CMS est minuscule en comparaison)
  • Le petit boîtier noir à sa gauche est le récepteur infra-rouge pour recevoir les ordres de la télécommande.
  • L' afficheur se situe en dehors de la carte proprement dite, il comporte bien 4 lignes et non deux comme il semblerait sur cette photo (le microprocesseur n'était pas encore programmé).

Le programme est en Pascal. 


implantation carte à LEDL' implantation des composants de la carte à LED

Documents techniques




16 août 2010:
  • Je suis en train de réécrire le source en Pascal du firmware -> en langage C (avec KontrollerLab sous Linux Ubuntu, hé oui, Vive le Logiciel Libre!)
 24 août 2010:
  • Le firmware en C est disponible.
 1er mars 2011:

  • Une petite amélioration à la fois, et j'en suis à la version 4.07 du firmware en C. Le programmateur me donne toujours satisfaction, la machine a sans doute fait plus de cent lessives, et fonctionne toujours. Toutefois il faudra que j'ajoute une mémoire de l'état en cours de traitement en EEPROM, car dans sa version actuelle, en cas de (rare) coupure de courant, le up est reseté et se met en attente d'un nouveau cycle complet en ne se rappelant de rien. Il manque aussi un détecteur de balourd lors de l'essorage. (par mesure de l'angle de conduction nécessaire pour initier la rotation du tambour. Si tout le linge se met en boule dans un "coin", il faut appliquer un couple élevé pour effectuer le premier tour. )



Quelques points du programme expliqués

Le principe du découpage de la tension alternative du secteur consiste à déclencher la conduction d'un triac après un délai très précis débutant au début de chaque alternance.
Il faut donc connaître l'instant du début de l'alternance: cette information est obtenue par l'optocoupleur CNX34 suivi d'une mise en forme par un inverseur à hystérésis CD40106.
On applique ce signal sur l'entrée d'interruption externe INT0 de l' ATmega32 (pin16).

Cette interruption va faire partir le compteur du Timer2:



Ah ah ! déjà les choses se compliquent! Mais que fait donc cette interruption avec le registre TCCR2 ? Elle remet la sortie OC2 à zéro.  Qu'ès aquo la sortie OC2? J'explique:
Nous allons utiliser le compteur du Timer2 (8 bits) afin de créer le délai de conduction du triac. Ce timer est programmé en mode comparateur, il compare la valeur de son compteur interne (TCNT2) qui évolue avec le temps (l'horloge de l'ATmega) à la valeur que nous écrivons dans le registre OCR2. Lorsque la valeur du compteur TCNT2 atteint la valeur de OCR2, une "comparaison réussie" advient. Elle peut déclencher une interruption (interrupt Timer2COMP) dans laquelle on peut écrire un bout de code qui génère une impulsion vers le triac. C'est simple mais cela pose des problèmes  de "télescopage d'interruptions" dans un programme assez lourd (timings résultants peu précis).
Toutefois la documentation de l'ATmega fait apparaître une autre possibilité qui n'utilise pas d'interruption supplémentaire: lorsque la "comparaison  réussie" se produit le niveau logique de la sortie OC2 peut être changé sans que cela n'affecte le déroulement du programme. J'ai donc configuré cette sortie OC2 pour qu'elle passe à 1 logique lors de la comparaison ok. L'électronique pourra recueillir ce front montant pour générer l'impulsion. Reste à faire reseter OC2 un peu plus tard, par exemple lors de l'INT0. Simple pensais-je, il suffit d'écrire un '1' "dans" OC2.  Sauf que OC2 n'est pas le bit d'un registre, et que ce n'est pas accessible en écriture. (Le niveau logique sur OC2 et totalement distinct du portD7 qui dans cette configuration "n'existe plus"). Il a toutefois été prévu un mécanisme pour changer l'état logique d'OC2. Il faut configurer l'unité de comparaison du Timer2 afin que la sortie OC2 passe au niveau requis ('0' en ce qui nous concerne) puis provoquer une "comparaison virtuelle" en écrivant un '1' sur FOCE2 qui est le bit 7 du registre TCCR2. En réfléchissant à cette astuce en se plaçant dans l'état d'esprit d'un électronicien, on pourrait presque trouver ça logique!  Ensuite il faut bien sûr penser à reconfigurer l'unité de comparaison du Timer2 afin que la sortie OC2 passe au niveau '0' lors de la comparaison réelle afin de générer le signal lors de la période suivante. Les quelques lignes de codes vues plus haut doivent désormais vous paraître limpides. Sachez que pour le déduire de la documentation de l'ATmega en anglais j'y ai passé un mauvais quart d'heure!
Je viens d'écrire quelques lignes plus haut que les fronts montants que l'on génère de cette façon se produisent pour chaque PÉRIODE, un par période. C'est logique, l' INT0 se produit sur un front descendant du 40106, et il n'y a qu'un front descendant par période. Or il nous faut obtenir 2 tops de commande du triac par période ( un pour chaque alternance). On pourrait penser à configurer l'INT0 de façon à ce qu'elle se déclenche aussi bien sur les fronts montants que descendants (c'est possible avec les ATmega). Sauf que le signal issu de l'optocoupleur n'est pas forcément symétrique, d'ailleurs il N'EST pas symétrique. Ça conduirait donc à obtenir un angle de découpage différent pour chaque alternance avec une indétermination de pi (deux états possibles équiprobables). D'où l'intérêt de conserver un seul signal par période, pour une alternance toujours la même. Et pour l'autre alternance? un classique NE555 utilisé en monostable avec une tempo fixe de 10ms (pour 50Hz la période vaut 1/50Hz = 20ms) fait l'affaire. Ce NE555 associé à un CD40106 (voir schéma plus haut) génère ainsi les deux tops de déclenchements requis. L'ATmega se charge, lui, de les placer précisément dans le temps, en écrivant la valeur désirée du retard dans OCR2.

L'ATmega mesure en permanence la vitesse réelle du tambour (par une fonction périodemètre programmé, sur le tachymètre en bout d'arbre moteur) et la compare à une consigne. Le résultat sert à régler l'angle de conduction du triac afin de maintenir la vitesse constante. (asservissement logiciel)

La régulation de la température fait appel au convertisseur analogique/numérique de l'ATmega pour lire la valeur de la sonde (résistance CTN).

L'ATmega interprète également les signaux de la télécommande IR.

Je vous invite donc à étudier le source en Pascal, vous y trouverez  un assez large éventail des possibilités des ATmega et des "drivers" de l'outil de programmation des AVR en Pascal qu'est AVRco.
Le plus délicat  à été la gestion des nombreux timings et d'éviter d'emboiter les procédures comme des poupées russes afin de ne pas faire déborder la pile logicielle du uC dans certaines configurations.
Les procédures sont toujours appelées au niveau le plus bas possible, à des instants gérés par des flags.
Pour la petite histoire, dans une première version j'avais une boucle principale qui appelait le choix du programme qui appelait le remplissage qui appelait le lavage qui appelait la vidange qui appelait le rinçage qui... dois-je préciser que les interruptions temps réel saupoudrées sur tout ça finissaient immanquablement la lessive avant son terme ?

24 août 2010:
  • La version (en logiciel libre) en langage C du firmware étant disponible, je vous encourage à l'utiliser plutôt que celle en Pascal.



Liens internes:


Liens Externes:

Le logiciel libre Kontrollerlab:




Silicium628
Vive le Logiciel Libre!