- Matériaux nécessaires
- ADC sur STM8S103F3P6
- Schéma de circuit pour lire les valeurs ADC sur STM8S et afficher sur LCD
- Bibliothèque ADC pour STM8S103F3P6
- Programme STM8S pour lire la tension analogique et l'affichage sur LCD
- Lecture de la tension analogique à partir de deux potentiomètres à l'aide du STM8S
Si vous êtes un lecteur régulier qui suit nos tutoriels sur les microcontrôleurs STM8S, vous savez que dans notre dernier tutoriel, nous avons appris comment interfacer un écran LCD 16x2 avec des STM8. Maintenant, en poursuivant ce didacticiel, nous allons apprendre à utiliser la fonction ADC sur notre microcontrôleur STM8S103F3P6. Un ADC est un périphérique très utile sur un microcontrôleur qui est souvent utilisé par les programmeurs embarqués pour mesurer des unités en constante évolution comme la variation de tension, de courant, de température, d'humidité, etc.
Comme nous le savons, «nous vivons dans un monde analogique avec des appareils numériques», ce qui signifie que tout ce qui nous entoure comme la vitesse du vent, l'intensité lumineuse, la température et tout ce que nous traitons comme la vitesse, la vitesse, la pression, etc. sont de nature analogique. Mais nos microcontrôleurs et microprocesseurs sont des appareils numériques et ils ne pourront pas mesurer ces paramètres sans un périphérique important appelé les convertisseurs analogique-numérique (ADC). Donc, dans cet article, apprenons à utiliser ADC sur le microcontrôleur STM8S avec le compilateur COMIC C.
Matériaux nécessaires
Dans cet article, nous lirons deux valeurs de tension analogiques de deux potentiomètres et afficherons sa valeur ADC sur un écran LCD 16x2. Pour ce faire, nous aurons besoin des composants suivants.
- Carte de développement STM8S103F3P6
- Programmeur ST-Link V2
- Écran LCD 16x2
- Potentiomètres
- Fils de connexion
- Résistance 1k
ADC sur STM8S103F3P6
Il existe de nombreux types d'ADC et chaque microcontrôleur a ses propres spécifications. Sur le STM8S103F3P6, nous avons un ADC avec 5 canaux et une résolution de 10 bits; avec une résolution de 10 bits, nous pourrons mesurer la valeur numérique de 0 à 1024 et un ADC 5 canaux indique que nous avons 5 broches sur le microcontrôleur qui peuvent prendre en charge ADC, ces 5 broches sont mises en évidence dans l'image ci-dessous.
Comme vous pouvez le voir, ces cinq broches (AIN2, AIN3, AIN4, AIN5 et AIN6) sont multiplexées avec d'autres périphériques, ce qui signifie qu'en plus d'agir comme une broche ADC, ces broches peuvent également être utilisées pour effectuer d'autres communications comme par exemple, les broches 2 et 3 (AIN5 et AIN 6) peuvent non seulement être utilisées pour ADC mais peuvent également être utilisées pour la communication série et les fonctions GPIO. Notez qu'il ne sera pas possible d'utiliser la même broche pour les trois objectifs, donc si nous utilisons ces deux broches pour ADC, nous ne serons pas en mesure d'effectuer une communication série. D'autres caractéristiques ADC importantes pour STM8S103P36 peuvent être trouvées dans le tableau ci-dessous extrait de la fiche technique.
Dans le tableau ci-dessus, Vdd représente la tension de fonctionnement et Vss représente la terre. Donc, dans notre cas sur notre carte de développement, nous avons le microcontrôleur fonctionnant sur 3.3V, vous pouvez vérifier le schéma de circuit de la carte de développement dès le démarrage avec le tutoriel STM8S. Avec 3,3 V comme tension de fonctionnement, notre fréquence d'horloge ADC peut être réglée entre 1 et 4 MHz et notre plage de tension de conversion est comprise entre 0 V et 3,3 V. Cela signifie que notre ADC 10 bits lira 0 lorsque 0V (Vss) est fourni et lira un maximum de 1024 lorsque 3,3V (Vdd) est fourni. Nous pouvons facilement modifier ce 0-5V en modifiant la tension de fonctionnement du MCU si nécessaire.
Schéma de circuit pour lire les valeurs ADC sur STM8S et afficher sur LCD
Le schéma de circuit complet utilisé dans ce projet est donné ci-dessous, il est très similaire au tutoriel LCD STM8S dont nous avons discuté précédemment.
Comme vous pouvez le voir, les seuls composants supplémentaires en dehors de l'écran LCD sont deux potentiomètres POT_1 et POT_2 . Ces pots sont connectés aux ports PC4 et PD6, qui sont les broches ANI2 et ANI6, comme indiqué sur l'image de brochage précédemment.
Les potentiomètres sont connectés de telle manière que lorsque nous le faisons varier, nous obtiendrons 0-5 V sur nos broches analogiques. Nous programmerons notre contrôleur pour lire cette tension analogique en valeur numérique (0 à 1024) et l'afficher sur l'écran LCD. Ensuite, nous calculerons également la valeur de tension équivalente et l'afficherons sur l'écran LCD, rappelez-vous que notre contrôleur est alimenté par 3,3V, donc même si nous fournissons 5V à la broche ADC, il ne pourra lire que de 0V à 3,3V.
Une fois les connexions effectuées, mon matériel ressemble à ceci, comme illustré ci-dessous. Vous pouvez voir les deux potentiomètres à droite et le programmateur ST-link à gauche.
Bibliothèque ADC pour STM8S103F3P6
Pour programmer les fonctionnalités ADC sur STM8S, nous utiliserons le compilateur Cosmic C avec les bibliothèques SPL. Mais pour faciliter les processus, j'ai créé un autre fichier d'en-tête qui peut être trouvé sur GitHub avec le lien ci-dessous.
Bibliothèque ADC pour STM8S103F3P6
Si vous savez ce que vous faites, vous pouvez créer un fichier d'en-tête en utilisant le code ci-dessus et l'ajouter au répertoire «inclure les fichiers» sur votre page de projet. Sinon, suivez le didacticiel de démarrage STM8S pour savoir comment configurer votre environnement de programmation et votre compilateur. Une fois que votre configuration est prête, votre IDE devrait avoir les fichiers d'en-tête suivants, au moins ceux entourés de rouge.
Le fichier d'en-tête ci-dessus se compose d'une fonction appelée ADC_Read () . Cette fonction peut être appelée dans votre programme principal pour obtenir la valeur ADC à n'importe quelle broche. Par exemple, ADC_Read (AN2) renverra la valeur ADC sur la broche AN2 comme résultat. La fonction est illustrée ci-dessous.
unsigned int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {unsigned int result = 0; ADC1_DeInit (); ADC1_Init (ADC1_CONVERSIONMODE_CONTINUOUS, ADC_Channel_Number, ADC1_PRESSEL_FCPU_D18, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE); ADC1_Cmd (ENABLE); ADC1_StartConversion (); while (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); résultat = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Comme vous le voyez, nous pouvons passer huit paramètres à cette fonction et cela définit la façon dont l'ADC est configuré. Dans notre code de bibliothèque ci-dessus, nous avons défini le mode de conversion sur continu, puis le numéro de canal a passé un paramètre. Et puis nous devons régler la fréquence CPU de notre contrôleur, par défaut (si vous n'avez pas connecté de cristal externe), votre STM8S fonctionnera avec un oscillateur interne de 16Mhz. Nous avons donc mentionné « ADC1_PRESSEL_FCPU_D18 » comme valeur de pré-mise à l'échelle. Dans cette fonction, nous utilisons d'autres méthodes définies par le fichier d'en-tête SPL stm8s_adc1.h . Nous commençons par désinitialiser les broches ADC puis ADC1_Init () pour initialiser le périphérique ADC. La définition de cette fonction dans le manuel d'utilisation SPL est indiquée ci-dessous.
Ensuite, nous définissons le déclencheur externe à l'aide d'une minuterie et désactivons le déclencheur externe car nous ne l'utilisons pas ici. Et puis, nous avons l'alignement réglé à droite et les deux derniers paramètres sont utilisés pour définir le déclencheur de Schmitt, mais nous le désactiverons pour ce tutoriel. Donc, pour faire court, nous allons notre ADC fonctionner en mode de conversion continue sur la broche ADC requise avec le déclencheur externe et le déclencheur Schmitt désactivés. Vous pouvez consulter la fiche technique si vous avez besoin de plus d'informations sur l'utilisation du déclencheur externe ou de l'option de déclenchement Schmitt, nous n'en parlerons pas dans ce didacticiel.
Programme STM8S pour lire la tension analogique et l'affichage sur LCD
Le code complet utilisé dans le fichier main.c se trouve au bas de cette page. Après avoir ajouté les fichiers d'en-tête et les fichiers source requis, vous devriez être en mesure de compiler directement le fichier principal. L'explication du code dans le fichier principal est la suivante. Je n'expliquerai pas le programme LCD STM8S puisque nous en avons déjà discuté dans le tutoriel précédent.
Le but du code sera de lire les valeurs ADC à partir de deux broches et de les convertir en une valeur de tension. Nous afficherons également la valeur ADC et la valeur de tension sur l'écran LCD. J'ai donc utilisé une fonction appelée LCD_Print Var qui prend une variable au format entier et la convertit en caractère afin de l'afficher sur l'écran LCD. Nous avons utilisé les opérateurs simples de module (%) et de division (/) pour obtenir chaque chiffre de la variable et insérer des variables telles que d1, d2, d3 et d4 comme indiqué ci-dessous. Ensuite, nous pouvons utiliser la fonction LCD_Print_Char pour afficher ces caractères sur l'écran LCD.
void LCD_Print_Var (int var) {char d4, d3, d2, d1; d4 = var% 10 + '0'; d3 = (var / 10)% 10 + '0'; d2 = (var / 100)% 10 + '0'; d1 = (var / 1000) + '0'; Lcd_Print_Char (d1); Lcd_Print_Char (d2); Lcd_Print_Char (d3); Lcd_Print_Char (d4); }
Ensuite, sous la fonction principale, nous avons quatre variables déclarées. Deux d'entre eux sont utilisés pour enregistrer la valeur ADC (0 à 1024) et les deux autres sont utilisés pour obtenir la valeur de tension réelle.
unsigned int ADC_value_1 = 0; unsigned int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
Ensuite, nous devons préparer les broches GPIO et la configuration de l'horloge pour lire la tension analogique. Ici, nous allons lire la tension analogique des broches AIN2 et AIN6 qui sont respectivement les broches PC4 et PD6. Nous devons définir ces broches dans un état flottant comme indiqué ci-dessous. Nous activerons également le périphérique d'horloge pour ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ENABLE); // Activer l'horloge périphérique pour ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Maintenant que les broches sont prêtes, nous devons entrer dans la boucle while infinie pour lire la tension analogique. Puisque nous avons notre fichier d'en-tête, nous pouvons facilement lire la tension analogique des broches AIN2 et AIN 6 en utilisant les lignes ci-dessous.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
L'étape suivante consiste à convertir cette lecture ADC (0 à 1023) en une tension analogique. De cette façon, nous pouvons afficher la valeur de tension exacte donnée aux broches AIN2 et AIN6. Les formules pour calculer la tension analogique peuvent être données par:
Tension analogique = lecture ADC * (3300/1023)
Dans notre cas sur les contrôleurs STM8S103F3, nous avons un ADC avec une résolution de 10 bits, nous avons donc utilisé 1023 (2 ^ 10) . Également sur notre développement alimente le contrôleur avec 3,3 V qui est de 3300, nous avons donc divisé 3300 par 1023 dans les formules ci-dessus. Environ 3300/1023 nous donneront 3.226, donc sur notre programme, nous avons les lignes suivantes pour mesurer la tension ADC réelle en utilisant la tension ADC.
ADC_voltage_1 = ADC_value_1 * (3.226); // (3300/1023 = ~ 3.226) convertit la valeur ADC 1 en 0 en 3300mV ADC_voltage_2 = ADC_value_2 * (3.226); // convertir la valeur ADC 1 en 0 en 3300mV
La partie restante du code est uniquement utilisée pour afficher ces quatre valeurs sur l'écran LCD. Nous avons également un délai de 500 ms pour que l'écran LCD soit mis à jour toutes les 500 ms. Vous pouvez réduire cela davantage si vous avez besoin de mises à jour plus rapides.
Lecture de la tension analogique à partir de deux potentiomètres à l'aide du STM8S
Compilez le code et téléchargez-le sur votre carte de développement. Si vous obtenez une erreur de compilation, assurez-vous d'avoir ajouté tous les fichiers d'en-tête et les fichiers source comme indiqué précédemment. Une fois le code téléchargé, vous devriez voir un petit message de bienvenue disant «ADC on STM8S», puis vous devriez voir l'écran ci-dessous.
Les valeurs D1 et D2 indiquent la valeur ADC de la broche Ain2 et AIN6 respectivement. Sur le côté droit, nous avons également les valeurs de tension équivalentes affichées. Cette valeur doit être égale à la tension apparaissant respectivement sur les broches AIN2 et AIN6. Nous pouvons vérifier la même chose à l'aide d'un multimètre, nous pouvons également faire varier les potentiomètres pour vérifier si la valeur de tension change également en conséquence.
Le travail complet peut également être trouvé dans la vidéo ci-dessous. J'espère que vous avez apprécié le tutoriel et appris quelque chose d'utile, si vous avez des questions, laissez-les dans la section commentaires ci-dessous. Vous pouvez également utiliser nos forums pour lancer une discussion ou publier d'autres questions techniques.