... rgl
Contrôle de position d'un servo
par commande ADC
Picaxe Application
(c) R.LEGAT |
SOMMAIRE:
01 - Contrôle d'un servo
02 - Taux de rafraîchissement
03 - Contrôle par ADC
04 - Equations mathématiques
05 - Codes
Nous allons analyser la procédure de contrôle d'un servo commandé par la rotation d'un potentiomère de positionnement.
Le servo passera ainsi d'une position minimale (Gauche) à maximale (Droite) lorsque le potentiomètre est déplacé d'une extrémité à l'autre.
D'une manière générale, on admet qu'un servo est piloté par un train d'impulsions espacéees de 20msec.
Ces impulsions, ont une valeur variant de 1msc à 2msec, pour une plage de rotation de l'ordre de 90°.
On peut aisément augmenter le débattement jusqu'à environ 180° en faisant varier les impulsions de 0,75 à 2,25 msec !
Nous allons d'ailleurs utiliser ces valeurs dans cet exposé.
La position médiane, appelée Neutre, restant fixée à 1,5 msec.
Brochage des servos usuels
Plus le taux de rafraîhissement du data servo sera élevé et plus le servo opposera une résistance de stabilité.
Il est communément admis que la période de rafraîchissement est typiquement de 20msec.
Mais d'où vient cette valeur de 20msec ?
Dans les émetteurs de radiocommande de type PWM un train de 8 impulsions (variant de 1 à 2msec) est envoyé vers le récepteur.
Chaque impulsion est séparée par un silence de 300µsec et le train complet est suivi d'un silence de synchronisation jusqu'à la prochaine période.
Si on fait un rapide calcul, on voit que si on transmet 8 impulsions de 2msec, séparées d'un silence de 300µsec et un silence final de synchro de plus de 2msec,
on arrive un rien au-dessus de 20msec.
Admettant qu'il sera improbable de transmettre 8 data de 2msec, une période de 20msec sera suffisante.
Pour ma part, j'ai généralement mesuré une valeur de 21msec sur mes émetteurs classiques de radiocommande utilisés en modélisme.
Contrôle par ADC (Analogic to Digital Converter) |
Le principe consiste à mesurer une tension, comprise entre 0 et 5V, avec un potentiomètre dont le curseur est branché sur l'entrée ADC de notre MicroContrôleur.
En mode 8 bits, le convertisseur ADC donnera alors des valeurs de 0 à 255 pour une mesure de 0 à 5V et quelle que soit la fréquence de travail du µC.
Finalement, les valeurs à transmettre au servo devront valoir de 75 à 225 (0,75 msec à 2,25msec). |
|
Nous constatons donc qu'il va falloir user d'un artifice mathématique pour convertir la plage 0/255 en 75/225 afin de disposer de toute la plage utile du potentiomètre et
en évitant d'occasionner des dégâts au servo qui forcerait au delà de ses butées.
En effet, à défaut de cette converson mathématique, les plages comprises avant 1,5V et après 4,5V ne sont pas exploitables car dangereuses pour le servo pour cause de débattement excessif.
Réponse de l'ADC sans traitement mathématique. Toute la plage du potentiomètre n'est pas exploitable et peut être dangereuse pour le servo
La réponse de notre système devra donc être conforme au tableau de ci-dessous pour pouvoir utiliser toute la plage de déplacement du potentiomètre:
En reportant ces valeurs dans un tableur Excel, l'équation répondant à nos critères est donnée par la droite de tendance:: y = 0,5882 + 75
Or, il se fait que 0,5882 correspond exactement à 150 / 255 ! càd la valeur du Neutre / ADC max.
Mais 0,5882 correspond aussi au ratio de :
0,5582 = (Data.Servo.Max - Data.Servo.Min) / (Max.ADC - Min.ADC) ' (225-75) / (255-0)
Et si la position Neutre était décalée (comme cela survient parfois sur les servos) il suffirait alors de juste agir sur la valeur d'offset, qui est égale à +75 (Neutre/2) dans le cas d'un servo «parfait».
Par analyse de la courbe de réponse on peut déduire diverses équations utiles :
ADC (8 bits) = Vin x 51
Data Servo Pos. = ((Max.Servo.Pos - Min.Servo.Pos) x ADC/255) + Min.Servo.Pos ' avec Max.Servo.Pos = 225 et Min.Servo.Pos = 75
Et la formule simplifiée devient : Data Servo Position = (ADC x 150/255) + 75 '75 = valeur de l'OffSet (Neutre/2)
Notons que 150/255 étant égal à 0,588235... on peut réduire ce coefficient à la valeur arrondie de 59/100
Il est sera donc aussi possible d'utiliser la formule suivante : Data Servo Position = (ADC x 59/100) + 75
Le tableau comparatif suivant démontre qu'il n'y a pas de différence de résultat.
En effet le µC Picaxe calculant en Mode Entier, il arrondit toujours les résultats en ignorant les décimales lors des divisions.
Une variable Word devra cependant toujours être utilisée pour le calcul.
ReadAdc POTAR, b0
b1= MAX_SERVO - MIN_SERVO * b0 / 255 + MIN_SERVO
Servo SERVO_PIN, b1
Les MIN_SERVO et MAX_SERVO peuvent être des constantes numériques (indiquées dans le code ou définies par des commandes SYMBOL) ou des valeurs
contenues dans des variables d'octet ou de mot.
Lorsque la plage complète du potentiomètre se situe entre MIN_POT et MAX_POT plutôt que 0 et 255, les calculs deviennent :
ReadAdc POTAR, b0
b1= MAX_POT - MIN_POT
b1= b0 Min MIN_POT - MIN_POT Max b1 * 255 / b1
b1= MAX_SERVO - MIN_SERVO * b1 /255 + MIN_SERVO
Servo SERVO_PIN, b1
Mais le code simplifié reste :
ReadAdc POTAR, b0
b1= b0 * 150/255 + OffSet ‘ normal OffSet = 75
Servo SERVO_PIN, b1
--------------------------------------------------------------------------------------------------------------