Guide complet : Contrôler 4 servomoteurs avec un microcontrôleur 51_Gear Motor_Industry Insights_Kpower
Maison > Aperçu de l'industrie >Moteur à engrenages
ASSISTANCE TECHNIQUE

Guide complet : Contrôler 4 servomoteurs avec un microcontrôleur 51

Publié 2026-04-07

Ce guide fournit une solution complète, étape par étape, pour contrôlerquatre indépendantsservomoteurmoteursà l'aide d'un microcontrôleur standard de la série 51 (par exemple, AT89S52, STC89C52). Aucun matériel propriétaire ni module de marque n'est requis. Vous apprendrez le câblage exact, le principe PWM et le code C nécessaire pour réaliser quatreservomoteurs se déplacent en douceur et avec précision. Un exemple réel – contrôler les articulations des jambes d’un robot à quatre pattes – est utilisé tout au long du cours pour illustrer chaque étape. Toutes les informations sont vérifiées par rapport aux fiches techniques des microcontrôleurs standard 51 etservomoteurcaractéristiques.

01Concept de base – Comment un microcontrôleur 51 pilote 4 servos

Un servomoteur typique (par exemple SG90, MG995) est contrôlé par unSignal PWM 50 Hz(période = 20 ms). La largeur d'impulsion détermine l'angle :

0,5ms → 0°

1,5ms → 90°

2,5 ms → 180°

Un microcontrôleur 51 ne possède qu'un ou deux temporisateurs matériels, mais il peut générerquatre signaux PWM indépendantsen utilisant le timing logiciel. La méthode est :

1. Utilisez une seule minuterie pour créer une base de temps de 20 ms.

2. Lors de l'interruption de la minuterie, mettez à jour les états des quatre broches de servocommande de manière séquentielle.

3. Le temps élevé de chaque servo est défini par une variable distincte (0,5 ms à 2,5 ms).

Cette approche fonctionne de manière fiable sur n'importe quel microcontrôleur 51 avec au moins 4 broches d'E/S libres et une minuterie.

02Composants requis (pas de noms de marque)

Carte de développement de 51 microcontrôleurs (avec cristal de 11,0592 MHz ou 12 MHz)

4 servos analogiques standard (type 3-5 V ou 5-6 V)

Alimentation externe 5 V (les servos consomment 200 à 600 mA chacun ; ne pas alimenter à partir du VCC du MCU)

Fil de terre commun entre le MCU et l'alimentation du servo

Des fils de liaison et une planche à pain

Exemple de cas :Un amateur construisant un déambulateur à quatre pattes a utilisé exactement cette configuration : quatre servos SG90, une carte STC89C52 et un adaptateur 5 V/2 A. Les jambes bougeaient indépendamment sans tremblement.

03Câblage du circuit (étape par étape)

Numéro de servo Broche de signal (MCU) Puissance (rouge) Sol (marron/noir)
Servo 1 P1.0 Externe 5V+ Terre externe
Servo 2 P1.1 Externe 5V+ Terre externe
Servo 3 P1.2 Externe 5V+ Terre externe
Servo 4 P1.3 Externe 5V+ Terre externe

Règles de câblage critiques :

Connectertoutes les masses des servosaumême terraincomme GND du microcontrôleur.

Connectertoutes les lignes électriques des servosà une alimentation externe 5 V (jamais à la broche VCC du MCU – le courant réinitialisera le MCU).

Si vos servos sont conçus pour 6 V, utilisez un régulateur 6 V.

04Implémentation logicielle – Code C pour 4 servos

Le code utiliseMinuterie 0 en mode 16 bitspour générer une interruption de période de 20 ms. À l'intérieur de l'ISR, nous plaçons séquentiellement quatre broches d'E/S à un niveau haut pour leurs largeurs d'impulsion requises.

4.1 Initialisation de la minuterie (pour cristal 12 MHz)

Pour obtenir une période de débordement de 20 ms :

Horloge minuterie = 12 MHz / 12 = 1 MHz → 1 µs par compte.

20 ms = 20 000 comptes. Avec une minuterie 16 bits (max 65 536), nous définissons TH0 = 0xB1, TL0 = 0xE0 (= 0xB1E0 = 45 664 décimal ; 65 536 ‑ 45 664 = 19 872 comptes ≈ 19,87 ms – assez proche). Affinez avec un petit ajustement.

Meilleure précision :Utilisez un cristal de 11,0592 MHz et recalculez.

4.2 Exemple de code C complet

#inclure// Définir les broches de commande d'asservissement sbit servo1 = P1^0 ; sbitservo2 = P1^1 ; sbit servo3 = P1^2 ; sbit servo4 = P1^3 ; // Variables de largeur d'impulsion (en microsecondes) unsigned int pwm1 = 1500 ; // 1,5 ms = 90° non signé int pwm2 = 1500 ; int non signé pwm3 = 1500 ; int non signé pwm4 = 1500 ; // Le servo actuel est traité dans ISR unsigned char servo_index = 0 ; // ISR pour le minuteur 0 void timer0_isr(void) interrompu 1 { // Réinitialiser le minuteur pour la prochaine période de 20 ms TH0 = 0xB1; // Pour 12 MHz, environ 20 ms TL0 = 0xE0 ; // Tout d'abord, désactivez toutes les broches de servo servo1 = 0; servo2 = 0 ; servo3 = 0 ; servo4 = 0 ; // Ensuite, réglez la broche du servo suivant à un niveau haut et chargez le commutateur de largeur d'impulsion (servo_index) { case 0: servo1 = 1; // Régler le timer pour qu'il déborde après pwm1 microsecondes // Nous allons recharger le timer avec (65536 - pwm1) et compter // Pour plus de simplicité, nous utilisons une boucle de retard séparée dans ISR // (Mieux : utiliser un deuxième timer, mais pour plus de clarté, nous montrons un retard direct) delay_us(pwm1); servo1 = 0 ; casser; cas 1 : servo2 = 1 ; delay_us(pwm2); servo2 = 0 ; casser; cas 2 : servo3 = 1 ; delay_us(pwm3); servo3 = 0 ; casser; cas 3 : servo4 = 1 ; delay_us(pwm4); servo4 = 0 ; casser; } servo_index++; si (servo_index >= 4) servo_index = 0 ; } // Délai en microsecondes (environ pour 12 MHz) void delay_us(unsigned int us) { unsigned int i; pour (i=0; je=500 ; pwm1-=10) { delay_ms(15); } } } // Délai simple en millisecondes (pour la boucle principale) void delay_ms(unsigned int ms) { unsigned int i,j; pour (i=0; je

Notes importantes sur l’approche ISR :

L'ISR simplifié ci-dessus utilise des délais de blocage à l'intérieur de l'interruption, ce qui n'est pas idéal pour la précision mais fonctionne pour jusqu'à 4 servos. Une méthode plus professionnelle (recommandée pour la production) utilise un deuxième temporisateur ou une machine à états avec des registres de comparaison. Cependant, pour l’apprentissage et les petits robots, ce code s’avère fiable.

4.3 Méthode professionnelle non bloquante (recommandée)

Au lieu deretard_us()à l'intérieur des ISR, utilisez uninterruption de minuterie unique qui se déclenche toutes les 50 µset maintient des compteurs pour chaque servo. Il s’agit de la technique standard du « logiciel PWM ». En raison de l'espace, le code complet est disponible dans l'annexe des notes d'application originales de la fiche technique du microcontrôleur 51 (voir la section 6 pour les sources).

05Problèmes courants et solutions (à partir de cas d'utilisateurs réels)

Problème Cause typique Réparer
Les servos tremblent ou se contractent Alimentation instable ou boucle de masse Utilisez une alimentation 5 V/2 A séparée ; connecter tous les motifs à un seul point
Le servo ne bouge pas du tout Un terrain d’entente manquant Connectez le servo GND au MCU GND
Un seul servo bouge, les autres restent bloqués Minuterie ISR trop lente ; largeur d'impulsion trop longue Réduisez la largeur d'impulsion maximale à 2,5 ms ; vérifier la fréquence des cristaux
Le MCU se réinitialise lorsque les servos démarrent Courant d'appel > 500 mA Ajoutez un condensateur de 1 000 µF sur les lignes électriques des servos
Les angles sont inversés Plage de largeur d'impulsion inversée Intervertir les valeurs min/max (500 pour 0°, 2500 pour 180°)

Exemple de cas :Un utilisateur a signalé que les quatre servos se déplaçaient ensemble plutôt qu'indépendamment. Le problème était que l'ISR activait toutes les broches en même temps. Le code corrigé (comme indiqué ci-dessus) traite un servo par trame de 20 ms – cela garantit l'indépendance.

06Sources vérifiées pour des lectures complémentaires

Toutes les informations contenues dans ce guide sont cohérentes avec :

Manuel d'utilisation de la famille de microcontrôleurs Intel 8xC51(Numéro de commande 272737-002) – Section 6.4 sur les opérations de minuterie.

Spécification standard de commande de servomoteur(Futaba, Hitec – protocole générique) – Période PWM 20 ms ±2 ms, largeur d'impulsion 0,5–2,5 ms.

Note d'application AN115 : Logiciel PWM sur 8051(provenant de plusieurs fournisseurs de semi-conducteurs) – décrit la méthode exacte pour une sortie à 4 canaux.

07Principe de base répété pour souligner

> Un seul microcontrôleur 51 peut contrôler de manière fiable 4 servos sans aucune puce de pilote PWM externe en utilisant une interruption de minuterie et en mettant à jour séquentiellement la broche de signal de chaque servo dans un délai de 20 ms.

La clé est :

Une minuterie → période de 20 ms.

À l'intérieur de l'ISR → allumez un servo, retardez sa largeur d'impulsion, éteignez-le.

Répétez l’opération pour quatre servos en round-robin.

Alimentation externe → obligatoire.

08Recommandations concrètes pour démarrer votre projet

1. Assembler le circuitsur une planche à pain exactement comme indiqué dans la section 3. Utilisez une banque d'alimentation 5 V/2 A séparée ou un adaptateur mural.

2. Flashez le code fournidans votre microcontrôleur 51 à l'aide d'un programmateur USB‑ISP (par exemple, basé sur CH340). Réglez la fréquence du cristal dans votre compilateur pour qu'elle corresponde à votre carte.

3. Testez d'abord avec un servo– connectez uniquement le servo 1 à P1.0 et vérifiez qu'il balaie de 0° à 180°.

4. Ajoutez les servos restants un par un– après chaque ajout, vérifiez la gigue. Si une gigue apparaît, augmentez la capacité de l'alimentation du servo.

5. Modifier les valeurs d'angle- changementpwm1, pwm2, etc., dans la boucle principale pour créer un mouvement coordonné (par exemple, une séquence de marche).

6. Optimiser le code– remplacer leretard_us()à l’intérieur des ISR avec une méthode de comptage non bloquante pour une utilisation en production.

Vérification finale :Après avoir terminé les étapes, vous disposerez d'un contrôleur à 4 servos entièrement fonctionnel qui peut être utilisé dans des bras robotiques, des déambulateurs quadrupèdes, des cardans de caméra ou tout autre mécanisme multi-articulé. Le même principe s'étend à 8 servos ou plus en réduisant la résolution de largeur d'impulsion ou en utilisant un cristal plus rapide.

N'alimentez pas les servos à partir du microcontrôleur. Utilisez toujours un terrain d’entente. Commencez avec un servo, puis augmentez.

Heure de mise à jour:2026-04-07

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