Publié 2026-04-02
Ce guide explique comment contrôler un standardservomoteurmoteur utilisant des signaux de modulation de largeur d’impulsion (PWM). Vous apprendrez les paramètres PWM exacts (période, largeur d'impulsion, rapport cyclique) nécessaires pour définir unservomoteurà n'importe quel angle de 0 à 180 degrés. Les instructions sont basées sur des plates-formes de microcontrôleurs largement disponibles et ont été vérifiées avec des outils analogiques et numériques courants de 50 Hz.servomoteurest utilisé dans la robotique de loisir. En suivant les exemples de code étape par étape et les méthodes d'étalonnage, vous pouvez positionner un servo de manière fiable, sans gigue ni dérive.
Un servomoteur standard attend un signal PWM avec les caractéristiques fixes suivantes :
Période de signal: 20 ms (millisecondes), ce qui équivaut à une fréquence de50 Hz.
Largeur d'impulsion (temps élevé): varie entre1,0 mset2,0 ms.
Cycle de service= (largeur d'impulsion / 20 ms) × 100 %.
Remarque : Certains servos peuvent accepter 0,5 ms à 2,5 ms pour une plage étendue, mais la norme 1,0 à 2,0 ms fonctionne pour presque tous les servos courants.
La structure de code suivante fonctionne sur n'importe quelle plate-forme fournissant un PWM matériel (par exemple, Arduino, STM32, ESP32, Raspberry Pi avec PWM matériel). Nous utilisons un pseudocode générique afin que vous puissiez l'adapter à votre microcontrôleur spécifique.
Choisissez une broche compatible PWM.
Réglez la fréquence PWM sur50 Hz(période = 20 ms).
Réglez la résolution sur au moins 8 bits (0 à 255) ou 16 bits pour un contrôle plus précis.
Pour un PWM 8 bits (0 = 0 % de service, 255 = 100 % de service) :
Cycle de service pour 1,0 ms = (1,0 / 20,0) × 255 = 12,75 → arrondir à13
Cycle de service pour 1,5 ms = (1,5 / 20,0) × 255 = 19,125 → arrondir à19
Cycle de service pour 2,0 ms = (2,0 / 20,0) × 255 = 25,5 → arrondir à26
Formule générale pour n'importe quel angle (0–180°) :
pulse_width_ms = 1,0 + (angle / 180,0)(2,0 - 1,0) duty_value = (pulse_width_ms / 20,0)(2^résolution - 1)
Exemple pour une résolution de 8 bits et 45° :
![]()
pulse_width_ms = 1,0 + (45/180)1,0 = 1,25 ms
duty_value = (1,25/20)255 = 15,9375 → entier16
// Pseudocode pwm_set_fréquence(PWM_PIN, 50); // 50 Hz pwm_set_resolution(PWM_PIN, 8); // Angle entier 8 bits = 90 ; // angle cible int duty = map(angle, 0, 180, 13, 26); // utilisant le devoir min/max précalculé pwm_write(PWM_PIN, duty);
Puisqu'il n'y a pas deux servos exactement identiques, mesurez toujours les limites réelles de largeur d'impulsion :
1. Écrivez une impulsion de 1,0 ms – observez la position du servo. S'il n'atteint pas la butée physique, augmentez la largeur d'impulsion par pas de 0,05 ms jusqu'à ce qu'il s'arrête (enregistrez commemon_pulse).
2. Écrivez une impulsion de 2,0 ms – trouvez de la même manière la largeur d'impulsion maximale qui donne une rotation complète (max_pulse).
3. Utilisez ces valeurs mesurées dans votre code au lieu des 1,0/2,0 ms théoriques.
Cas courant: Un micro servo Tower Pro SG90 typique requismin_pulse = 0,9 msetmax_pulse = 2,1 mspour une véritable plage de 0 à 180°. Calibrez toujours par modèle de servo.
// Contrôle d'asservissement utilisant PWM – aucune bibliothèque externe requise // Fonctionne sur n'importe quelle carte avec PWM matériel (par exemple, Uno, Nano, Mega, ESP32) const int servoPin = 9 ; // Broche PWM const int freq = 50 ; // Résolution constante int de 50 Hz = 8 ; // 8 bits (0-255) // Limites d'impulsions précalibrées (en microsecondes) const int minPulseUs = 1000 ; // 1,0 ms = 1 000 µs const int maxPulseUs = 2 000 ; // 2,0 ms = 2000 µs void setup() { // Configure PWM ledcSetup(0, freq, résolution); // canal 0 ledcAttachPin(servoPin, 0); } void setServoAngle(int angle) { // Contraindre l'angle à 0-180 angle = constrain(angle, 0, 180); // Convertit l'angle en largeur d'impulsion (microsecondes) int pulseUs = minPulseUs + (angle(maxPulseUs - minPulseUs)) / 180 ; // Convertit la largeur d'impulsion en rapport cyclique (0-255) int duty = (pulseUs255) / 20 000 ; // 20 000 µs = période de 20 ms ledcWrite(0, duty); } boucle vide() { setServoAngle(0); // passage à 0° delay(1000); setServoAngle(90); // passage à un délai de 90° (1000); setServoAngle(180); // passage à 180° delay(1000); }
1. Calibrez toujours chaque servo individuellement– même deux servos du même modèle peuvent avoir une variation de ±0,1 ms. Rédigez un croquis de test simple qui balaie de 0,5 ms à 2,5 ms et notez les largeurs d'impulsion exactes pour 0° et 180°.
2. Utilisez une alimentation séparée– n’alimentez jamais un servo directement à partir de la broche 5 V de votre microcontrôleur (les pointes de courant peuvent réinitialiser la carte). Une alimentation régulée 5 V/2 A ou 4 piles NiMH (4,8 V) fonctionnent de manière fiable.
3. Ajoutez un condensateur électrolytique de 100 à 470 µFaux bornes d’alimentation du servo à proximité du servo. Celui-ci absorbe les chutes de tension provoquées par les démarrages brusques du moteur.
4. Évitez les retards logicielspendant que le servo bouge. Utilisez un timing non bloquant (par exemple, des machines à états basées sur millis()) pour que votre programme puisse gérer d'autres tâches.
5. Pour les applications de haute précision (par exemple, bras robotiques), utilisez une minuterie PWM 16 bits et une interpolation linéaire entre les points calibrés. Pensez également à ajouter un potentiomètre de rétroaction analogique 10 bits pour fermer la boucle.
À retenir: Contrôler un servo avec PWM est simple une fois que vous avez fixé la fréquence à 50 Hz et mappé l'angle sur une largeur d'impulsion de 1,0 à 2,0 ms. Cependant, la fiabilité réelle dépend d'un étalonnage approprié, d'une puissance adéquate et de l'utilisation de limites mesurées plutôt que de valeurs théoriques. Appliquez la méthode d'étalonnage décrite dans la section 2.4 à chaque nouveau servo que vous intégrez, et vos projets obtiendront un mouvement fluide et précis à chaque fois.
Heure de mise à jour:2026-04-02
Contactez le spécialiste des produits Kpower pour recommander un moteur ou une boîte de vitesses adapté à votre produit.