Interface logicielle (API) - Driver ADC
Attention : Cette documentation est basée sur le code pour le LPC82x. Le code pour les autres micro-contrôleurs sera mis à jour en fonction de cette documentation dans un avenir le plus proche possible. Le principe d'utilisation reste le même, mais certains paramètres n'existent pas actuellement pour les autres micro-contrôleurs.
Présentation
#include "drivers/adc.h"
Plusieurs entrées des micro-contrôleurs LPC peuvent être configurées comme entrées analogiques pour le convertisseur analogique / numérique (CAN / ADC)
Attention, certains LPC ne disposent pas d'un ADC, mais uniquement d'un comparateur.
Configuration
Partie commune
Le driver ADC fournit une interface de configuration simple et la plus unifiée possible, cependant, certaines fonctions peuvent ne pas être disponibles en fonction des spécificités de chaque micro-contrôleur.
void adc_on(void (*adc_callback)(uint32_t)); void adc_off(void);
La fonction adc_on() permet de configurer l'alimentation du bloc ADC, de configurer l'horloge pour le bloc et de rendre disponible l'interruption (ou les interruptions) correspondante(s).
Lorsque 'adc_callback' n'est pas nul cette fonction est enregistrée comme callback pour les interruptions ADC. Toutes les interruptions concernant l'ADC utilisent le même callback. Le callback reçoit en paramètre le statut de l'ADC (contenu du registre "flags" du bloc ADC) pour lui permettre d'identifier la source de l'interruption.
Interruptions
Les interruptions ne seront activées que sur demande lors de la configuration des acquisitions avec les fonctions adc_start_convertion_once() et adc_prepare_conversion_on_event().
Par défaut, si elles sont activées en utilisant le paramètre correspondant, les interruptions se déclenchent pour chaque conversion. Pour un déclenchement en fin de séquence de conversion, il faut utiliser le drapeau LPC_ADC_INT_MODE_END_OF_SEQ dans le paramètre 'mode' avec la fonction adc_prepare_conversion_on_event().
L'utilisation des interruptions en mode "burst" n'est pas disponible avec cette API logicielle car cela peut générer un très grand nombre d'interruptions et gêner ou bloquer l'exécution du programme. L'utilisation des interuptions en mode "burst nécessite des optimisations spécifiques pour la gestion des résultats et le fonctionnement de l'ensemble du programme. La configuration devra être faite manuellement ou ajoutée au code existant par vos soins.
Partie spécifique
Certains micro-contrôleurs permettent de configurer des modes spécifiques pour le bloc ADC.
int adc_set_resolution(int bits); #define LPC_ADC_12BITS [...] #define LPC_ADC_3BITS
adc_set_resolution() permet de configurer la résolution du convertisseur analogique / numérique pour les micro-contrôleurs qui le supportent.
Le paramètre 'bits' définit la résolution désirée pour les conversions. Les résolutions disponibles dépendent des micro-contrôleurs.
void adc_set_low_power(int lowpower_en);
adc_set_low_power() permet, lorsque le micro-contrôleur le supporte, de passer le bloc ADC en mode "low power" ('lowpower_en' != 0) ou en mode normal ('lowpower_en' = 0).
Lorsque le bloc ADC est en mode "low power", les conversions sont déclenchées avec un retard de 15 coups d'horloge. En cas de conversions multiples, ce retard est présent avant l'ensemble des conversions mais pas entre les conversions.
Sélection des canaux et des séquences de conversion
Le fichier d'entête "drivers/adc.h" définit le nombre de canaux disponibles (NB_ADC_CHANNELS) ainsi qu'une macro LPC_ADC_NUM(x) permettant de spécifier de façon lisible le canal sélectionné lorsqu'il est nécessaire de sélectionner un canal unique, et la macro LPC_ADC_CHANNEL(x) lorsqu'il est nécessaire de sélectionner plusieurs cannaux.
ADC_MCH(x)
'x' correspond au numéro de canal (0 à N, N dépendant du nombre de canaux disponibles sur le micro-contrôleur).
Cette macro doit être utilisée pour les sélection des canaux lorsqu'il est possible de sélectionner plusieurs cannaux de conversion, même si un seul canal est utilisé.
LPC_ADC(x)
'x' correspond au numéro de canal (0 à N, N dépendant du nombre de canaux disponibles sur le micro-contrôleur).
Cette macro doit être utilisée pour indiquer le canal utilisé lors des appels de fonction opérant sur un canal unique, à savoir adc_start_convertion_once() et adc_get_value().
Par exemple :
/* Select multiple channels for an event triggered conversion */ adc_prepare_conversion_on_event((ADC_MCH(9) | ADC_MCH(10)), LPC_ADC_START_CONV_SOFT, LPC_ADC_SEQA, 0, 0); /* Read the conversion result on channel 10 */ ret = adc_get_value(&val, LPC_ADC(10));
Certains micro-contrôleurs disposent de plusieurs séquences de conversion. Les fonctions pour lesquelles il est nécessaire de préciser la séquence utilisée fournissent un paramètre 'seq_num' qui doit être renseigné.
Le fichier d'entête "drivers/adc.h" définit le nombre de séquences disponibles (NB_ADC_SEQUENCES) et des noms pour identifier les séquences disponibles ainsi qu'une macro permettant de spécifier de façon lisible la séquence sélectionnée:
- LPC_ADC_SEQA
- LPC_ADC_SEQB
- ...
- LPC_ADC_SEQ(x)
Certains micro-contrôleurs supportent la configuration de plusieurs séquences de conversion. Lorsque c'est le cas, la numérotation des séquences commence à 0.
Utilisation : acquisition unique
void adc_start_convertion_once(uint8_t channel, uint8_t seq_num, uint8_t use_int);
Déclenche une unique conversion sur le canal ('channel') spécifié en paramètre en utilisant la séquence 'seq_num'.
Si le paramètre 'use_int' vaut 1 alors l'ADC sera configuré pour que la fin conversion déclenche une interruption.
Cette fonction est utilisée pour déclencher une conversion sur un canal unique.
Pour réaliser des conversions déclenchées logiciellement sur plusieurs canaux à la suite, utilisez la fonction adc_prepare_conversion_on_event() pour configurer les conversions avec la valeur LPC_ADC_START_CONV_SOFT pour le paramètre 'event', et la fonction adc_trigger_sequence_conversion() pour déclencher les conversions.
Le résultat est lu avec la fonction adc_get_value().
Utilisation : acquisition continue (Burst)
void adc_start_burst_conversion(uint16_t channels, uint8_t seq_num); void adc_stop_burst_conversion(uint8_t seq_num);
La fonction adc_start_burst_conversion() déclenche la conversion continue sur les canaux sélectionnés par le paramètre 'channels' pour la séquence 'seq_num'.
'channels' est un masque de bits correspondant aux canaux de conversion à activer. Utilisez la macro ADC_MCH(x).
Par exemple, pour des conversions continues sur les canaux 0 et 5 :
adc_start_burst_conversion((ADC_MCH(0) | ADC_MCH(5)), LPC_ADC_SEQ(0));
Les résultats peuvent être lus à n'importe quel moment avec la fonction adc_get_value(). La valeur de retour indiquera si il s'agit d'un nouveau résultat, d'un ancien résultat, ou si des résultats ont été perdus.
La fonction adc_stop_burst_conversion() arrête la conversion continue.
Utilisation : acquisition sur évènnement
void adc_prepare_conversion_on_event(uint16_t channels, uint8_t event, uint8_t seq_num, uint8_t use_int, uint32_t mode);
Prépare le déclenchement d'une conversion sur les canaux ('channels') spécifiés en paramètre, lors de l'occurrence de l'évènement (ou des évènements) spécifiés par le paramètre 'event'. La liste des évènements disponibles et la possibilité d'avoir plusieurs sources de déclenchement simultanées dépends du micro-contrôleur.
Voir l'énumération 'enum lpc_adc_start_conv_events' dans le fichier "include/drivers/adc.h" et la documentation du micro-contrôleur pour la liste des évènements supportés par le micro-contrôleur.
Lorsque le micro-contrôleur supporte plusieurs séquences d'acquisition le paramètre 'seq_num' indique la séquence à utiliser. Dans le cas contraire il est ignoré.
Si le paramètre 'use_int' vaut 1 alors l'ADC sera configuré pour que la fin conversion déclenche une interruption.
Le paramètre 'mode' peut être utilisé pour passer des éléments de configuration additionnels. Ce paramètre est un masque de bits correspondant aux configurations additionnelles désirées. Se référer à la documentation du micro-contrôleur concerné et aux définitions présentes dans le fichier d'entête du micro-contrôleur "include/drivers/adc.h" pour plus d'informations. Si aucune configuration additionnelle n'est possible ce paramètre est ignoré.
Utilisation : Récupération des résultats des conversions
int adc_get_value(uint16_t * val, uint8_t channel);
La fonction adc_get_value() permet de lire la valeur présente dans le registre de donnée correspondant au canal 'channel' spécifié en paramètre.
Si le canal demandé existe le résultat de la dernière conversion est écrit à l'emplacement mémoire pointé par 'val' dans tous les cas, après décalage pour que le bit de poids faible du résultat corresponde au bit 0 de 'val'.
La fonction adc_get_value() renvoie 0 lorsque la valeur lue est une nouvelle valeur et que la valeur de la conversion précédente avait été lue. Si la valeur n'a pas changé depuis la dernière lecture, adc_get_value() renvoie 1. La valeur de retour est 2 si des conversions ont été réalisées sans lecture du résultat avant la lecture du résultat actuel.
Si le canal spécifié n'existe pas la fonction renvoie -EINVAL et 'val' n'est pas modifié.
Spécificités par micro-contrôleur
LPC82x
- Résolution de l'ADC : 12 bits
- Nombre de séquences d'acquisition : 2
- Modes de déclenchement :
- LPC_ADC_START_CONV_SOFT : Déclenchement "software" (fonction adc_trigger_sequence_conversion())
- LPC_ADC_START_CONV_ADC_PINTRIG_0 : Entrée "trigger" 0
- LPC_ADC_START_CONV_ADC_PINTRIG_1 : Entrée "trigger" 1
- LPC_ADC_START_CONV_SCT0_OUT3 : State Configurable Timer 0 - Output 3
- LPC_ADC_START_CONV_ACMP_OUT : Sortie du comparateur analogique
- LPC_ADC_START_CONV_ARM_TXEV : Occurence de l'évènement "TXEV"
- Modes et configurations spécifiques :
- Configuration du trigger : LPC_ADC_START_EDGE_FALLING / LPC_ADC_START_EDGE_RISING
- Contournement de la synchronisation du déclenchement : LPC_ADC_SYNC_TRIG_BYPASS
- Step by step pour les séquences de conversion : LPC_ADC_SINGLESTEP
- Priorité des séquences d'acquisition : LPC_ADC_LOW_PRIORITY
- Interruptions en fin de séquence ou par canal : LPC_ADC_INT_MODE_END_OF_SEQ
LPC11A04
- Résolution de l'ADC : 3 à 10 bits (À vérifier)
- Nombre de séquences d'acquisition : 1
- Modes et configurations spécifiques :
LPC122x
- Résolution de l'ADC : 10 bits
- Nombre de séquences d'acquisition : 1
- Modes de déclenchement :
- Les modes de déclenchement sont une combinaison de (CT32B0 ou CT16B0) et (CAP0 ou MAT0 ou MAT1). Cela donne un déclenchement pour les sorties "match 0" ou "match 1" ou l'entrée "capture 0", pour les timers 32 bits 0 ou 16 bits 0. La sélection du type de front est faite par le paramètre 'mode'.
- Par exemple :
- LPC_ADC_START_CONV_EDGE_CT16B0_CAP0
- LPC_ADC_START_CONV_EDGE_CT32B0_MAT1
- Modes et configurations spécifiques :
- Le déclenchement manuel (software) d'une séquence de conversions initialement prévue pour se déclencher sur événement annulera la conversion sur événement.
LPC176x
- Résolution de l'ADC : 10 bits (À vérifier)
- Nombre de séquences d'acquisition : 1
- Modes et configurations spécifiques :