|
PROGRAMMATEUR POUR LAVE
LINGE |
Cette
réalisation comprend deux parties:
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. |
| Le microcontrôleur
ATmega32 contrôle l'ensemble des organes. 1) En sortie:
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:
|
![]() |
|
![]() | Une 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. |
![]() | L'ensemble des cartes reliées à la machine, le tout en fonctionnement. |


![]() |
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 |
![]() |
Le programme est en Pascal. |
![]() | L' implantation des composants de la carte à LED |
|
16 août 2010:
|
| 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:
|
| Liens internes: Liens Externes: Le logiciel libre Kontrollerlab: |