Description
This application note explains the minimum hardware and software requirements for obtaining an angular position measurement from a Fredericks electrolytic tilt sensor.
Conception de base et excitation des capteurs
La figure 1 montre les principaux composants nécessaires pour créer une unité de mesure d'inclinaison fonctionnelle à l'aide d'un capteur d'inclinaison électrolytique.
Comme vous le verrez plus tard, il est important d'éviter le courant continu vers le capteur. Nous suggérons donc l'utilisation d'un amplificateur opérationnel à haute impédance d'entrée tel que le LMC6482 de Texas Instruments. Cela permettra de limiter les fuites de courant vers la terre et, par conséquent, le courant continu vers le capteur. La figure 2 montre l'équivalent en circuit d'un capteur d'inclinaison électrolytique à axe unique.
Continuons avec le signal d'excitation pour le capteur. Le signal d'excitation est fourni par le microprocesseur, le cas le plus simple étant celui d'un capteur à axe unique. Un capteur à axe unique nécessite deux ports de sortie du microprocesseur qui sont connectés aux broches extérieures du capteur. Les ports sont basculés avec un cycle de fonctionnement de 50% et une période comprise entre 200 et 1000 hertz. Voir la figure 3.
Une synchronisation précise dans le logiciel est nécessaire pour maintenir un rapport cyclique de 50% afin d'éviter une asymétrie dans le signal d'excitation du capteur. Voir la figure 4. L'asymétrie est définie comme un courant direct vers le capteur qui provoque une dérive et finalement des dommages permanents et irréversibles au capteur. Cela peut s'expliquer chimiquement ; le courant continu provoque une électrolyse, qui finit par rendre le capteur inerte.
Examinons le processus de création d'un signal d'excitation dans un logiciel pour un microprocesseur PIC18F utilisant le compilateur CCS PCW C. Ces instructions diffèrent considérablement selon le microprocesseur et le compilateur dont vous disposez. Nous commencerons par définir les broches qui seront utilisées pour la sortie. Nous utiliserons PORTB pour la sortie, nous devrons donc le définir comme tel. Pour ce faire, nous définissons le registre de direction des données de 8 bits, appelé TRISB. Les bits de TRISB mis à 0 définiront la broche PORTB correspondante comme une sortie, nous utiliserons donc la ligne de code suivante pour utiliser toutes les broches PORTB pour la sortie :
set_tris_b(0b00000000) ; |
Afin de modifier rapidement les valeurs des broches PORTB, nous devrons y accéder en mémoire. Sur ce microprocesseur particulier, PORTB est un registre de fonctions spéciales (SFR) qui se trouve à l'adresse mémoire 0xf81. Nous allons donc stocker l'emplacement de PORTB dans une variable pour permettre un accès facile. Ceci est réalisé à l'aide de la ligne de code suivante :
#byte port_b = 0xf81 ; |
Chaque bit de port_b correspond maintenant à une broche de la puce. Le bit le plus significatif est la broche B8 et le bit le moins significatif est la broche B0. Supposons qu'un capteur à axe unique soit connecté aux broches B0 et B1. Voir la figure 3. Si vous utilisez un capteur à deux axes, supposons qu'il soit connecté aux broches B0, B1, B2 et B3.
Pour un capteur à axe unique, il y a deux états pour le signal d'excitation. Voir la figure 4. Pour imiter ce diagramme de synchronisation, les deux états peuvent être stockés dans un tableau de nombres de 8 bits. Ceci est réalisé avec la ligne de code suivante :
int8 output_arr[2] = { 0b00000010, 0b00000001 }; |
Pour un capteur à deux axes, il y a quatre états pour le signal d'excitation. Voir la figure 5. Pour imiter ce diagramme de synchronisation, les quatre états peuvent être stockés dans un tableau de nombres de 8 bits. Ceci est réalisé avec la ligne de code suivante :
int8 output_arr[4] = { 0b00000011, 0b00001100, 0b00001010, 0b00000101 }; |
Les minuteries sont un outil couramment utilisé pour générer des interruptions à intervalles précis dans les logiciels et elles peuvent être utilisées pour générer facilement un signal d'excitation. Il est important que nous utilisions une interruption de haute priorité afin que le signal d'excitation maintienne un cycle d'utilisation de 50%. Le code suivant crée une interruption de haute priorité qui fait basculer les ports pour générer un signal d'excitation pour un capteur à deux axes :
int isr_counter = 0; #int_timer1 HIGH void timer1_isr(void) { set_timer1(64535); port_b = output_arr[ (isr_counter++) % 4]; // this is for a dual axis sensor } |
Dans cet exemple, le timer1 est un compteur de 16 bits (0 à 65535). Cela signifie qu'il va compter à partir de la valeur définie par set_timer() et lorsqu'il déborde (atteint 65535), une interruption sera générée et le code de la fonction timer1_isr() sera exécuté. Le temps nécessaire au débordement est défini par divers facteurs, notamment la vitesse de l'horloge du microprocesseur et les paramètres de configuration de la fonction timer1, entre autres. Il est important de maintenir un temps d'interruption compris entre 1 et 5 millisecondes pour assurer une bonne excitation du capteur. Reportez-vous au manuel de votre microprocesseur individuel pour obtenir ces informations.
Le basculement de port fonctionne en utilisant la fonction de module. Chaque fois qu'une interruption est générée, isr_counter est incrémenté et le module 4 est exécuté sur celle-ci. Cela donne essentiellement un compteur qui compte de 0 à 3, s'incrémentant à chaque interruption. Cela permet d'accéder à chacun des quatre états stockés dans output_arr qui constituent le signal d'excitation.
Sortie du capteur
Maintenant que nous avons créé un signal d'excitation, examinons la sortie du capteur. La sortie est une tension analogique référencée à la tension d'excitation. La sortie doit être lue en phase avec le signal d'excitation. Il est suggéré de prendre plusieurs échantillons pendant chacun des quatre états (deux états pour un capteur à axe unique).
La forme d'onde de la figure 6 montre un exemple de sortie du convertisseur analogique-numérique connecté à la sortie d'un capteur à deux axes. Cette sortie particulière indique un angle d'inclinaison positif pour l'axe x et l'axe y. Voir la figure 7 pour une sortie indiquant un angle d'inclinaison négatif.
Pour lire le résultat, nous devrons utiliser le convertisseur analogique-numérique (CAN) du microprocesseur. Comme le montre la figure 3, nous devons configurer la broche A0 comme entrée ADC, puis régler le port ADC actuel sur la broche A0. Nous pouvons alors exécuter le code suivant pour lire la sortie d'un capteur à deux axes en phase avec le signal d'excitation :
int samples = 0; int index = 0; int xpos[8], xneg[8], ypos[8], yneg[8] = {0,0,0,0,0,0,0,0}; while(true) { while( (isr_counter % 4) != 0 ); while( (isr_counter % 4) == 0 ) { // loop to read x positive state delay_us(100); if(index <= 7) xpos[index] = Read_ADC(); index++; } index = 0; while( (isr_counter % 4) != 1 ); while( (isr_counter % 4) == 1 ) { // loop to read x negative state delay_us(100); if(index <= 7) xneg[index] = Read_ADC(); index++; } index = 0; while( (isr_counter % 4) != 2 ); while( (isr_counter % 4) == 2 ) { // loop to read y positive state delay_us(100); if(index <= 7) ypos[index] = Read_ADC(); index++; } index = 0; while( (isr_counter % 4) != 3 ); while( (isr_counter % 4) == 3 ) { // loop to read y negative state delay_us(100); if(index <= 7) yneg[index] = Read_ADC(); index++; } index = 0; // data processing and analysis would then be done here } |
Comme vous pouvez le voir, dans chaque état du signal d'excitation, nous recueillons 8 échantillons avec un délai de 0,1 ms entre les échantillons. Ces échantillons peuvent ensuite être moyennés dans le code d'analyse des données pour fournir un résultat plus stable et plus précis. En référençant le isr_counter, nous pouvons nous assurer que les lectures sont prises en phase avec le signal d'excitation.
Déterminer l'angle d'inclinaison
L'angle d'inclinaison du capteur peut être calculé en comparant la différence entre les tensions pour chaque état d'excitation :
Inclinaison de l'axe X = (X+) - (X-)
Inclinaison de l'axe Y = (Y+) - (Y-)
Disons que nous avons un convertisseur analogique-numérique de 16 bits (0 à 65535 points) qui lit la sortie d'un capteur à deux axes de ±20°. Cela signifie que notre plage de sortie est de ±65535 points en utilisant les définitions de l'inclinaison des axes X et Y ci-dessus. Examinons la sortie suivante pour un cycle :
X+ = 45535
X- = 20000
Y+ = 30000
Y- = 35535
Nous pouvons alors conclure ce qui suit :
Inclinaison de l'axe X = +25535
Inclinaison de l'axe Y = -5535
Maintenant, il faut convertir cela en une mesure d'angle :
±65535 comptes = 131070 comptes
±20° = 40° de portée
131070 points / 40° = ~3277 points/°
25535 points / (3277 points/°) = ~+7,79° x inclinaison de l'axe
-5535 points / (3277 points/°) = ~-1,69° inclinaison de l'axe des y
Considérations mécaniques lors de la détermination de l'angle d'inclinaison
Tous les capteurs ont des tolérances mécaniques et leurs spécifications de fonctionnement n'indiquent souvent qu'une partie de leur portée totale. De plus, le calcul ci-dessus suppose une sortie linéaire, symétrique et centrée du capteur, ce qui n'est généralement pas le cas. Il est donc important de caractériser le type spécifique de capteur que vous utilisez dans votre application afin d'en déduire la position d'inclinaison réelle.
Considérons par exemple un capteur électrolytique à axe unique de ±25°. La figure 8 montre la fonctionnalité mécanique de ce capteur d'inclinaison :
Disons que cette fois, nous avons un convertisseur analogique-numérique de 12 bits (0 à 4095 points) qui lit la sortie du capteur. Cela signifie que notre plage de sortie est de ±4095 points en utilisant la définition de l'inclinaison de l'axe X dans la section précédente. Afin de caractériser individuellement le capteur, nous devons d'abord l'incliner à -25° et effectuer une lecture. Examinons la sortie suivante pour un cycle à une inclinaison de -25° :
X+ = 400
X- = 3700
Inclinaison de l'axe X à -25° = 400 - 3700 = -3300
Nous inclinons alors le capteur à +25° et prenons à nouveau une mesure. Examinons la sortie suivante pour un cycle à une inclinaison de +25° :
X+ = 3700
X- = 400
Inclinaison de l'axe X à +25° = 3700-400 = 3300
Nous pouvons alors faire les calculs suivants :
3300 - (-3300) = 6600 points
±25° = 50° de portée
6600 points / 50° = 132 points/°
Connaître le nombre de comptages par degré vous permet de convertir facilement une lecture du convertisseur analogique-numérique en une position angulaire. Une compensation supplémentaire pour la linéarité, la symétrie et la position zéro augmentera considérablement la précision des calculs angulaires.
Considérations sur les logiciels
Comme pour tous les logiciels, il existe de nombreuses façons différentes d'atteindre le même objectif. Ce document présente simplement un exemple de la façon dont le conditionnement électrolytique du signal d'un capteur d'inclinaison peut être réalisé grâce à l'utilisation d'un microprocesseur et d'un compilateur spécifiques.