CAPTEUR 3 fils pour Compteur d'eau ITRON

ITRON1_0

1    Présentation du montage
1.1    L'absence ULPWU sur PIC 12F675
2    Programme et Schéma
2.1    Opérabilité
2.2    Programme
2.3    Le programme "ULPWU" du 12F675
2.4    Schémas
2.5    Programmation du PIC12F675
3    Les réglages
4    Conclusions

Si vous arrivez directement sur cette page par un moteur de recherche, vous pouvez avoir accès à la table des matières et à chaque article, en page d'accueil.    L'accès se fait par l'un des deux liens en tête de colonne de droite ----->
Les questions correctes en fin d'un article recevront toujours une réponse, mais pas les questions par "CONTACTER L'AUTEUR" qui n'auront pas de REPONSE (car je suis obligé de répondre par mail).
A voir aussi  en colonne de droite (lien direct) ------> les articles "BONJOUR" ainsi que "INFOS rapides"... Il est déconseillé d'indiquer dans les commentaires ses coordonnées (mail, adresse ou téléphone).
Ce blog est modéré et vous pouvez demander simplement en tête de question à ce que vos informations restent confidentielles si nécessaire. Rien ne sera publié, mais ma réponse sera faite sur l'article correspondant (et non par mail).

 


 
Avant propos


ITRON, ACTARIS et SCHLUMBERGER sont des marques de compteurs d'eau déposées et j'utiliserai ITRON de préférence qui est plus court, et pour l'ensemble de ces marques.

"Cyble" représente le petit secteur brillant comptant les litres sur les compteurs de ces marques, c'est aussi un nom déposé.

Les lecteurs des ces sujets reconnaîtront bien entendu la très forte similitude du schéma avec la tête radio pour compteurs ITRON, et c'est bien le cas, mais il y a tout de même des nouveautés !

Pourquoi encore un article qui fera un peu redondance puisque la tête radio déjà décrite pouvait réaliser la même chose avec la sortie Top_Index déjà prévue.

C'est dans le but bien précis d'avoir un CAPTEUR 3 fils que ce nouveau montage a été réalisé, dont la fonction est seulement de transmettre, non pas un index, mais un TOP COMPTEUR pour chaque litre.
Beaucoup d'entre vous ont des systèmes spécifiques et n'ont rien à faire de la radio.
De plus ce système est encore plus économique avec encore moins de composants, et a une autonomie supérieure. Il peut de plus être alimenté par piles si nécessaire.
Il a aussi un rapport cyclique du signal de sortie meilleur, représentant plus exactement la rotation de la Cyble.

Pour moi aussi je m'étais résolu à ce dernier développement, dans l'optique de ma régulation solaire actuelle en pensant cette fois à une régulation du circuit primaire. Ce point avait été écarté car je n'avais pas encore développé ces dispositifs à courants de Foucault à l'époque.

Pourtant ce montage une fois réalisé ne me permettra pas de l'utiliser pour ma régulation solaire, car les débits sont beaucoup trop faibles pour que l'on puisse véritablement réguler en un temps suffisamment court relativement à l'inertie du circuit primaire.

Alors dans cette optique, on se tournera vers un prochain article qui avec les mêmes compteurs (à modifier) permettra une meilleure précision que le litre, en un temps de l'ordre de la seconde à vérifier, et d'en faire un débitmètre...
Pour l'instant on se bornera à mesurer un débit sans réguler.

Ce capteur plus simple pouvant être connecté à un datalogger ou autre automatisme permet de faire des mesures ou des études statistiques de consommation, et cette utilisation m'intéresse beaucoup pour débusquer des anomalies d'installation.

(L'autre article à venir, décrira le principe de tous les compteurs dit "sec" associé à une application pour faire une régulation. Il s'agira de l'entraînement magnétique de tous les totalisateurs, qui permet de faire des mesures plus précises, mais qui a le gros désavantage de nécessiter de modifier le compteur initial, et n'est donc pas applicable sur les compteurs réseau AEP (Attention c'est interdit !).

Vu que cela a été largement développé dans les autres articles, je vais aller très vite dans la description puisque le cœur du montage est constitué de la self et du principe associé qui donne toute satisfaction.

(Le montage radio qui était en tests a maintenant environ 2 mois d'utilisation réelle sans aucune erreur de volume. Je considère donc le principe comme tout à fait opérationnel et fiable).

Comme j'ai souvent la tentation de faire mieux, j'ai tout de même ajouté quelque chose de très utile pour ceux qui sont intéressés par un report d'index (Affichage extérieur des mètres cubes pour la facturation par exemple), j'ai inclus dans ce programme la possibilité de faire des tops d'index à chaque M3. Il sera également possible de faire n'importe quel facteur de division comme 10 Litres 100 L ou même 1234 L !

Ce mode est paramétrable dans l' EEPROM du PIC ce qui permet de ne pas toucher au programme. Cette possibilité avec les M3 permet de compter jusqu'à 65535 M3 bien entendu.
Pour l'affichage il faudra utiliser un petit compteur CMOS ou peut-être même un compteur de vélo (voir l'article) que l'on peut trouver pour pas cher.

Il y a également d'autres petites facilités et notamment le contrôle ou non des fuites.

La consommation est ridicule et même si le montage 3 fils est prévu en alimentation externe il fonctionne également avec 3 piles pour de nombreuses années. (Deux piles peuvent suffire avec cependant une autonomie plus faible).

L'autre possibilité concerne cette fois les faibles débits et fera l'objet de l'article suivant.

1 Présentation du montage

Ce dispositif est prévu cette fois avec un très petit PIC (8 pins) très bon marché, le 12F675 que vous avez déjà vu dans certaines de mes réalisations.

Le montage est un capteur 3 fils rassemblés sur le connecteur J2 comprenant la masse, la tension externe d'alimentation de 3 à 10V (jusqu'à 14V éventuellement), et la sortie des Tops Index sur un Open Drain.
La valeur de l'index est à écrire en EEPROM (éventuellement, car ne sert qu'en cas de relecture de l'EEPROM pour vérification) au moment de l'installation dans le SYSTÈME HÔTE recevant les tops, puisque c'est ce système qui assurera cette gestion (et non plus le capteur).
Il est possible d'alimenter sur piles (3 piles R6 ou LR03 de 1.5V) ce montage dont l'autonomie sera encore plus importante que les montages radio.
(Vous pourrez aussi mettre une pile lithium de 3.7V un peu fatiguée sans aucun problème).

Une correction par rapport au montage radio est l'adjonction d'un vrai mini connecteur pour ICSP, car c'est réellement nécessaire pour éviter tous les branchements hasardeux (J'ai pour l'instant échappé à la "cata", mais je vérifie X fois !) Un "nez de carte" ne coûte rien et c'est bien pratique !

Pour refaire un petit point sur les impulsions, rappelez vous que la self n'est pas la seule cause d'un manque d'oscillations amorties, car le condensateur C1 a aussi une part importante et quasi identique à celle de la self pour ce fonctionnement très particulier.
Il a aussi un facteur de qualité Q, d'égale importance à celui de la self.
Un condensateur à cette fréquence inchangée de 100KHz est aussi une "bête à coefficient de qualité"…!

La partie oscillations est inchangée, et quelques emplacements vides sur le CI avaient été prévus "au cas où", mais au final leur place a été récupérée pour une autre utilisation. Ils n'apparaissent pas sur le schéma.

Dans le principe, c'est toujours l'entrée T0CKI qui compte les crêtes des oscillations dans le TIMER 0. Le fonctionnement est en hystérésis avec des valeurs cadrées en température.

En ce qui concerne le temps, il n'y a pas d'ULPWU en natif sur ce PIC (Ultra Low Power Weak Up), mais pour ne pas consommer de trop on se contentera d'un principe proche mais sans l'ULPWU "officielle", en procédant de la même manière, certes ce sera moins précis et plus aléatoire en précision qu'une décharge contrôlée.
R4 et C4 définissent la période totale, du réveil jusqu'à la fin des calculs et la mise en SLEEP.

Une information cependant sur le circuit RC de l'ULPWU qui fera l'objet d'un paragraphe complet, car après une semaine de recherches, j'ai enfin trouvé la raison d'une absence de Wake_up …

Mais au diable la précision, car on n'en a absolument pas besoin à ce niveau.
Pour résumé le principe général, Le PIC sera actif durant 500µs pour compter les oscillations dans le TIMER 0 par T0CKI. Ce temps de 500µs sera obtenu par le TIMER 1 puisque le PIC sera obligatoirement actif à cet instant.
Ce choix  est motivé par la fréquence élevée qui ne permettrait pratiquement aucun gain de temps de fonctionnement du CPU.

L'écart de temps entre périodes de 500µs sera donné par GP1 avec un "pseudo ULPWU" qui générera le réveil du PIC toutes les 100ms. Ce temps devra être plus petit ou égal à 100ms pour ne pas perdre de tops en fonction des débits.
Ce temps de 100ms sera affecté par la température, mais cela reste peu dramatique car ça va dans le sens d'une plus grande vitesse de rotation compteur….

Une petite explication sur T2, l'open drain de sortie… La résistance R9 est seulement là en cas de court-circuit pour limiter le courant du MOSFET.
Une LED de TOPs sera alimentée par le dispositif externe, et son choix de couleur et de courant dépendra de la source externe que vous utilisez. (Le rouge est souvent nécessaire par sa faible tension)
Cette source externe sera impérativement utilisée pour la LED D1, pour réserver une large autonomie au montage lorsqu'il est alimenté sur piles.

Dans le cas d'une alimentation type capteur 3 fils, le strap SD3 devra être mis pour alimenter le capteur entre 2.7V et 10V.

Les autres straps SD1,SD2, SD4 devront être mis après avoir programmé par ICSP le PIC. Ces straps peuvent être constitués d'une simple goutte de soudure, ou d'un petit bout de fil plié à l'équerre, ce qui permet de le retirer facilement lors de la mise au point, mais pour ceux qui le réaliseront cela n'a que peu d'importance puisqu'en principe ils n'auront à faire les liaisons qu'une seule fois.
(Le petit bout de fil est réellement très pratique car après plusieurs dizaines d'aller retour en programmation, le circuit n'a pas encore été décollé ! et pourtant le circuit n'est pas des plus réussis)

Il n'y a pas assez d'I/O pour pouvoir afficher un problème de tension des piles (ou autre), Aussi la LED D1 sera allumée en permanence lors d'une tension trop faible des piles. En effet il faut signaler ce problème, sinon cela ne servirait à rien de mesurer cette tension des piles pour ne rien en faire. Cela affaiblira volontairement plus rapidement encore la tension.

Une LED D2 haut rendement a été ajoutée mais pourra être éventuellement supprimée surtout si vous fonctionnez sur piles. Son utilité permet en premier lieu de s'assurer que le programme tourne normalement. Une impulsion de 500µs toutes les 100ms, faiblement visible et avec un courant de 100µA n'impacte pas outre mesure l'autonomie.
De plus cela permet la fixation du potentiel sur la gate du MOSFET T1, et évite une commande parasite lors de la mise sous tension. Mais une fois que tout fonctionnera rien n'empêche de couper cette liaison et même de remplacer la LED par une résistance de quelques Mégohms pour continuer de fixer le potentiel.

La tension des piles (ou de l'alimentation) sera mesurée seulement toutes les 8 heures environ par mesure d'économie d'énergie. Le condensateur C7 mémorise la tension des piles, car le pont diviseur a des valeurs beaucoup trop importantes pour pouvoir utiliser les entrées analogiques du PIC sans cet artifice.
La tension maxi du pont est de 10.24V ce qui donnera 2.5V en entrée du convertisseur A/D (rapport ¼)

Une particularité à ce niveau, au vu de la constante de temps très importante est, que lors d'une mise sous tension initiale, il faut attendre avant de faire une mesure significative.
Dans cet esprit, le compteur des heures est positionné à 23 heures 55 minutes, ce qui permettra une mesure seulement 5 minutes plus tard ce qui laisse largement le temps au condensateur C7 de se charger et surtout de terminer la programmation du PIC (On verra pourquoi !)

Autre particularité découlant de l'absence de radio, les variations de courant dans le montage seront moins élevées que sur le montage radio mais garderont une "petite" dynamique de quelques nano Ampères jusqu'à 400 µA représentant respectivement le sommeil du processeur puis son activité.
 
Pour avoir exactement 1024 pas pour 10.24 Volts on ajustera la résistance R7B (Au besoin). Dans le cas de tensions supérieures à 10V, voire 14 Volts ou plus, une alimentation sur piles et un pont R6/R7 adapté seront nécessaires. Je me suis limité à 10.24V pour une meilleure précision.
Ceci sera souvent le cas avec les automates alimentés en 24V. Dans ce cas l'alimentation par piles est impérative, car la régulation par le MCP1702 ne peut pas dépasser 13.2V de tension d'entrée.

1.1 L'absence ULPWU sur PIC 12F675

Bien entendu ce très petit PIC 12F675 n'a pas cette fonctionnalité très intéressante pour limiter la consommation. (ULPWU=Ultra Low Power Weak Up)
Le principe reste cependant très simple dans l'esprit à reproduire sans la décharge à courant constant, mais….

Mais il y a des problèmes insoupçonnés qui relèvent de la structure interne du PIC considéré. Celui-ci, par de nombreux "topiques" est cité sur le Net comme ayant des difficultés avec le SLEEP et le Wake_up. Tout cela sans parler des problèmes de dérive en température et de non linéarité.

J'avais déjà eu de tels problèmes avec d'autres montages mais j'avais attribué cela à ma relative inexpérience, mais là ce n'est plus le cas, car c'est un problème clairement identifié, et bien que l'on puisse critiquer le fait de tirer du courant interne au PIC pour décharger le condensateur, le franchissement du seuil bas ne devrait pas produire d'anomalies au niveau INT.

(C'est le même phénomène qu'une entrée en l'air qui peut consommer du courant)

Le PIC reçoit bien une interrupt lorsque le seuil logique est franchi, mais le réveil semble seulement partiel et surtout assez incompréhensible, car certaines instructions sont réalisées et d'autres pas.

(Pour le weak-up, je n'utilise pas directement les interruptions en adresse 4 mais les IOC, et seulement la continuation du programme en séquence, avec le bit GIE à zéro.

J'ai pu mettre en évidence mon problème par un contact du doigt sur la borne 6 du PIC qui induit des parasites à 50 Hz. Le réveil du PIC était alors effectif au rythme des inductions du 50Hz. La conclusion était alors facile à faire. Il fallait absolument fixer le potentiel haut du condensateur, et par de là l'entrée du PIC en permettant de ne pas compter seulement sur les fuites internes de l'entrée PIC...
Tout est rentré alors dans l'ordre, avec une résistance de 3.3M et un wake_up tout à fait normal (sur IOC et GIE=0)

Je n'avais pas mis de résistance, simplement pour éviter de grossir exagérément le condensateur, car toute résistance en // accélère la décharge et diminue la constante de temps, ce qui était contraire à mes intentions, car il faut un scan environ toutes les 100ms, ce qui représente déjà un temps de durée "moyenne".

Ce temps est à régler approximativement à 100ms par des condensateurs en // sur C4, ou en jouant sur ces deux valeurs. Vous pouvez au niveau du circuit procéder par la mise en étage des valeurs nécessaires en faisant un "building" de condensateurs (de 2 étages seulement).
Ce réglage est nécessaire car les fuites internes du PIC sont très variables suivant les échantillons et il n'est pas possible de prévoir la bonne valeur.
Il est tout de même préférable pour des questions de performances de rester en dessous de 100 ms. C'est ce délai qui limite les performances en termes de vitesse maxi de rotation. Ce délai joue également directement sur l'autonomie d'énergie du montage lorsqu'il est alimenté sur piles.

2 Programme et Schéma

2.1 Opérabilité

Comme tous les montages que j'ai réalisés sur ce sujet des compteurs, il est impératif qu'il y ait un clapet anti-retour, faute de quoi les valeurs pourraient être faussées par des éventuels retours d'eau qui seraient comptés en positif !

Lors de la rotation de la Cyble, la présence de celle-ci fera un zéro en sortie, mais allumera la LED D1 si elle est connectée. Réciproquement si la Cyble n'est pas sous la self, ce sera un UN en sortie avec la LED D1 éteinte.
(Ceci est fait pour gagner un peu d'énergie car la proportion Cyble présente /Cyble absente sous la self est au minimum de 1/3 et vraisemblablement plus proche de 1/5 à cause des dimensions de la self. (Voir l'autre article).

En fonctionnement "Normal", la Cyble génère les tops d'index au rythme des Litres. Si ce capteur est destiné à alimenter un petit compteur CMOS qui doit être affiché pour vous (Ou pour le releveur de compteur) un bit de l'EEPROM (Bit 2 en adresse 0x2100) est prévu pour compter cette fois en Mètres Cubes (M3).

Ceci peut être très utile en permettant l'emploi de petits compteurs très faible consommation et même peut être d'un petit compteur de vélo…(En mode Step)
Dans ce mode M3, ceux-ci sont également comptabilisés en EEPROM et écrits à chaque M3. Bien entendu, les tops index sont cette fois au M3, sinon cela n'aurait qu'un intérêt très restreint de compter uniquement en M3 en EEPROM.
Cette écriture EEPROM n'est pas un gros handicap énergétique, car c'est seulement une écriture tous les 1000 litres !

Un autre bit de l'octet de contrôle (Bit 1) permet d'éviter le contrôle de fuite, car dans certains dispositifs qui fonctionnent en permanence (recirculation par exemple), il ne faut pas conclure à une fuite.
Dans le cas où la détection de fuite n'est pas "skipée", il est prévu de faire clignoter la sortie en complémentant la valeur de la sortie des tops Index à la fréquence de 10 Hz. La période du signal clignotant est donc de 200 ms. Ceci est fait pour attirer l'attention sur le problème par le Host connecté qui devra analyser ce signal comme anormal.

Le réglage du pont diviseur de la tension d'alimentation peut être réalisé par le Bit 0 à 1 de l'octet EEPROM. (Normalement les valeurs standard R7 et R7B devraient largement convenir, car ce n'est pas critique)
L'état des piles trop faibles est indiqué par la mise à 1 de la LED de sortie (Sortie à zéro).
Lors d'un tel épisode, il est impératif de changer les piles et donc on active un peu plus la décharge des piles avec la LED et le programme commence par écrire en EEPROM le bit 0 qui est le status LOW_BAT, puis il est mis en SLEEP et est donc totalement arrêté.

La mesure de la tension des piles se réalise 5 minutes après la mise sous tension pour permettre la charge du condensateur C7, ainsi que pour la programmation, puis après seulement toutes les 8 heures.
Ce temps de mesure comparé au temps de fonctionnement est négligeable dans ce contexte car il représente 1/36000 d’un supplément en temps, conjugué avec seulement quelques  % en temps CPU par rapport à une période de 100ms. Il faut donc "oublier" ce supplément.

Le réglage du circuit oscillant est prévu en faisant le court-circuit à la masse de l'entrée GPIO 3, ce qui a pour conséquence d'augmenter le temps de surveillance des impulsions du circuit oscillant en le passant de 500µs à 1000 µs. Seul ce point de réglage est extrêmement important pour vérifier le bon fonctionnement.

Le comptage du temps est approximatif car dû au principe de l'ULPWU "bidouillé" qui est loin d'avoir la précision d'un quartz , et de toutes façons le réglage est loin d'être optimum puisque ce réglage est fait par ajout de condensateurs en //. (Condensateurs avec des pertes réduites de préférence). De plus ce réglage dépend de la température, donc il est peu précis.
Les temps qui dépendent de ce manque de précision sont essentiellement attachés au contrôle des fuites, et cela n'a donc aucun besoin d'une précision horlogère !!!

2.2 Programme

Le programme a été structuré de façon un peu différente.

Dans la version capteur radio, on travaillait sur la valeur précédente (n-1) du nombre d'impulsions. Dans cette version édulcorée, comme le programme est beaucoup plus simple, il est possible de faire une grande partie des calculs et des tests des différents éléments en quelques dizaines de µs.

Aussi on travaille directement sur la valeur en cours en traitant en premier le lancement du délai de 100ms et immédiatement après le délai de 500µs.
Vient ensuite le test des multiples de 8 heures (0,8,16) et la mesure de la tension des piles si s'est nécessaire
On attend ensuite la fin du temps de 500 µs pour contrôler le franchissement ou non des seuils du nombre d'impulsions comptées en TMR0 et de décider en conséquence de faire évoluer ou non le bit de Top Index et donc la sortie.

Contrairement à l'autre montage, la valeur du bit de top Index suit assez fidèlement la rotation de la Cyble (Et non pas une très courte impulsion). C'est mieux pour un dispositif destiné aux automatismes qui ne sont pas aussi rapides pour enregistrer des impulsions de quelques dizaines de µs.

Une fois cela, le processeur PIC n'ayant plus rien à faire est simplement mis en sommeil en attendant son réveil par ULPWU (Sans interruptions) par GPIE à O et IOC 1 à 1. Dans ce cas on effectue simplement la suite du programme après l'instruction SLEEP.

(On gagne ainsi beaucoup en temps CPU sur l'envoi des trames de données relativement à la version radio).
Il est également possible de supprimer le contrôle des fuites nécessaire dans certains dispositifs.

L'adaptation de la self et des condensateurs de l'oscillateur est réalisée par des valeurs issues de la mise au point (MAP) mais inscrites en EEPROM. Cela permet en outre de rendre le programme indépendant des différents éléments rencontrés.

En cas de fuite, on bloquera définitivement la sortie GPIO5 à 1 avec allumage de la LED D1 (avec le courant fournit par le système hôte et non en interne au montage).

Voici les bits de contrôle en EEPROM adresse 0x2100 (qui sont à la fois status et paramètres) ainsi que les autres bytes qui n'ont aucune action directe et sont seulement de l'information, hormis les adresses 0x2122 et 0x2123 qui définissent le facteur de division pour les M3 ou autre valeur.

;------------------------------------------------------------
        ORG    0x2100

; Rappel des affectations de bits sur EEPROM0 / E_PROM

; #define    Test_Limbat    EEPROM0,Bit0    ; ce bit à 1 oblige mesure permanente Bat en réglage R7
; #define    Skip_fuite    EEPROM0,Bit1    ; PAS de contrôle de fuites
; #define    Mcube        EEPROM0,Bit2    ; Param Force Top Comptage des M3
; #define            EEPROM0,Bit3
; #define            EEPROM0,Bit4
; #define            EEPROM0,Bit5
; #define    Fuite        EEPROM0,Bit6    ; Fuite
; #define    Low_Bat    EEPROM0,Bit7    ; batterie faible
;

E_PROM        de    0x00        ; bit 0 à 1 valide la mesure des impulsions en GP0
        de    29        ; seuil bas des impulsions 21 mini 45 maxi
        de    37        ; seuil haut des impulsions médiane 33
E_REV_SCH    de    0x4        ; révision du schéma BCD
E_OSCAL_L    de    0x28        ; oscal Pf pour info seulement
E_OSCAL_H    de    0x34        ; oscal PF pour info seulement
        de    0xFF        ; réserve
        de    0xFF        ; réserve
        de    0xFF        ; réserve
        de    0xFF        ; réserve

        org    0x210A     ; Zone date non exploitée
;
; Date mise en place ou programation BCD
;
E_Jours    de    0x10        ; réserve jour (Pour mémoire seulement)
E_mois        de    0x01        ; réserve mois idem
E_Annee    de    0x16        ; réserve année
E_heures    de    0x16        ; réserve heures
E_minutes    de    0x22        ; réserve minutes idem
        de    0xFF        ; réserve
        de    0xFF        ; réserve
;
; 2 ème zone M3 65536 maxi
;
        org    0x2120        ; Zone des M3
        
EE_M3_L    de    0        ; adrs 3 0x0B
EE_M3_H    de    0        ; adrs 4 0x1D
EE_Div_L    de    0xE7        ; facteur de division pour M3 ou autre facteur
EE_Div_H    de    0x03        ; facteur de division pour M3

; Les valeurs litres et M3 ne sont écrites que si le bit 2 de EEPROM0 est actif
; cette possibilité est seulement prévue en vérification pour ne pas perdre les
; valeurs.
; l'écriture à lieu seulement à chaque M3 pour ne pas trop consommer (6ms write time)

    end                    ; directive 'end of program'


2.3 Le programme "ULPWU" du 12F675

Le principe est de charger en premier lieu le condensateur C4 (et C8 de réglage) par GPIO 1 en sortie à 1, puis de repasser cette sortie en entrée et d'attendre que la tension aux bornes du condensateur franchisse le seuil bas de l'entrée GPIO1.

Certes cette méthode basée sur les seuils CMOS est mauvaise car ceux-ci varient, mais cela n'a que très peu d'importance dans notre cas et permet de n'utiliser qu'un PIC très bon marché.

Il y a alors une pseudo interrupt qui est générée (ou son équivalent). Le PIC peut alors sortir de son sommeil.
A remarquer que cette méthode n'a d'intérêt que pour faire le weak-up du PIC, car autrement un simple compteur suffirait.
Cela permet de se passer de la consommation d'une horloge lorsque l'on est pas très "accro" à la précision, tout en ayant le minimum de consommation, ce qui est notre cas.

A noter que la charge du condensateur n'est pas instantanée et qu'elle doit être limitée en courant par la résistance R3 pour ne dépasser les limites de sortie du PIC. Le temps de charge est d'environ 8µs.

Voici la séquence

;
; ULPWU pour 100ms (délai de charge 120 Ohms # 8 µs)
;
        bsf    GPIO, Bit1        ; préparation sortie à 1 avant mise en Out
    BANK1
        bcf    TRISIO,Bit1        ; passage en sortie et envoi 1 log    
        goto    $+1
        goto    $+1        ; délai attente charge de C4
        goto    $+1        ; # 8 à 10 µs
        goto    $+1
        goto    $+1
        bsf    TRISIO,Bit1        ; re-passage en entrée
    BANK0
        movfw    GPIO            ; to reset INT éventuelle
        bcf    INTCON,GPIF        ; si cela n'a pas été fait avant

2.4 Schémas

Pas de difficultés majeures, seule la sortie avec l'open drain T2 est un peu difficile à suivre, mais la LED ne peut s'allumer que par le courant fourni par le host. (Strap S3 en place pour un capteur 3 fils et connecteur J1 inutilisé)

ITRON1_SCHEMA

 

Voici également le plan d'implantation correspondant.

ITRON3_IMPLANT

Et le typon correspondant (toujours en double) à placer l'un sur l'autre pour la noirceur et l'insolation. (Une face encrée toujours sur la vitre d'insolation bien entendu !)

ITRON3_TYPON

NOTA :

Comme j'ai changé de marque de CI, je me suis fait "déborder" et le résultat a été une attaque un peu trop musclée comme on peut le voir sur la photo de tête d'article... Mais la continuité électrique est assurée bien que la "visu" ne soit pas très "top".

(De mémoire, et à priori le plan d'implantation ne comporte pas d'erreur)

2.5 Programmation du PIC12F675

Je n'ai jamais rencontré de tels problèmes si délicats à mettre en évidence, car bien que j'aie toujours eu de nombreuses difficultés avec ces petits PIC, ce qui vient d'arriver est assez surprenant.

J'avais en effet choisi GPIO 0 comme entrée analogique pour la mesure de la tension des piles, certainement pour l'aspect 0 de l'adresse du convertisseur A/D ?
Pour la programmation ICSP, à cause du condensateur C7, j'ai été obligé de mettre un strap, mais j'avais choisi cette solution, car avec l'ICSP il y a souvent des problèmes si il y a des composants "disons, trop actifs" qui peuvent perturber cette programmation.
Ce cas se présente aussi pour GPIO 1 qui est à la fois entrée et sortie, et aussi le clock lors de la programmation…
Dans mon cas, j'avais décidé de mesurer la tension des piles d'emblée, en début de programme. Dans le cadre du fonctionnement réel, j'ai prévu de bloquer la sortie des tops index à 1 pour signifier un problème éventuel, mais aussi d'écrire un bit de status en EEPROM pour une éventuelle lecture ultérieure, car il n'y a aucune autre possibilité pour informer l'utilisateur.

Il s'avère que lors de la programmation du PIC, le programme arrive à s'exécuter avant (ou après) les commandes de programmation qui se font en bloquant justement les signaux datas et clock. J'avais donc une erreur de vérification systématique sur le programmateur K8086. (Commande de Vérification).

Après bien des suppositions et de vérification de points de passage, cette conclusion s'imposait. Lors de la programmation, le programme arrivait à fonctionner "suffisamment" pour écrire l'erreur Low_Bat entre l'écriture du programme dans le PIC et sa vérification, sans que je sache vraiment à quel instant se produit le problème. (Le condensateur C7 n'avait pas atteint sa charge à ce moment)

Cela s'explique ainsi : l'entrée GPIO 0 étant à zéro avant (ou après) programmation réelle, le programme détectant Low_Bat va écrire un bit en EEPROM précisant cette erreur.
A la vérification qui suivait, le contenu de l'EEPROM était donc différent puisqu'il avait eu le temps d'être modifié par le programme en tout début d'exécution entre la phase programmation et  la phase vérification.

Le schéma de ce capteur est-il optimum ? Pas certain, car il serait peut-être préférable de prendre pour clock et datas, des sorties et comme il y a très peu de possibilités, il aurait été plus judicieux de prendre GPIO 0 pour la grille de T2 et GPIO 1 pour la grille de T1 (ou inversement)

Vais-je refaire un CI ? Non, Je ne crois pas, car j'ai besoin d'un seul équipement, mais je vous engage à le faire. De plus cette erreur est facile à corriger par programme en gardant 5 minutes de délai pour la première mesure de tension des piles, ce qui permettra la mise en place et le retrait du PIC du programmateur.

Je ne sais pas si ce genre de problèmes peut se produire avec d'autres types de programmateurs, mais je reste très surpris par ce cas, bien que je me sois déjà posé cette question du passage entre les modes actif et programmation, et que j'avais soigneusement laissé de côté cette délicate question.
On en apprend tous les jours !

3 Les réglages

Bien qu'il n'y ait que très peu d'I/O, il a tout de même été possible d'avoir une gestion sommaire du temps et d'avoir un contrôle de fuite. (Le contrôle d'une fuite fait obligatoirement appel à la notion du temps). Celui-ci sera visualisé seulement par une alternance de 1 et 0 de la sortie sur la LED D1 avec une période de 200ms jusqu'à ce que le problème soit résolu.
Le flag pourra disparaître de l'EEPROM, car il peut être reseté par la résolution de la fuite et à part cette particularité de la LED de sortie avec des Tops Index accélérés, le montage fonctionne normalement (Avec des tops réguliers et volontairement faux, faisant office d'avertissement ).
Cette fonction de détection de fuite peut être désactivée par la mise à 1 d'un bit en EEPROM.

Ce genre de montage est parfaitement conditionné par la qualité des composants et en l'occurrence de la self et de son condensateur associé C1, sans oublier les 2 condensateurs qui font pont diviseur d'impulsions, C2 et C3.

Le nombre d'impulsions maxi est un critère important et il est nécessaire d'avoir une procédure intégrée qui permette de régler les différents paramètres qui sont :

- le nombre d'impulsions (conditionnant les seuils de comptage niveau Haut et Bas).
- la période de scan
- la fréquence des oscillations

Le réglage du nombre d'impulsions se réalise en jouant sur le niveau dynamique du point bas de la self durant la commande de T1. Ce réglage très important ne peut se réaliser que par programme avec les valeurs de C2 et C3 et le comptage des impulsions au scope.
Le scope devra être placé sur GPIO 0, en ayant eu soin de ne pas placer S4 (Très important car autrement on ne voit rien ! voir explications ci-après)
Pour ce faire, et comme on ne dispose d'aucune possibilité d'affichage, ni d'organe d'entrée, on forcera GPIO 3 à zéro pour entrer dans ce mode de réglage, par le connecteur ICSP dont la liaison 1-3 est à réaliser.

Dans ce mode de fonctionnement particulier la fenêtre des oscillations est augmentée du double pour être sûr de ne pas limiter la détection. On note les valeurs hautes et basses (avec ou sans Cyble) et on trouvera le plus souvent une valeur moyenne de l'ordre de 33 à 35 impulsions.
Le nombre d'impulsions en fonction de la température change, aussi il faut essayer d'avoir (en l'absence de Cyble) de l'ordre de 55 à 70 impulsions (Durée portée de 500µs à 1ms par le programme de réglage intégré)

La définition des seuils sera écartée de 3 impulsions de chaque côté de la valeur moyenne, ce qui donne une sécurité suffisante de 6 impulsions. Vous pourriez augmenter celle-ci à 4 ou 5 mais vous risqueriez alors d'affecter le comptage lors de fortes variations de température.

Exemple :

(Je suis actuellement à 4 de chaque côté de la moyenne sans problèmes.
Le programme calcule à l'initialisation la valeur moyenne à partir des impulsions maxi et mini entrées en EEPROM. Supposons 45 et 21 de valeur max et min.
Il réalise les calculs sur la base de ces 2 valeurs extrêmes (45-21)/2=12 puis 21+12=33 qui est la valeur moyenne. Les hystérésis sont donc dans ce cas de 33-4=29 et de 33+4=37)

L'idéal serait de tracer les courbes en fonction de la température et de se positionner avec précision pour avoir la meilleure immunité et l'hystérésis maximum, mais cela reste assez lourd et très long.
Ne pas oublier non plus que le scan en mode réglage est porté à 1ms et qu'en fonctionnement "normal" vous n'aurez jamais plus de 50 impulsions (100KHz=10µs durant 500µs --> 50)

POURQUOI est-il nécessaire d'avoir une séquence de programme spécifique pour faire ce réglage ?
Simplement parce que vous ne pouvez pas mettre le scope directement aux bornes de la self sans modifier profondément l'amortissement, ce qui est le point clé du montage.
De plus dans une moindre mesure vous modifieriez aussi la fréquence par la capacité de la sonde, mais cela serait un moindre mal.
Comment donner cette information sans rien modifier puisque nous ne disposons d'aucun moyen de visualisation…
On branchera le scope sur le connecteur ICSP bornes 3 (masse) et 4 GPIO_0. Pour utiliser cette entrée analogique passée en sortie logique, il sera nécessaire que le strap S4 (ou SD4) soit retiré ou que l'on ne le place pas après programmation.
Cette entrée analogique est reconvertie en sortie pour visualiser les impulsions directement au scope. Cette façon de faire est la seule qui ne modifie pas le contexte des oscillations.
(Ne pas oublier de retirer le strap S4 car l'amortissement créé modifie totalement le signal -et de le remettre après- )

Vous réglerez alors pour un maximum de l'ordre de 70 impulsions en jouant sur C2 ou C3 pour arriver à cet ordre de grandeur qui devrait être proche d'un maximum dans la quasi totalité des cas.

Le réglage de la fréquence de scan est déduit de la sortie de commande GPIO_4, période mesurée au scope et on peut alors régler C4 pour avoir "un petit 100ms". On ne doit observer que la période du signal GPIO 4 et non pas sur GPIO 1 ce qui fausserait totalement la mesure par l'impédance du scope.

Le réglage de la fréquence des oscillations peut parfois être nécessaire, mais cette fois il n'y a pas d'autre moyen que d'utiliser le scope aux bornes du circuit oscillant série. La fréquence sera certes un peu modifiée par la sonde, mais vous jouerez exclusivement sur le condensateur C1 pour atteindre environ 100 KHz de fréquence.
Ce réglage ne sera nécessaire que si vous ne disposez pas d'une self de 5mH (sur ferrite), car dans ce cas, avec les différentes capacités parasites, vous ne devriez pas être très loin de cette fréquence, car les variations sont minimisées par la fonction racine de LC de la fréquence des oscillations (LCw²=1)

En fonction des réglages vous en déduirez les valeurs Hautes ou Basses qui devront ensuite être inscrites respectivement en adresse 1 et 2 de l'EEPROM. Il vous faudra alors un programmateur pour pouvoir écrire ces valeurs ou utiliser les valeurs les plus courantes inscrites par défaut.

L'EEPROM permet un paramétrage simple du nombre d'impulsions avec et sans Cyble, par les 2 valeurs clé et facilement modifiables, sans avoir à intervenir sur le programme lui-même. C'est une petite contrainte, mais vu le circuit si restreint, il n'y a pas d'autres possibilités, pour limiter la dépendance.

Le bit de l'octet 0 (0x2100) de l'EEPROM permet de forcer ou non la détection de batterie faible uniquement en mode de réglage, mais cela n'a pas un intérêt très important puisque c'est pratiquement à 2.7V que l'alarme doit être lancée, et avec les valeurs du schéma, la précision me semble suffisante, d'autant qu'une divergence des caractéristiques du PIC peut induire quelques variations.
Avec ce bit à 1 on allume la LED lorsque le programme détecte LOW_BAT, ainsi il est facile de corriger avec RB7 pour la valeur de tension mini que vous imposez.
Ce même bit en mode normal indiquera Low_Bat si nécessaire.

Ce bit en mode réglage évite le blocage du programme en Low_Bat avec la LED allumée. Ce fonctionnement peut présenter un intérêt dans certaines installations, mais est surtout utile si l'on veut régler avec grande précision la valeur de la tension Vbat Acceptable suivant les types de piles par exemple.

4 Conclusions

Un tout petit montage qui devrait permettre de faire des relevés de consommations ou de l'analyse à l'aide d'un datalogger ou de tout autre enregistreur.
C'est un outil qui permet de voir l'activité d'un compteur, et de l'enregistrer avec un autre moyen (datalogger par exemple) et de s'expliquer avec un abonné. Car combien de fois m'a-t-on dit que le compteur ne fonctionnait pas...?! Ainsi le compteur est en situation et il n'y a pas d'ambiguïté sur la méthode de mesure.

ITRON1_1Pour ceux qui ont des applications en 5V, pas de problème, vous pourrez alimenter directement le capteur par J2 et avoir ainsi un "véritable capteur 3 fils".

Ce capteur est aussi totalement compatible avec les compteurs des autres marques (anciennes) SCHLUMBERGER et ACTARIS. (Capteur installé ici sur SCHLUMBERGER, photo ci-contre)

La critique me reprochera à juste titre ce connecteur 3 broches implanté en plein milieu du CI. J'y ai pensé mais le simple face et la nécessité de pouvoir accéder à tout composant pour la mise au point m'a empêché de mettre un connecteur coudé au dessus du PIC. Il faut prendre en compte aussi le connecteur ICSP qui prend aussi de la place.
(Le connecteur ICSP peut être l'objet d'un petit CI vertical prenant moins de place ? à voir)
Ce n'est pas la meilleure implantation, mais à chacun de la reprendre suivant ses goûts, (et pourquoi pas de m'envoyer un circuit imprimé .... Je ferai alors la modif !)

Je ne reviendrai pas sur l'ensemble du circuit oscillant car il a été largement décrit dans le précédent montage avec la radio.

Juste une petite anecdote, car en refaisant le schéma j'avais malencontreusement inversé self et condensateur du circuit oscillant !!! C'est à éviter car dans ce cas la tension continue médiane normalement imposée par les deux condensateurs C2 et C3 n'est plus et la référence devient alors le VDD avec des alternances qui sont écrêtées par l'entrée PIC, ce qui n'est pas bon du tout !. Pas de casse heureusement !

Juste un petit mot sur le "pseudo ULPWU" utilisé qui fonctionne correctement, mais il serait illusoire de pouvoir penser monter à des valeurs très importantes de capacité, car à 0.1µF ça ne fonctionnait déjà plus… Cela c'était avant d'avoir découvert l'utilité de la résistance R11. Qu'en est-il maintenant ? Je suppose qu'il faudra diminuer encore cette résistance si jamais ça accrochait sur certains modèles. Mais à vous de faire les essais, car le sujet est déjà bien débroussaillé…

Je crois que j'en avais déjà dit quelques mots, mais il serait tout de même utile si vous reprenez le schéma de laisser les I/O GP0 et GP1 en sorties, car cela éviterait d'avoir à couper les liaisons pour la programmation.
C'est une règle que je découvre avec plus d'acuité, d'éviter d'avoir les signaux clock et datas de l'ICSP sur des entrées. Le mieux est donc de les avoir en sortie car il y a moins de chance de trouver des éléments "gênants" pour la programmation.
Le programme serait bien entendu modifié par cela et comme ma mise au point a été laborieuse comme d'habitude, je ne vais donc pas aller plus loin...

Tout fonctionne correctement, mission accomplie !

"Tournez compteur"…

lokistagnepas