Publié 2026-04-04
Cet article fournit un guide complet et pratique pour écrire un programme contrôlant un standardservomoteurmoteur. Vous apprendrez la structure exacte du code, les paramètres critiques du signal PWM et comment implémenter un exemple fonctionnel à l'aide de microcontrôleurs courants. Aucune plate-forme propriétaire ou spécifique à la marque n'est requise ; les principes s’appliquent universellement.
UNservomoteurla position du moteur est déterminée uniquement par la largeur d’une impulsion répétitive (Pulse width Modulation, PWM).Pour écrire un programme de servocommande, vous devez générer un signal de 50 Hz (période = 20 millisecondes) et faire varier la largeur d'impulsion élevée entre 1,0 ms et 2,0 ms.Cette règle unique constitue le fondement de toute programmation d’asservissement standard.
Impulsion de 1,0 ms → 0 degré(à fond dans le sens inverse des aiguilles d'une montre)
Impulsion de 1,5 ms → 90 degrés(position centrale)
Impulsion de 2,0 ms → 180 degrés(à fond dans le sens des aiguilles d'une montre)
Pour suivre ce guide, préparez les composants suivants (descriptions génériques, pas de noms de marque) :
Un servomoteur standard 5 V (3 fils : alimentation, masse, signal)
Une carte microcontrôleur (n'importe quelle carte logique 5 V commune)
Une alimentation externe 5 V (si le servo consomme un courant élevé)
Des fils de liaison et une planche à pain
Avant tout code, établissez les connexions physiques :
Exemple de cas courant :Un débutant connecte souvent l’alimentation du servo directement à la broche 5 V du microcontrôleur. Lorsque le servo bouge, la carte se réinitialise en raison d'une surtension. La solution : utilisez une alimentation externe de 5 V (par exemple, 4 piles AA) avec une masse partagée.
Chaque programme d'asservissement doit d'abord configurer les paramètres du signal PWM. Vous trouverez ci-dessous une structure de code générique (adaptable à tout environnement de type C) :
// 1. Définir des constantes (ne pas modifier ces valeurs) #define SERVO_PIN 9 #define PWM_FREQUENCY_HZ 50 // 50 Hz = période de 20 ms #define PULSE_MIN_US 1000 // 1,0 ms pour 0° #define PULSE_MID_US 1500 // 1,5 ms pour 90° #define PULSE_MAX_US 2000 // 2,0 ms pour 180°// 2. Fonction de configuration (s'exécute une fois à la mise sous tension)void setup() { // Configure la broche comme sortie pinMode(SERVO_PIN, OUTPUT); // Configurer le matériel PWM pour une impulsion initiale de 50 Hz et 1,5 ms (position centrale) configurePWM(SERVO_PIN, PWM_FREQUENCY_HZ, PULSE_MID_US); retard (1000); // Laisser le servo se stabiliser }// 3. Assistant : Convertir l'angle (0-180) en largeur d'impulsion en microsecondesint angleToPulse(int angle) { // Mappage linéaire : angle 0 -> 1000us, angle 180 -> 2000us return PULSE_MIN_US + (angle(PULSE_MAX_US - PULSE_MIN_US) / 180) ; }
La logique principale qui déplace le servo vers un angle spécifique :
// Déplacez le servo à un angle donné (0 à 180) et maintenez cette positionvoid setServoAngle(int angle) { // Angle de serrage dans la plage valide if (angle 180) angle = 180 ; int pulseWidthUs = angleToPulse(angle);// Génère un seul cycle de 20 ms avec l'impulsion haute spécifiéegeneratePulse(SERVO_PIN, pulseWidthUs); // Élevé pour pulseWidthUs microsecondes delayMicroseconds(pulseWidthUs); digitalWrite(SERVO_PIN,LOW); retard(20 - (pulseWidthUs / 1000.0)); // Reste de la période de 20 ms }
![]()
Note:LegénérerPulse()l'abstraction représente la manipulation directe du registre matériel. Dans des implémentations réelles, vous utiliseriez le périphérique PWM intégré du microcontrôleur ou une méthode logicielle de bit-banging.
Vous trouverez ci-dessous un programme complet qui balaie le servo de 0° à 180° et inversement, avec des délais pour observer le mouvement. Cet exemple utilise une approche bit-banging courante qui fonctionne sur n'importe quelle broche numérique.
// Code de travail complet (aucune bibliothèque requise, indépendante de la plate-forme) int servoPin = 9; non signé long précédentMicros = 0 ; int angle actuel = 0 ; int stepDirection = 1 ; // 1 = angle croissant, -1 = vide décroissant setup() { pinMode(servoPin, OUTPUT); // Commence à 90° (centre) currentAngle = 90; } void loop() { unsigned long currentMicros = micros(); // Actualise la position du servo toutes les 20 ms (50 Hz) if (currentMicros - previousMicros >= 20000) { previousMicros = currentMicros; // Envoie l'impulsion PWM pour l'angle actuel int pulseWidth = 1000 + (currentAngle 1000 / 180); // 1 000 us à 2 000 us digitalWrite (servoPin, HIGH ); delayMicroseconds(pulseWidth); digitalWrite (servoPin, FAIBLE); // Changer l'angle pour l'effet de balayage (facultatif) currentAngle += stepDirection; if (angleactuel >= 180) {angleactuel = 180 ; stepDirection = -1 ; retard (500); // Pause à l'extrême } else if (currentAngle
Exemple de cas courant :Un utilisateur écrit du code qui envoie des impulsions toutes les 5 ms au lieu de 20 ms. Le servo reçoit des signaux trop rapidement, surchauffe et vibre. La solution consiste à assurer exactement 20 ms entre le début de chaque impulsion.
Pour les projets qui doivent effectuer plusieurs tâches (par exemple, lire des capteurs tout en déplaçant le servo), utilisez une machine à états sansretard():
non signé long lastPulseTime = 0 ; int anglecible = 90 ; int currentPulseWidth = 1500 ; // commence au centre void updateServoNonBlocking() { unsigned long now = micros(); if (now - lastPulseTime >= 20000) { // 20 ms écoulés lastPulseTime = now ; // Calculer la largeur d'impulsion cible à partir de targetAngle int targetPulse = 1000 + (targetAngle * 1000/180); // Se déplace progressivement vers la cible (mouvement plus fluide) if (currentPulseWidth targetPulse) currentPulseWidth--; digitalWrite (servoPin, ÉLEVÉ); delayMicroseconds (currentPulseWidth); digitalWrite (servoPin, FAIBLE); } }
AppelupdateServoNonBlocking()à plusieurs reprises dans votre boucle principale.
1. La position du servo dépend exclusivement de la largeur d'impulsion élevée– 1,0 ms (0°), 1,5 ms (90°), 2,0 ms (180°). Rien d'autre ne change l'angle.
2. L'impulsion doit se répéter toutes les 20 ms (50 Hz)– Tout écart provoque une instabilité, une surchauffe ou l’absence de mouvement.
Commencez avec un programme de test minimalcela règle seulement le servo à 90 ° et tient. Vérifiez avec un rapporteur que la corne est au centre. Cela confirme que votre timing est correct avant d'ajouter des balayages ou une logique de capteur.
Utilisez un analyseur logique ou un oscilloscopepour mesurer le signal réel sur la broche de signal. Comparez la largeur d’impulsion mesurée aux valeurs prévues par votre code. Il s'agit de la méthode de débogage la plus fiable.
Utilisez toujours une alimentation séparéepour les servos qui consomment plus de 200 mA. Le partage de l'alimentation avec le microcontrôleur provoque des réinitialisations et un comportement erratique. Connectez tous les motifs ensemble.
Ajoutez un condensateur électrolytique de 100 à 470 µFentre les bornes d'alimentation et de masse du servo à proximité du servo. Cela réduit le bruit électrique et stabilise le signal de commande.
Documentez vos constantes de synchronisation d'impulsionen microsecondes directement dans le code. Cela est utile lorsque vous revisitez le projet des mois plus tard.
En suivant ce guide, vous pouvez écrire un programme de servocommande fiable sur n'importe quelle plate-forme de microcontrôleur sans avoir recours à des bibliothèques prédéfinies. Le principe de base du PWM reste identique dans tous les systèmes. Implémentez l'exemple non bloquant pour les applications en temps réel et validez toujours vos largeurs d'impulsion avec des outils de mesure.
Heure de mise à jour:2026-04-04
Contactez le spécialiste des produits Kpower pour recommander un moteur ou une boîte de vitesses adapté à votre produit.