Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
BRICOLSEC
20 mars 2012

SLEEP MODE sur PIC, Quelques explications

SLEEP MODE sur PIC, Quelques explicationsSLEEP1
1 Essais dans quel but ?
2 Combien y a-t-il d'oscillateurs dans le 12F629 ?
2.1 Le schéma utilisé pour ces mesures
2.2 Consommation oscillateur LP
2.3 Consommation processeur sous 5V
2.4 Alimentation par pile
2.5 Un cas surprenant
3 La mesure des courants
4 La synchronisation
5 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 ----->

ATTENTION à compter du 15/09/2019 les commentaires ne seront plus possibles à causes de quelques imbéciles qui font du spam pour le plaisir de nuire ! désolé  !

 


 Avant propos

J'ai déjà buté sur les PIC avec des problèmes dus aux condensateurs chimiques et aux courants de fuite, et comme je prospecte pour mieux comprendre les fonctionnements aux faibles courants, je me suis heurté de nouveau sur plusieurs petits problèmes que je vais décrire ici.
Pas de satisfecit à recevoir, c'est simplement que j'ai déjà eu pas mal de soucis sur ces problèmes, et que j'ai préféré exposer mes essais pour en faire profiter ceux qui butent à un moment donné.

1 Essais dans quel but ?

J'envisage de plus en plus des montages à très basse consommation, aussi, il faut passer par le mode SLEEP qui permet de réduire très fortement la consommation, si l'on a rien d'autre à faire que d'attendre un évènement. La consommation "tous feux éteints" est de l'ordre du nanoampère !
Naturellement il y a quelques contraintes à respecter et quelques tours de main pour y arriver, mais c'est faisable sans difficultés insurmontables.

Si vous ne maîtrisez pas les PIC, et pour ma part il n'y a pas très longtemps que je m'y suis mis, alors, je vous recommande les différentes bibles de "BIGONOFF" sur ces sujets.
http://www.abcelectronique.com/bigonoff/

Je n'ai pas pour objectif de concurrencer ce précurseur très compétent et généreux de ses connaissances au profit des autres, mais d'apporter un petit complément ponctuel, pas toujours évident pour ceux qui n'ont pas l'entreprise en soutien technique et qui galèrent seuls.

Dans les différents PIC que j'ai abordés, (16F628, 16F886, 12F629) j'ai toujours été embêté par les horloges qui doivent être compatibles avec le temps en secondes et les sous multiples, mais aussi avec les vitesses de transmission en bauds. Et que dire du souhait de tourner à la vitesse maxi du PIC. (Attention aux radars et aux prunes…!)

Il me reste dans mes tiroirs quelques vieux quartz à 32.768 Khz issus de vieilles cartes mères ou d'une montre à quartz ayant rendu l'âme, qui "piaffent" d'être à nouveau utiles…

(J'avais regardé il y a quelques temps le 146818 pavé horloge des vieux PC, mais si la consommation reste à priori un peu plus forte en veille, un point important est l'obligation de l'utiliser à Vcc 5Volts ! Ce point est rédhibitoire pour les utilisations à 2.5V ou 3V.
De plus, en dynamique, la consommation atteint des valeurs très élevées, jusqu'à 10mA)

En réalité ce n'est pas la possession des quartz qui m'a guidé, car jusqu'à présent je n'ai pas eu besoin de gérer l'heure en faible consommation, mais je devrais en avoir besoin dans un futur proche, alors le mode SLEEP pose un véritable problème puisque l'oscillateur de l'horloge interne s'arrête avec la commande SLEEP.

Plusieurs solutions :

- Ou l'on garde l'oscillateur principal interne que l'on bascule à 32Khz comme certains PIC l'autorisent, mais dans ce cas, non seulement les performances sont largement affectées, mais il faudrait tout de même se synchroniser si l'on change de vitesse, et je vois cela comme assez délicat pour maintenir une bonne précision du temps.
De plus la consommation reste tout de même élevée puisqu'elle est seulement divisée par 2 environ. (450µA à 2V et INTOSC).

- Ou on s'oriente vers un oscillateur externe séparé et ayant de préférence une fréquence divisible par puissance de deux, et qui continuerait de compter le temps…

Alors en solution toute faite, il y a le TIMER1 présent sur beaucoup de PIC 12F et 16F (Sauf entre autres, la série des 10F200)

Cette solution est intéressante, car on est sûr que l'oscillateur fonctionnera tout le temps, qu'il est fiable, et que sa consommation reste très faible. (Ce n'est pas très facile de faire un oscillateur stable, qui démarre à tous les coups et indépendant de la température)
De plus il est possible de reprendre automatiquement le contrôle dès que le PIC est "réveillé" et de synchroniser (assez facilement ?) l'horloge PIC pour obtenir les temps courts intermédiaires aux secondes.

Pourquoi tout cela ? Tout simplement parce que si le processeur est en SLEEP, il ne faut pas le réveiller trop souvent sous peine de perdre tout le bénéfice d'une consommation ultra faible. Alors effectivement la fréquence bien pratique pour l'incrémentation du timer 1 est le 32.768 Khz qui donne des repos de 1 ou 2 secondes.
(De plus cet oscillateur est prévu seulement pour ces très faibles vitesses)

(A noter au passage que le Timer 1 en boucle continue (report du comptage sans écriture d'une nouvelle valeur en TMR1L &  H), donnera alors des interrupts toutes les 2 secondes seulement 16 bits=65536 et non 32768)

J'ai en projet seulement, un appareil pour engager des actions à date ou période fixe, mais aussi divers appareils portables alimentés sur pile rechargeable dont un nouveau capteur pour compteur d'eau. Je crois que les tensions de 2 à 3 Volts sont les tensions qui vont s'imposer de plus en plus et le fonctionnement jusqu'à 2 Volts est réellement "miraculeux".
(Quand je pense à une simple tension Vbe de 0.7V, il ne reste pas beaucoup de place entre 0 et 2 V. Heureusement que les technologies sont différentes !)

2 Combien y a-t-il d'oscillateurs dans le 12F629 ?

Sur PIC 12F629, j'ai eu un peu de mal à comprendre comment les différents oscillateurs étaient agencés. J'ai tout de même fait le tour du sujet. Sur d'autres PIC ce n'est pas tout à fait identique, mais cela permettra de comprendre cette histoire des oscillateurs LP ou HS qui parait toujours mystérieuse.

Outre les possibilités d'oscillateurs externes avec quartz, il y a en INTERNE au PIC un oscillateur de base (high speed) à 4 Mhz, donnant les 4 cycles au processeur. (INTOSC avec ou sans sortie Clock_Out). Il est également possible d'utiliser un oscillateur externe à fréquence élevée, mais aussi un oscillateur Low Power (LP) Dans ce cas, c'est un "module" LP qui est réalisé à partir d'un inverseur normal.

Là où est toute la subtilité sur laquelle le constructeur reste un peu flou, est que cet oscillateur LP est UNIQUE et qu'il ne peut servir qu'à une seule fonction :

- Soit pour l'horloge générale du PIC,
- Soit pour le TIMER 1.

On comprendra la philosophie constructeur ainsi : "Si cet oscillateur sert pour l'horloge, le timer 1 y aura aussi accès par fosc/4, c'est donc inutile qu'il y en ait 2 de ce type.

Ceci implique que l'horloge de base ne pourra jamais être en LP si on utilise l'oscillateur pour le TIMER1.
Cet oscillateur est limité en fréquence et est voué au 31 ou 32 KHz.

Ce qui perturbe un peu la compréhension, est que cet oscillateur LP unique est toujours "placé" sur les bornes OSC1 et OSC2 quelque soit son utilisation en horloge OU Timer 1 !

Dans les anachronismes, on constatera aussi sur la figure 5.1 du Datasheet PIC 12F629 la pin T1G* qui est aussi l'entrée oscillateur OSC2 et GPIO4.
Bien entendu, dans le cadre du TIMER1 cela est surprenant, mais il faut comprendre que cela devrait être une exclusivité : oscillateur TMR1 (OSC1 et 2) OU Enable externe  (T1G*). Je n'ai à priori pas trouvé d'explication sur cette exclusivité. Ainsi l'Enable ne pourrait être utilisé qu'avec le Timer 1 en mode Fosc/4 et jamais avec un oscillateur externe pour Timer 1.

Sur PIC 16F628 il y a possibilité pour deux oscillateurs exterSLEEP0nes différents (pour l'horloge mais également pour le Timer 1). Les performances sont un peu plus hautes pour l'oscillateur LP de ce PIC (200 KHz).

2.1 Le schéma utilisé pour ces mesures

Il n'a rien de spectaculaire, c'est un oscillateur externe basé sur le TIMER1 et une LED sur une seule sortie. Un PIC 12F629 est utilisé, mais le but premier est de mettre en oeuvre un oscillateur externe pour le Timer 1.

Cet oscillateur devrait maintenir le temps absolu entre les périodes de SLEEP du processeur.

2.2 Consommation oscillateur LP

La consommation de l'oscillateur du Timer 1 est mesurée sur l'alimentation générale du PIC (Pin1 dans ce cas du 12F629).

La question du nombre d'oscillateurs étant résolue, (Il n'y en a que 2 dans le cas de ce modèle de PIC 12F629), il reste à savoir quelle est la consommation de l'oscillateur LP (Timer 1 ou LP d'horloge)

Il y a le datasheet qui indique 10.5 µA maxi pour 5V, et spécifiquement à ajouter au Power down de base de 995 nA (SLEEP).
Soit un total de # 11.5µA que j'ai pu mesurer avec un micro ampèremètre digital "standard", mais cette mesure est réputée fausse, car on mesure à priori un courant moyen, mais on verra que ce courant n'a rien de constant.

2.3 Consommation processeur sous 5V

L'unité centrale en SLEEP a seulement à surveiller la variation de ses registres de PORT et ses entrées spécifiques pour Interrupt, puis de se remettre en marche sur un changement d'état défini à l'avance.

Cependant ce schéma est un peu simple, car pour obtenir toutes les valeurs des courants, il est nécessaire d'appliquer les informations du constructeur, à savoir :

Positionner toutes les sorties en entrées (Tri-state) et en fixer le potentiel à la masse ou au VCC/VDD. C'est seulement dans ces conditions que l'on peut obtenir les consommations minimum.

Il est précisé aussi que les accessoires tels que le watchdog, le Brown Out Detect (BOD), le comparateur, le générateur de courant de référence, le timer 1 et le convertisseur A/D consomment aussi.
Et parmi ceux-ci on relèvera le plus gourmand en consommation qui est le générateur de courant de référence pour le comparateur avec 180µA immédiatement suivi par le Brown Out Detect avec 130µA.

Tous ces éléments de consommations figurent tous dans le datasheet dans les caractéristiques DC paramètres D10 à D26 à partir de la page 87.

Concernant le BOD, je pense que dans le cas où on est en SLEEP, il est inutile à 1nA de base de perdre son temps avec le BOD, car ainsi que cela a pu être vu (voir l'article sur les "chimiques"), un condensateur de 100µF est capable de maintenir en SLEEP le processeur durant 1 heure environ.

2.4 Alimentation par pile

Je devrais dire par petite batterie NiMH, car j'ai abandonné les piles depuis longtemps.

Je pense qu'il y a deux grandes familles de montages à classer :

- La famille des montages nécessitant le maintient de l'heure et d'un calendrier.
- Les montages n'ayant pas besoin du temps absolu.

Dans le cas, où il faut l'heure absolue, il est nécessaire d'avoir un oscillateur LP qui fonctionne en permanence et sa consommation sera de l'ordre de 10 µA sous 5V. Si l'on considère une alimentation de 2 à 3V il faut tout de même compter 5 µA permanents (Sans les cycles de réveil du processeur)

Si l'on considère un petit assemblage de 2 batteries R6 de 2500mAH (Capacité (théorique) courante proposée pouvant délivrer 2.5V ), cela va donner une autonomie théorique de 2.5 10E6 / 5=500 000 heures soit 20800 jours ou 57 années !
Ça ne tiendrait donc qu'à la condition que la partie de fonctionnement du processeur évaluée à 600 µA ne représente pas une part trop importante.

En effet si on va à l'extrême avec le fonctionnement quasi-permanent du processeur, alors on arrive à 4166 heures soit 173 jours et donc moins d'une année.

La valeur réelle sera donc située entre une autonomie de 173 jours et de 57 ans !

On mesure toute la variabilité de tels projets, d'autant qu'il faut aussi prévoir quelques consommations de commandes de dispositifs, car un ordi est fait pour commander des dispositifs ou effectuer des calculs, car ce n'est pas un objet de décoration ! L'autonomie considérée comme "acceptable" pour un dispositif sur pile ou batterie est de 12 à 15 ans environ.
(Cette autonomie est en fait aussi partagée avec la possibilité effective de la source d'énergie à délivrer son courant nominal durant ces longues années). 

Dans les dispositifs ne nécessitant pas l'heure absolue, on peut citer par exemple, l'ouverture d'une porte de garage, mais également un compteur horaire (cumul d'heures et minutes sans gestion de l'heure absolue)
A l'opposé, mon dispositif de poursuite du soleil associé à l'heure nécessite impérativement l'heure absolue, mais seulement pour une demi journée environ. Ce cas ne se pose pas réellement puisque le secteur est présent et que le dispositif est fixe.

Comment venir à bout des ces extrêmes de consommation ? Simplement en  évaluant la part d'activité du processeur et la part de sommeil (SLEEP) ou en mesurant au réel cette proportion.

Personnellement je pense qu'il faudra procéder des deux manières, car les valeurs de courants mesurées sont fausses par définition (courants non véritablement continus) et comme on le verra, il y a des petits pics de courant générés par le TIMER1 s'il est utilisé, car il n'y a pas que l'oscillateur, il y a aussi une pincée d'électronique pour les bascules du prescaler et le compteur TMR1 H & L lui-même, ainsi qu'un peu de logique de validation.

Qu'en serait-il d'une petite pile bouton de 100mAH genre CR2032 à 5µA de courant permanent ? 2.2 Années !
À 600 µA ce serait 6.9 jours ! On voit tout de suite que dans ces conditions, l'alimentation permanente sur pile serait impossible.

2.5 Un cas surprenantSLEEP4

Dans ces essais préalables, (suivant schéma ci-avant), j'avais utilisé une seule sortie avec une LED et résistance rappelée à la masse. Suite à des courants anormaux, j'ai modifié en rappelant cette fois la LED au VCC, (ce qui n'a pas changé le problème qui était ailleurs (Synchro))

Pendant la mesure du courant du PIC en pin 1, son alimentation a été coupée malencontreusement, mais cela n'a pas empêché le PIC de continuer grâce aux fuites internes par la LED et sa résistance  alimentée au VCC (au niveau du chimique de 1µF). (La LED a continué de flasher)
J'ai vérifié plusieurs fois si je voyais bien clair et si j'avais bien mes lunettes, et à part un petit café, pas d'alcool ! (La prise pour le courant était située après un condensateur de 1µ et juste avant la Pin 1) 
Je dois dire que j'en suis réellement surpris d'autant que le microampèremètre indiquait bien du courant lorsqu'il était connecté, et la LED a continué de clignoter (donc le programme de tourner !)

(Je précise également qu'avant de passer le PIC en SLEEP, je réalise le TRISIO des GPIO pour que tout soit en Entrée haute impédance. Toutes ces autres entrées étaient "tirées" à la masse).

Sauf m'être fait abusé, j'expliquerais cela ainsi : lors du passage en sortie le PIC 12F629 pouvait peut-être s'alimenter par sa sortie GPIO1 dans la mesure ou sa connexion VCC est coupée. Le temps du programme en mode actif était de l'ordre de 6 ms et le reste du temps en SLEEP était pratiquement d'une seconde.
Or en mode SLEEP la consommation est de 1nA qui peut être facilement fournie sur 1 seconde, par quelques très petits condensateurs internes ou quelque fuite…

Ce cas pourtant assez incroyable m'a confirmé tout de même l'importance extrême de la mesure du courant d'alimentation...

3 La mesure des courants

Le mode SLEEP est le coma programmé d'un processeur. Dans le coma, il n'y a plus aucune activité intense dans le processeur. (Plus aucune instruction n'est effectuée).

Dans le cas du PIC 12F629 et de cet essai, c'est le timer 1 qui reste seul en activité. Une faible partie du processeur reste en surveillance, notamment les interrupts ainsi que toute la chaîne depuis l'oscillateur à quartz jusqu'au compteur TMR1 H & L.

Pour éviter le cas surprenant du paragraphe précédent, je suis revenu sur GPIO1 avec la LED connectée de nouveau à la masse. (Voir schéma)

Le courant d'alimentation représente la seule information qui puisse témoigner de l'activité de ce processeur en "phase comateuse".

Cela peut paraître un peu anachronique de procéder ainsi, mais aucun autre élément n'est accessible et il faut bien se contenter de ce que l'on a !
Outre un micoampèremètre que l'on peut placer dans la ligne d'alimentation du PIC, il m'a semblé intéressant de voir "la gueule" des courants sur le scope.
Il faut donc ajouter une résistance en série dans l'alimentation VCC/VDD du PIC (Pin 1). Sa valeur est telle que la tension aux bornes soit "suffisante" pour la mesure, et ne perturbe pas la tension d'alimentation du PIC. C'est un compromis, qui avec 330 ohms, trouve son efficacSLEEP_TIMER1_2ité sans perturber le PIC.

On ne découplera surtout PAS cette résistance et le scope sera placé aux bornes de celle-ci (Alimentation du scope sur batterie sans référence de masse)
Vous pourrez voir quelques enregistrements que l'on peut expliquer ainsi.

Dans le premier cas la LED est connectée (à la masse) et on peut voir le courant engendré lors de l'activité du processeur qui passe à  # 3 mA durant Les 6 ms du programme.

Dans l'autre cas la LED est déconnectée et on peut observer la remise en marche du processeur durant environ 1ms qui correspondrait environ au PWRT_SLEEP_TIMER1ON.

Le passage du processeur en actif se réalise assez rapidement en 1ms environ.
On voit parfaitement le passage de 10µA environ à 600µA environ, puis la retombée très progressive en l'absence de charge sur GPIO1 (cas où la LED a été déconnectée).
On peut également imaginer au bruit de fond les différentes consommations de la petite logique de TMR1. (Attention, Les échelles de temps ne sont pas comparables entre les 2 oscillogrammes).

4 La synchronisation

Lorsque le processeur est en SLEEP, il faut aussi comprendre que son horloge interne déterminant les cycles d'alimentation des instructions est à l'ARRÊT (INTOSC dans ce cas).
(On pourrait d'ailleurs se poser la question de savoir si dans le cas d'un oscillateur externe pour l'horloge, il serait nécessaire de l'arrêter pour ne pas augmenter les consommations. Dans notre exemple c'est impossible puisque OSC1 et 2 sont déjà utilisés pour TMR1)

En conséquence sur un oscillateur externe pour le timer 1, et un processeur en coma; il n'est pas possible de synchroniser Timer 1 et horloge (Car à cet instant Il n'y a pas d'horloge !) et le dispositif de synchronisation est bloqué et le comptage sur TMR1 ne s'effectue pas !

J'ai cherché pourquoi en simulation ça marchait parfaitement  (moyennant une petite reprise manuelle, car le SLEEP n'est pas simulé) et dès que l'on passait en réel ça ne marchait plus.

C'est uniquement parce que j'avais laissé le signal T1SYNC* dans sa valeur d'origine à la MST (soit 0).

Erreur ! Il faut le mettre à 1 pour ne PAS se synchroniser. C'est impératif dans cette configuration !

Dans les autres oublis, il faut aussi souligner la nécessité de mettre à 1 T1OSCEN (Enable). La partie de validation LP pouvant être affectée à l'horloge processeur, cette branche de validation est inactive dans ce cas.
(Il faut aussi TMR1_ON, ce qui ne vous aura pas échappé !)

5 Conclusions

Cet article relate seulement un essai de faisabilité avec oscillateur en timer1 pour maintenir le temps absolu. Cela est juste pour la faisabilité, mais il restera quelques éléments certainement un peu délicats mais pas insurmontables, qui seront la synchronisation du temps lorsque les deux horloges sont actives.
Il y aura certainement aussi à ajuster par un petit trimer ajustable, le temps de l'oscillateur 32 KHz à quartz.

En effet dans cet essai le temps le plus fin est déterminé pour 2 secondes (65536).
En réalité le registre TMR1H a été chargé à 0x80 ce qui donne la seconde entre interrupt, mais il faut des conditions de rapidité pour ne pas perdre de temps au niveau du traitement de l'interrupt du timer1.

Normalement le délai ne devrait pas dépasser 30µS (Pour horloge à 4 Mhz) sous peine de perdre une alternance du signal à 32KHz lors de l'écriture de 0x80 en TMR1H (RAZ ou report d'un élément du registre TMR1). Cela restera à évaluer….

Je dois dire aussi, que outre le microampèremètre et l'oscillo, une LED transparente haut rendement reste aussi un élément d'observation à ne pas négliger car c'est simple et très efficace.
Voilà donc quelques petits éléments sans prétentions qui permettent de mieux comprendre ce qui se passe dans cette approche du mode SLEEP sur les PIC, mais plus particulièrement sur le PIC 12F629 qui m'a servi à cette fin de faisabilité.

L'extrapolation des différents principes vers les autres PIC me semble assez facile pour que je ne m'en soucie pas véritablement.

J'espère que cela vous évitera de chercher trop longtemps, et vous aura surtout permis de mieux comprendre ce qui peut se passer si vous vous lancez dans les faibles courants.

Les réalisations afférentes à ces essais…. c'est pour un peu plus tard…!

 

_____ ( retour en début d'article ) ____

 _____ ( retour accueil lokistagnepas ) ____
_____ ( retour accueil bricolsec ) ____

Publicité
Publicité
Commentaires
L
Bonjour,<br /> <br /> Merci, mais pour l'anecdote, ça ne m'a pas empêché de me faire prendre de nouveau...La prochaine fois je relirai mes propres articles. (problème mémoire !)<br /> <br /> Bonne continuation et meilleures salutations<br /> <br /> bricolsec
G
Bonjour,<br /> <br /> Merci pour cette étude du mode sleep est très instructif, mais de puis quelques jours je planchais sur ma maquette 12f629 quie n'arrivais pas à sortir du "coma".<br /> <br /> Finalement c'est une mauvaise compréhension qui m'a enduit en erreur.<br /> <br /> Dès le début je persistais à garder la config horloge en mode LP (logique à mes yeux)<br /> <br /> avec un quartz 32k pour le timer1 . <br /> <br /> Forcement, à chaque fois que le mode sleep était actif, le PIC se retrouvait sans horloge pour le réveil sous interruption de Timer1.<br /> <br /> Il Faut donc impérativement mettre l'horloge interne 4 mHz ( INTRC-OSC-NOCLKOUT pour cadencer le processeur ,<br /> <br /> et garder les entrées OSC pour le Quartz 32K du timer1 en mode LP !!! et non pas pour le 12F629.<br /> <br /> cordialement.<br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> CMCON = 7 ' mode tout digital pas de comparateur<br /> <br /> TRISIO = %00110000 <br /> <br /> gpio = 0<br /> <br /> <br /> <br /> T1con=%00011000 'div 8<br /> <br /> INTCON.6=1 ' PEIE Autorise IT des périphériques donc aussi pour timer1<br /> <br /> PIE1.0 =1 ' TMR1IE Autorise IT du débord TIMER 1 si ce bit est à "1"<br /> <br /> T1con.3 =1 ' T1OSCEN autorise osc LP (max 37KHz)<br /> <br /> T1CON.2 =1 ' T1SYNC: Timer1 External Clock Input Synchronize external clock input<br /> <br /> <br /> <br /> T1CON.1 =1 ' (TMR1CS) Timer1 Clk Source Select bit T1OSO/T1CKI pin<br /> <br /> ' 0 = Internal clock (FOSC/4)<br /> <br /> T1con.0 =1 ' Mise en service du Timer 1 (TMR1ON)
BRICOLSEC
Publicité
Newsletter
Visiteurs
Depuis la création 3 411 563
Publicité