Contrôle du signal PWM pour servomoteurs : un guide de programmation complet_Servo_Industry Insights_Kpower
Maison > Aperçu de l'industrie >Servomoteur
ASSISTANCE TECHNIQUE

Contrôle du signal PWM pour servomoteurs : un guide de programmation complet

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.

01Paramètres PWM de base pour le servocommande

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 %.

Angle d'asservissement souhaité Largeur d'impulsion Cycle de service (environ)
0° (minimum) 1,0 ms 5.0%
90° (neutre) 1,5 ms 7.5%
180° (maximum) 2,0 ms 10.0%

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.

02Programmation de la sortie PWM – étape par étape

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.

2.1 Configurer le périphérique PWM

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.

2.2 Convertir l'angle souhaité en valeur du rapport cyclique

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° :

舵机pwm控制源码_pwm控制舵机程序_pwm波控制舵机转动程序

pulse_width_ms = 1,0 + (45/180)1,0 = 1,25 ms

duty_value = (1,25/20)255 = 15,9375 → entier16

2.3 Écrire la valeur du devoir dans le registre PWM

// 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);

2.4 Étalonnage dans le monde réel (élimine la gigue)

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.

03Exemple de code complet (style Arduino, indépendant du matériel)

// 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); }

04Dépannage des problèmes courants de servo PWM

Problème Cause la plus probable Solution
Le servo ne bouge pas Mauvaise fréquence PWM (pas 50 Hz) Réglez la fréquence à exactement 50 Hz
Mouvement saccadé/contractuel Alimentation électrique insuffisante Utilisez une alimentation 5 V séparée (par exemple, 4 piles AA ou un régulateur 5 V/2 A)
Angles imprécis Les limites d'impulsion théoriques diffèrent du servo réel Effectuer l'étalonnage (étape 2.4) et utiliser les impulsions min/max mesurées
Le servo bourdonne mais ne tourne pas Résolution du cycle de service trop faible (Augmentez la résolution PWM à 10 bits ou 12 bits
Se déplace uniquement entre 0° et 90° Période de signal trop courte ou plage de largeur d'impulsion incompatible Vérifiez la période = 20 ms et que vous envoyez des impulsions entre 1,0 et 2,0 ms

05Recommandations concrètes pour un servocommande fiable

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

Alimenter l’avenir

Contactez le spécialiste des produits Kpower pour recommander un moteur ou une boîte de vitesses adapté à votre produit.

Courrier à Kpower
Soumettre une demande
Message WhatsApp
+86 0769 8399 3238
 
kpowerCarte