Échantillonnage avec le GPADC¶
Cette note consolide les guides ADC pour SF32LB52x, SF32LB55x, SF32LB56x, SF32LB57x et SF32LB58x. Le flux logiciel est commun, mais les limites d'entrée, les affectations de broches et les points d'étalonnage sont spécifiques à chaque famille. Sélectionnez la famille cible dans les tableaux avant de configurer le matériel ou le firmware.
Le GPADC est l'ADC à usage général de SiFli, destiné notamment à mesurer les sorties de capteurs et la tension de batterie. Il est distinct de l'ADC audio disponible sur SF32LB52x, SF32LB56x, SF32LB57x et SF32LB58x, ainsi que de l'ADC sigma-delta disponible sur SF32LB55x et SF32LB58x. Cette note couvre uniquement le GPADC ; pour les autres convertisseurs, consultez la documentation audio ou sigma-delta de la famille cible.
Portée de l'ADC et modèle de canaux¶
Les notes d'application du SDK pour SF32LB52x, SF32LB55x, SF32LB56x et SF32LB58x utilisent huit canaux ADC, GPADC_CH0 à GPADC_CH7, pour des sources analogiques telles que les sorties de capteurs et la tension de batterie. La table des canaux ADC du SDK pour SF32LB57x définit douze canaux : PA28–PA38 correspondent à GPADC_CH0–GPADC_CH10, et le canal de détection de batterie est GPADC_CH11 (nommé BAT dans la table du SDK). Le guide de conception matérielle SF32LB57x nomme le signal correspondant du boîtier VBAT ou VBATS selon la variante d'alimentation. La valeur de tension obtenue dépend du canal sélectionné, de son réseau d'entrée et de l'étalonnage logiciel adapté au composant cible.
SF32LB52x possède un circuit dédié de mesure de batterie sur GPADC_CH7 (BAT) : selon l'exemple du SDK, ce canal est relié à VBAT via un diviseur interne, et le facteur de conversion vbat_factor du SDK est appliqué pour obtenir la tension de batterie. En revanche, GPADC_CH7 correspond au pad externe PB32 sur SF32LB56x et PB39 sur SF32LB58x. Le canal de mesure de batterie du SF32LB57x est GPADC_CH11 ; utilisez le signal VBAT ou VBATS correspondant à la variante d'alimentation et respectez les limites propres à ce domaine. Ne déduisez pas qu'un canal relié à la batterie sur la carte est un canal batterie dédié dans la puce.
Caractéristiques de l'ADC et réseau d'entrée¶
| Famille | Canaux GPADC | Résolution | Précision typique | Tension maximale sur une entrée GPADC normale |
|---|---|---|---|---|
| SF32LB55x | 8 | 10 bits | 3–4 mV | 1,1 V (X1) ; 3,3 V (X3) |
| SF32LB52x | 8 | 12 bits | 1–2 mV | 3,3 V |
| SF32LB56x / 58x | 8 | 12 bits | 1–2 mV | 3,3 V |
| SF32LB57x | 12 | 12 bits | 1–2 mV | 3,3 V |
Les tensions maximales indiquées ci-dessus s'appliquent aux entrées GPADC normales ; les canaux dédiés à la batterie ont leur propre circuit et leurs propres limites. L'exemple SF32LB55x utilise un diviseur de 1 MΩ / 220 kΩ avec un temps d'établissement RC de 157 ms. Le guide récapitulatif SF32LB56x indique 470 kΩ / 1000 kΩ et 200 ms pour SF32LB52x, SF32LB56x et SF32LB58x ; il ne formule pas cette recommandation pour SF32LB57x. Pour le 57x, suivez le circuit de détection de batterie et les limites documentés pour la référence exacte, sans extrapoler ces valeurs de résistance ni ce temps d'établissement. Ces recommandations concernent les réseaux diviseurs externes. En particulier, le canal dédié GPADC_CH7 du SF32LB52x comporte déjà un diviseur interne. N'ajoutez pas de diviseur externe, sauf si le schéma de la carte cible le prévoit expressément. La tolérance des résistances influe sur la précision ; étalonnez séparément le diviseur externe en production lorsque la conception en utilise un.
| Famille | Chemin de mesure de batterie | Note de conception |
|---|---|---|
| SF32LB55x | Diviseur externe relié à une entrée GPADC sélectionnée ; le circuit de référence utilise PB10 / GPADC_CH1. |
Maintenez la sortie du diviseur sous la limite d'entrée du mode X1/X3 sélectionné. |
| SF32LB52x | Canal dédié GPADC_CH7 / BAT ; l'exemple SDK indique que VBAT est reliée via un diviseur interne. |
Utilisez vbat_factor du SDK pour convertir la mesure de ce canal dédié en tension de batterie. |
| SF32LB56x / 58x | Un diviseur externe de la carte alimente un pad GPADC sélectionné ; la référence SDK associe GPADC_CH7 à PB32 / PB39, respectivement. |
Vérifiez le chemin réel du diviseur batterie dans le schéma de la carte cible. Ce sont des pads GPADC normaux, et non des canaux batterie dédiés dans la puce. |
| SF32LB57x | Canal dédié GPADC_CH11 ; la table SDK le nomme BAT, tandis que le guide matériel emploie VBAT ou VBATS selon la variante d'alimentation. |
Consultez la limite de mesure du canal batterie du composant exact. Pour les variantes alimentées en 3,3 V, le guide spécifie une plage de mesure GPADC VBATS de 0 à 4,5 V ; ne la remplacez pas par la limite de 4,7 V de la broche. |
Pour mesurer la batterie via une entrée externe du SF32LB55x, la FAQ d'OpenSiFli propose un diviseur de 1 MΩ / 220 kΩ avec des résistances à 1 %. Ces valeurs élevées réduisent le courant de fuite permanent du diviseur ; la tolérance de 1 % limite l'erreur du rapport de division et contribue à la précision de mesure. La sortie du diviseur est le point de mesure de l'ADC, et non la tension de la batterie. Pour adapter cette référence, tenez compte du schéma et des limites électriques de la cible.


| Tension de batterie en entrée | Sortie de PB10_BAT_DET_ADC |
|---|---|
| 3,0 V | 0,540983607 V |
| 3,3 V | 0,595081967 V |
| 3,6 V | 0,649180328 V |
| 4,0 V | 0,721311475 V |
| 4,2 V | 0,757377049 V |
| 5,0 V | 0,901639344 V |
Dans le schéma de référence du SF32LB55x, VBAT est relié à PB10_BAT_DET_ADC via R125 (1 MΩ). R126 (220 kΩ) et C118 (0,1 µF) relient ce nœud à la masse en parallèle. Ces valeurs sont données à titre de référence ; vérifiez-les selon le schéma et les limites électriques de la cible.

Alimentation analogique et référence¶
La configuration de l'alimentation analogique et des broches de référence dépend de la famille. Référez-vous au schéma du composant cible au lieu de supposer une broche VREF identique pour tous les GPADC :
| Famille | Connexions d'alimentation et de référence |
|---|---|
| SF32LB52x / 56x | Alimentez AVDD33_ANA à partir d'une ligne stable de 3,3 V. Le schéma de référence montre GPADC_VREF découplée à la masse ; cette broche n'est pas une entrée d'alimentation. |
| SF32LB55x | Le schéma de référence montre AVDD33_ANA et AVSS33_ANA ; suivez le schéma cible pour leur raccordement et leur découplage. |
| SF32LB57x | Alimentez AVDD33_ANA en 3,3 V. GPADC_VREF est une broche de référence : raccordez uniquement le condensateur prescrit à la masse et ne l'alimentez pas de l'extérieur. |
| SF32LB58x | Le schéma de référence montre AVDD33_ANA / AVSS33_ANA, GPADC_VREFP avec son condensateur prescrit et GPADC_VREFN reliée à la masse. Aucune des deux broches de référence ne constitue une entrée d'alimentation. |
La paire GPADC_VREFP / GPADC_VREFN du SF32LB58x ne correspond pas à la broche unique GPADC_VREF nommée dans les autres familles. Le schéma SDK présente aussi des composants de filtrage propres à chaque famille ; utilisez le circuit de référence et les valeurs de composants du composant cible. N'appliquez jamais directement une alimentation à une broche de référence GPADC. AVDD33_ANA est l'alimentation analogique et AVSS33_ANA la masse analogique lorsqu'elle est présente.

Configurer la broche ADC¶
Configurez la broche d'entrée sélectionnée en fonction analogique avant l'échantillonnage. Les exemples d'API génériques du guide sont :
Ces appels illustrent l'API de broche analogique, pas une sélection de broche spécifique à une famille cible. Sélectionnez l'entrée physique dans ce mappage des canaux :
| Famille | GPADC_CH0 |
GPADC_CH1 |
GPADC_CH2 |
GPADC_CH3 |
GPADC_CH4 |
GPADC_CH5 |
GPADC_CH6 |
GPADC_CH7 |
|---|---|---|---|---|---|---|---|---|
| SF32LB55x | PB08 |
PB10 |
PB12 |
PB13 |
PB16 |
PB17 |
PB18 |
PB19 |
| SF32LB52x | PA28 |
PA29 |
PA30 |
PA31 |
PA32 |
PA33 |
PA34 |
BAT |
| SF32LB56x | PB22 |
PB23 |
PB24 |
PB25 |
PB26 |
PB27 |
PB28 |
PB32 |
| SF32LB58x | PB32 |
PB33 |
PB34 |
PB35 |
PB36 |
PB37 |
PB38 |
PB39 |
| SF32LB57x | PA28 |
PA29 |
PA30 |
PA31 |
PA32 |
PA33 |
PA34 |
PA35 |
Les sources de SiFli ne concordent pas sur le brochage ADC du SF32LB52x : la note d'application ADC dédiée au SF32LB52x indique, pour la révision A0, la correspondance suivante entre les pads externes PB08, PB10, PB12, PB13, PB16, PB17, PB18, PB19 et les canaux GPADC_CH0 à GPADC_CH7 ; le tableau ADC récapitulatif du guide SF32LB56x indique plutôt PA28 à PA34 pour GPADC_CH0 à GPADC_CH6, et BAT pour GPADC_CH7. La ligne SF32LB52x ci-dessus reprend le tableau récapitulatif et ne constitue pas un brochage universel pour toute la famille 52x. Avant de router ou de configurer le GPADC d'un composant 52x, vérifiez la référence et la révision exactes dans la configuration de multiplexage du SDK correspondant et le schéma de la carte ; ne fusionnez pas ces deux correspondances.
Le SF32LB57x possède quatre canaux ADC supplémentaires : PA36 est GPADC_CH8, PA37 est GPADC_CH9, PA38 est GPADC_CH10, et le signal de détection batterie est GPADC_CH11 (BAT dans la table SDK ; VBAT ou VBATS dans le guide matériel selon la variante d'alimentation). Ce canal appartient au domaine batterie et possède une plage de mesure différente de celle des entrées GPADC ordinaires. Pour les variantes alimentées en 3,3 V, respectez la plage de mesure GPADC VBATS de 0 à 4,5 V indiquée dans le guide, et non la tension nominale de broche de 4,7 V. Le mappage à 12 canaux et l'entrée batterie ne sont donc pas interchangeables avec les mappages à huit canaux ci-dessus.
Sur SF32LB55x, il est également possible d'affecter directement une broche à un canal GPADC, par exemple avec HAL_PIN_Set(PAD_PB08, GPADC_CH0, PIN_NOPULL, 0). Ne reprenez pas cette affectation spécifique pour une autre famille.

Lire un canal ADC¶
Le SiFli-SDK enregistre l'ADC comme un périphérique de mesure de tension de batterie ; le guide utilise bat1 comme nom de périphérique par défaut. Avec l'interface de périphérique RT-Thread, trouvez le périphérique, ouvrez-le en lecture seule, activez le canal souhaité et lisez sa valeur brute :
uint32_t channel = 1;
uint32_t value;
rt_device_t dev = rt_device_find("bat1");
if (dev) {
rt_device_open(dev, RT_DEVICE_FLAG_RDONLY);
rt_device_control(dev, RT_ADC_CMD_ENABLE, (void *)channel);
rt_device_read(dev, channel, &value, 1);
}
Au niveau HAL, lisez le résultat de conversion avec HAL_ADC_GetValue(&hadc, slot). Transmettez le handle ADC initialisé et le numéro de slot configuré pour la conversion ; vérifiez que ce slot correspond au canal et à la broche PAD attendus.
Étalonnage de l'ADC et conversion de tension¶
Le guide modélise la conversion comme une relation linéaire :
Offset est la valeur brute de l'ADC lorsque l'entrée est à 0 V ; Ratio est l'incrément de tension pour une unité de valeur brute. L'étalonnage en usine compense les variations de fabrication. Le guide décrit également un étalonnage en deux points du circuit d'entrée assemblé :
- Appliquez deux tensions précises et stables et lisez les valeurs ADC correspondantes.
- Utilisez les deux tensions d'étalonnage de la famille cible plutôt que 0 V ou la tension d'entrée maximale.
- Utilisez
sifli_adc_calibrationpour calculer et conserver le rapport et le décalage. - Convertissez les valeurs brutes suivantes avec les paramètres d'étalonnage enregistrés. Pour calculer la tension en amont du diviseur, tenez également compte de son rapport de division.
L'implémentation source définit ADC_RATIO_ACCURATE à 1000, avec des valeurs initiales adc_vol_offset et adc_vol_ratio de 200 et 3930 respectivement. Cette fonction d'assistance historique illustre le calcul linéaire, mais ne remplace pas le processus d'étalonnage de la version SDK cible. Si le SDK cible fournit une API d'étalonnage HAL ou du pilote de périphérique, utilisez cette interface.
Plages d'étalonnage SF32LB55x¶
La FAQ OpenSiFli décrit plus en détail le processus d'étalonnage du SF32LB55x. Lors de l'exécution de sifli_adc_init, la configuration d'usine stockée en Flash et identifiée par FACTORY_CFG_ID_ADC fournit les mesures d'étalonnage enregistrées. sifli_adc_calibration en déduit l'offset et le ratio linéaires ; les échantillons suivants utilisent le calcul sifli_adc_get_mv correspondant à la plage sélectionnée.
Deux plages d'étalonnage sont documentées :

- Plage X1 : 0,3 V et 0,8 V. Les valeurs d'étalonnage stockées ont le bit 15 défini, l'implémentation sélectionne donc le chemin de petite plage. La précision est réduite près de 0 V et au-dessus de 1 V. Ce chemin désactive
GPADC_ADC_CFG_REG1_ANAU_GPADC_ATTN3X, donc le diviseur interne est désactivé et le point de test ADC ne doit pas dépasser 1,1 V. - Plage X3 : 1,0 V et 2,5 V. C'est la méthode d'étalonnage antérieure. Elle active
GPADC_ADC_CFG_REG1_ANAU_GPADC_ATTN3X, qui active le diviseur interne avec une atténuation 3× ; l'entrée ne doit pas dépasser 3,3 V.

Ne choisissez jamais une plage d'étalonnage à partir du tableau seul : utilisez la configuration d'usine et l'implémentation SDK cible. Les comportements X1 et X3 sont propres aux documents SF32LB55x cités ici ; ils ne constituent pas une règle à appliquer à une autre famille.
| Famille | Entrées d'étalonnage |
|---|---|
| SF32LB55x | 0,3 V et 0,8 V |
| SF32LB52x / 56x / 58x | 1,0 V et 2,5 V |
| SF32LB57x | 1,0 V et 2,5 V |
Pour le SF32LB52x, les sources diffèrent selon leur version : la note ADC consolidée donne 1,0 V et 2,5 V pour l'étalonnage en deux points, tandis que la référence API HAL actuelle identifie la plage d'étalonnage par défaut du SF32LB52X comme X1, avec des points de 0,3 V et 0,8 V. Ne considérez pas ces deux paires comme des valeurs par défaut interchangeables. Avant de choisir les points d'étalonnage ou la limite d'entrée autorisée, vérifiez, pour le composant cible, la version exacte du SDK, les données d'usine et la plage d'étalonnage à l'exécution.
static uint32_t adc_vol_offset = 200;
static uint32_t adc_vol_ratio = 3930;
#define ADC_RATIO_ACCURATE 1000
int sifli_adc_get_mv(uint32_t value)
{
return (value - adc_vol_offset) * adc_vol_ratio / ADC_RATIO_ACCURATE;
}
int sifli_adc_calibration(uint32_t value1, uint32_t value2,
uint32_t vol1, uint32_t vol2,
uint32_t *offset, uint32_t *ratio)
{
uint32_t gap1, gap2;
if (offset == NULL || ratio == NULL) return 0;
gap1 = (value1 > value2) ? (value1 - value2) : (value2 - value1);
gap2 = (vol1 > vol2) ? (vol1 - vol2) : (vol2 - vol1);
if (gap1 == 0) return 0;
*ratio = gap2 * ADC_RATIO_ACCURATE / gap1;
adc_vol_ratio = *ratio;
*offset = value1 - (vol1 * ADC_RATIO_ACCURATE / adc_vol_ratio);
adc_vol_offset = *offset;
return adc_vol_offset;
}
Valider l'étalonnage après le démarrage et le réveil¶
Pour le débogage de la mesure de tension de batterie du SF32LB55x, la FAQ d'OpenSiFli indique que les valeurs peuvent être inexactes pendant les quelque 300 premières millisecondes suivant le démarrage ou le réveil, en raison de la charge et de la décharge du réseau RC. La forme d'onde observée se stabilise au bout d'environ 350 ms. Ajoutez un délai d'échantillonnage adapté ou écartez les premières valeurs instables. Lors de la mesure du nœud du diviseur avec un multimètre ou un oscilloscope, tenez compte de l'impédance d'entrée de l'appareil, qui peut provoquer une chute d'environ 30 mV selon la FAQ.

Vérifier la broche ADC du SF32LB55x après le mode Standby et le réveil¶
Pour l'entrée de mesure de batterie du SF32LB55x sur PB10, vérifiez la configuration de la broche avant le passage en mode Standby et après le réveil. Avant l'initialisation, PB10 possède par défaut une résistance de tirage haut interne. Dans pinmux.c, configurez la broche avec PIN_NOPULL et PIN_ANALOG_INPUT. Sinon, cette résistance peut rester active et provoquer ponctuellement des mesures anormalement élevées.


Vérification de mise en service¶
Avant d'ajouter une acquisition multi-canaux ou cyclique, vérifiez un canal avec une tension d'entrée stable, mesurée indépendamment :
- Confirmez la correspondance broche-canal propre à la famille cible et la configuration analogique.
- Confirmez que la sortie du diviseur reste dans la limite d'entrée ADC de la famille cible.
- Comparez les résultats bruts et étalonnés avec la tension appliquée.
- Conservez les conditions de diviseur et d'étalonnage avec le journal de test de la carte.
Lors du raccordement de l'UART de journalisation du SF32LB56x à un PC externe, la tension de référence de l'adaptateur série doit correspondre à la tension d'E/S du circuit. La FAQ ADC d'OpenSiFli avertit qu'un adaptateur référencé à 5 V sur des E/S à 3,3 V peut fortement sous-estimer les mesures de l'ADC ; une batterie de 4 V peut, par exemple, être lue à 3,3 V.
Source officielle¶
- Guide d'utilisation et de configuration de l'ADC SF32LB52x
- Guide d'utilisation et de configuration de l'ADC SF32LB55x
- Guide d'utilisation et de configuration de l'ADC SF32LB56x
- Guide d'utilisation et de configuration de l'ADC SF32LB57x
- Guide d'utilisation et de configuration de l'ADC SF32LB58x
- Référence de l'API HAL ADC SF32LB52x — définitions de la plage d'étalonnage par défaut.
- Guide de conception matérielle SF32LB57x — Stockage et fabrication — affectation des canaux et pads GPADC.
- Guide de conception matérielle SF32LB57x — Système minimal et alimentation — connexions analogiques d'alimentation/référence et limites de détection batterie par variante.
- FAQ ADC OpenSiFli — plages d'étalonnage d'usine et validation SF32LB55x au démarrage, en veille et après réveil, ainsi que recommandations sur le niveau de l'UART de journalisation SF32LB56x.
Dernière mise à jour: