Basse résolution

This commit is contained in:
Samuel 2025-08-10 20:58:22 +02:00
parent a43131639a
commit 18fa86c539
4 changed files with 48 additions and 2 deletions

View File

@ -7,3 +7,41 @@ En faisant varier la consigne de position de -512 à 5120, nous observons des bu
Voici le graphique obtenu à partir du comportement du servomoteur.
![](/doc/ModeServo_normal.png)
Suppression des butées
-----------------------
En faisant varier la consigne de position de -512 à 5120, nous observons l'absence de butées logicielles.
Voici le graphique obtenu à partir du comportement du servomoteur.
![](/doc/ModeServo_SansButée.png)
Seulement, en poussant le servomoteur un peu plus loin, nous observons que le multitour est limité. Lorsqu'il doit faire son 8e tour (ou presque), le servomoteur part dans l'autre sens à toute vitesse. Un tour correspond à 4096 points de codeurs et la position est enregistrée sur 16 bits, donc avec une limite vers 32700 (en positif ou en négatif).
Nous remarquons que la valeur de la position du servo est toujours comprise entre 0 et 4095. Pas moyen de savoir combien de tours le servomoteur a fait.
Sur le graphique ci-dessous, nous voyons que le servomoteur (position en bleu) s'affole quand la consigne passe au dessus de 32000.
![](doc/ModeServo_rebouclage.png)
Note : Pour la butée logicielle haute, contrairement à ce qui est indiqué dans la documentation, des valeurs plus grandes que 4095 sont acceptées.
Retour de position qui correspond à la consigne
-----------------------------------------------
En passant le bit4 du registre 0x12 à 1, vous obtenez un retour de position du servomoteur qui n'est plus bloqué entre 0 et 4095. Mais attention, cette valeur n'est pas celle qui persistera à une coupure de courant. Si votre servo s'arrête à la position 6000, après une extinction, vous lire une position à 1904.
C'est donc une solution intéressante tant que vous avez un moyen de refaire le zéro à la mise sous tension.
Fonctionnement en mode Servo "Classique" - basse résolution
=========================================================
Un paramètre permet de baisser artificiellement la résolution du codeur. Ceci permet, en interrogeant le servo de savoir où il se trouve sur une position de 0 à 4095, d'avoir une réponse sur 2 ou 3 tour, en fonction de la valeur de 0x1E :
- 2 : ce sera sur 2 tours
- 3 : ce sera sur 3 tours
En théorie, ceci va de pair avec une perte en précision, qui est probablement négligeable.
Je ne comprends pas trop l'intérêt de ce mode. La valeur de position n'est pas persistante après une extinction...

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View File

@ -25,6 +25,7 @@ void setup() {
Serial.begin(115200);//sts舵机波特率1000000
Serial1.begin(1000000);//sts舵机波特率1000000
sms_sts.pSerial = &Serial1;
delay(5000);
}
@ -98,8 +99,15 @@ enum etat_t test_ping()
enum etat_t configure_servomoteur(){
sms_sts.ServoMode(SERVO_ID);
sms_sts.writeByte(SERVO_ID, 0x09, 0); // Butée min à 0
sms_sts.writeByte(SERVO_ID, 0x0A, 0); // Butée min à 0
sms_sts.writeByte(SERVO_ID, 0x0B, 0); // Buté max à 0, pour activer le multitour
sms_sts.writeByte(SERVO_ID, 0x0C, 0); // Buté max à 0, pour activer le multitour
sms_sts.writeByte(SERVO_ID, 0x1E, 3);
sms_sts.writeByte(SERVO_ID, 0x12, 3); // Registre de "Phase"
sms_sts.writeByte(SERVO_ID, 0x12, 0x7C); // Registre de "Phase", valeur par défaut 108 (0x6C)
return TERMINE;
}
@ -116,7 +124,7 @@ enum etat_t mouvement_servomoteur(){
// On avance ou recule de d'un pas
position += pas_servo;
// si position > 5000 ou position < 0
if(position > 5000 || position < 0){
if(position > 20100 || position < 0){
pas_servo = -pas_servo;
}
sms_sts.WritePosEx(SERVO_ID, position, 4800);