Après le développement de mon premier minuteur, j'ai souhaité faire évoluer le projet afin de le rendre plus pratique, plus complet et plus moderne, tout en conservant un encombrement réduit. Cette nouvelle version apporte plusieurs améliorations, tant au niveau de l'interface utilisateur que des possibilités de réglage :
Ce minuteur est principalement destiné à une utilisation en cuisine. Il doit donc être simple et rapide à régler, tout en restant suffisamment compact pour pouvoir être facilement installé ou déplacé sur un plan de travail. L'utilisation d'un écran graphique et d'une liaison Bluetooth permet également d'envisager une interface plus conviviale et plus flexible que celle de la première version.
Pour le choix des composants, j'ai retenu le microcontrôleur STM32L100RC, que j'avais déjà utilisé dans plusieurs de mes projets précédents. Ce microcontrôleur présente notamment l'avantage d'avoir une faible consommation d'énergie, ce qui correspond parfaitement aux objectifs de ce projet. Son utilisation permet ainsi de limiter la consommation globale du système et de favoriser une bonne autonomie sur batterie.
Pour l'affichage, j'ai choisi le EADOGS102, qui me semble particulièrement bien adapté à cette application. Il s'agit d'un écran LCD graphique compact, dont les dimensions réduites permettent de conserver un minuteur peu encombrant tout en offrant une grande liberté pour l'affichage des informations. La maîtrise de la consommation électrique constitue également un point essentiel du projet, puisque l'objectif est d'obtenir la meilleure autonomie possible avec une pile bouton CR2450.
Dans la version précédente du minuteur, j'utilisais un switch de type joystick pour effectuer les différents réglages. Cependant, ce composant est devenu plus difficile à trouver et présente une certaine fragilité à l'utilisation. J'ai donc choisi de le remplacer par un encodeur rotatif, qui offre une commande plus intuitive pour le réglage du temps et devrait également apporter une meilleure robustesse à l'utilisation quotidienne.
Le bouton poussoir intégré à l'encodeur rotatif permet d'enclencher l'alimentation du circuit. Lors de l'appui sur le bouton, le transistor Q2 est commandé afin d'alimenter le microcontrôleur. Une fois celui-ci démarré, le microcontrôleur prend le relais et maintient l'alimentation à travers le transistor Q1. Cette configuration permet ainsi de mettre en œuvre un interrupteur électronique et de couper complètement l'alimentation lorsque le minuteur est éteint.
Pour piloter le buzzer, j'ai intégré le transistor Q3 en configuration émetteur-suiveur. Cette configuration permet d'obtenir le courant nécessaire au fonctionnement du buzzer tout en utilisant le signal provenant de la sortie DAC du microcontrôleur. Le transistor joue ainsi le rôle d'interface entre la sortie du microcontrôleur et la charge.
La réduction de la consommation étant un objectif important de ce projet, j'ai également prévu la possibilité de couper complètement l'alimentation du module Bluetooth. Le transistor Q4 permet de commander cette alimentation et d'éviter que le module ne consomme de l'énergie lorsqu'il n'est pas utilisé.
Enfin, un pont diviseur résistif permet de mesurer la tension de la batterie à l'aide d'une entrée analogique du microcontrôleur. Cette mesure permet de surveiller en permanence l'état de la pile et de détecter une tension trop faible. Le minuteur peut ainsi avertir l'utilisateur lorsque la pile CR2450 doit être remplacée, avant que son niveau de tension ne devienne insuffisant pour assurer le bon fonctionnement du circuit.
| id | Référence | Empreinte | N | Désignation |
|---|---|---|---|---|
| 1 | C1,C3,C5,C2,C10 | C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | 5 | 100n |
| 2 | R3,R2,R7,R4 | R_0805_2012Metric_Pad1.18x1.45mm_HandSolder | 4 | 10 |
| 3 | C7,C8 | C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | 2 | 6.8p |
| 4 | C18,c12,C13,C11,C9 | C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | 6 | 1u |
| 5 | R10 | R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | 1 | 10K |
| 6 | D1,D2 | D_MiniMELF | 2 | LL4148 |
| 7 | R18,R17,R16,R14,R5,R1,R11 | R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | 7 | 100K |
| 7 | R9 | R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | 1 | 100 |
| 9 | SW1 | SW_Push_SPST_NO_Alps_SKRK | 1 | SW_Push |
| 10 | R8 | R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | 1 | 47K |
| 11 | Y1 | Crystal_SMD_2012-2Pin_2.0x1.2mm | 1 | 32.768 |
| 12 | R6 | R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | 1 | 510 |
| 13 | SW2 | PEC11L_Encodeur | 1 | RotaryEncoder_Switch |
| 14 | Q3,Q1 | SOT-23 | 2 | BC850 |
| 15 | C20,C19,C6 | C_1206_3216Metric_Pad1.33x1.80mm_HandSolder | 3 | 10u |
| 16 | C4 | C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | 1 | 1n |
| 18 | Q2,Q4 | SOT-23 | 2 | BC860 |
| 19 | U2 | LQFP-64_10x10mm_P0.5mm | 1 | STM32L100RCTx |
| 20 | U4 | EA-DOGS102 | 1 | EA_DOGS102-6 |
| 21 | R12 | R_0805_2012Metric_Pad1.20x1.40mm_HandSolder | 1 | 15K |
| 22 | J1 | PinHeader_2x05_P1.27mm_Vertical_SMD | 1 | Conn_02x05_Odd_Even |
| 23 | BZ1 | EKULIT-1 | 1 | Buzzer |
| 24 | U1 | ST_SPBTLE | 1 | SPBTLE-RF |
| 25 | BT1 | Support pile CR2450 | 1 | Battery_Cell |
Pour vérifier que le montage s’intègre correctement dans son boîtier, j’ai utilisé FreeCAD afin de réaliser une simulation en 3D.
La plupart des empreintes utilisées dans KiCad disposent déjà d’un modèle 3D au format STEP. Il est ainsi possible de visualiser directement le circuit imprimé en trois dimensions et de vérifier l’emplacement des différents composants avant sa fabrication.
Le modèle 3D du circuit peut ensuite être importé dans FreeCAD afin de réaliser l’assemblage complet avec le boîtier. Cela permet de contrôler l’encombrement des différents éléments, leur positionnement et de s’assurer que l’ensemble s’intègre correctement avant de passer à la fabrication.
Objectif : utiliser la mesure de la référence interne VREFINT pour estimer la tension réelle d'alimentation VDDA. Cette information permet ensuite de corriger les conversions effectuées par l'ADC et ainsi d'améliorer la précision des mesures analogiques.
L'ADC utilise en effet VDDA comme tension de référence. Toute variation de cette tension se répercute donc directement sur le résultat des conversions. Par exemple, si VDDA diminue, une même tension appliquée sur une entrée analogique produira une valeur ADC plus élevée. La mesure de VREFINT permet de détecter cette variation et de calculer plus précisément la tension réellement présente sur VDDA.
Le microcontrôleur possède une référence de tension interne stable appelée VREFINT. Sa valeur nominale est d'environ 1,21 V, mais il est préférable de ne pas utiliser directement cette valeur théorique pour effectuer les calculs.
Une valeur de calibration mesurée en usine est enregistrée dans la mémoire système du microcontrôleur. Cette valeur correspond à la conversion ADC de VREFINT dans des conditions de référence définies par le constructeur.
En comparant la valeur de VREFINT mesurée par l'ADC avec cette valeur de calibration, il est possible d'estimer la tension réelle de VDDA.
HAL_ADCEx_EnableVREFINT();
Il est également possible d'effectuer cette opération directement par
les registres, selon le modèle de microcontrôleur utilisé :
SYSCFG->CFGR3 |= SYSCFG_CFGR3_EN_VREFINT;
Il faut ensuite configurer l'ADC afin qu'il effectue une conversion sur le canal interne correspondant à VREFINT :
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_VREFINT;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
Attention : VREFINT est une source interne présentant une impédance relativement élevée. Il est donc nécessaire d'utiliser un temps d'échantillonnage suffisamment long afin de permettre au condensateur d'échantillonnage de l'ADC de se charger correctement. Un temps trop court peut entraîner une erreur importante sur la mesure.
Une conversion peut maintenant être lancée afin de récupérer la valeur numérique correspondant à VREFINT :
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
uint16_t adc_vrefint = HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop(&hadc1);
Le microcontrôleur contient une valeur de calibration VREFINT programmée en usine. Son adresse dépend du modèle exact de STM32 utilisé et doit donc être vérifiée dans la documentation du microcontrôleur. /p>
#define VREFINT_CAL_ADDR ((uint16_t*) (0x1FF800F8))
uint16_t vrefint_cal = *VREFINT_CAL_ADDR;
Important : l'adresse ci-dessus est donnée pour le microcontôleur utilisé dans ce projet. Elle ne doit pas être recopiée sans vérification dans la documentation correspondant au STM32L1 utilisé.
Cette valeur de calibration représente la valeur de conversion ADC de VREFINT obtenue lors de la caractérisation en usine, dans les conditions de tension et de température spécifiées par le constructeur.
La tension VDDA peut alors être estimée à partir du rapport entre la valeur de calibration et la valeur actuellement mesurée :
float vdda = 3.0f * ((float)vrefint_cal / (float)adc_vrefint);
Le principe est relativement simple : si VDDA diminue, la tension de référence interne VREFINT représente une proportion plus importante de la tension de référence de l'ADC. La valeur numérique retournée par l'ADC augmente donc.
À l'inverse, si VDDA augmente, la valeur ADC mesurée pour VREFINT diminue. La comparaison avec la valeur de calibration permet ainsi de déterminer la tension d'alimentation réelle du convertisseur.
Une fois VDDA déterminée, elle peut être utilisée pour convertir les autres résultats ADC en tension réelle :
float tension = ((float)adc_value / 4095.0f) * vdda;
Pour un ADC 12 bits, la valeur maximale est 4095. La mesure obtenue tient ainsi compte des variations réelles de VDDA, contrairement à un calcul utilisant simplement une valeur fixe de 3,3 V.
#define VREFINT_CAL_ADDR ((uint16_t *)0x1FF800F8)
uint16_t vrefint_cal = *VREFINT_CAL_ADDR;
uint16_t adc_vrefint = 0;
/* Mesure ADC de VREFINT */
adc_vrefint = HAL_ADC_GetValue(&hadc);
/* Calcul de VDDA en millivolts */
uint32_t vdda = (3000UL * vrefint_cal) / adc_vrefint;
La valeur de vdda peut ensuite être utilisée pour calculer
les tensions correspondant aux autres conversions ADC.
Pour une application nécessitant une surveillance régulière de l'alimentation, VREFINT peut être mesurée périodiquement, par exemple toutes les 100 ms à 1 s, selon les besoins de l'application.
Il est également possible d'appliquer un filtrage logiciel, comme une moyenne glissante de plusieurs mesures, afin de réduire les fluctuations de la valeur calculée. La tension VDDA ainsi obtenue peut ensuite être conservée en mémoire et utilisée pour les conversions ADC suivantes.