Comment écrire un programme de commande de servomoteur : un guide complet étape par étape_Custom Drive_Industry Insights_Kpower
Maison > Aperçu de l'industrie >Lecteur personnalisé
ASSISTANCE TECHNIQUE

Comment écrire un programme de commande de servomoteur : un guide complet étape par étape

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.

01Concept de base : la règle essentielle pourservomoteurContrôle

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)

02Ce dont vous avez besoin avant d'écrire le code

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

03Processus de rédaction de programme étape par étape

Étape 1 : Connectez correctement le matériel

Avant tout code, établissez les connexions physiques :

Fil de servo Connectez-vous à
Marron/Noir (sol) GND sur le microcontrôleur
Rouge (alimentation, 5 V) Sortie 5 V (ou masse commune d'alimentation externe 5 V)
Orange/Jaune (Signal) Une broche numérique compatible PWM (par exemple, broche 9)

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.

Étape 2 : Écrivez le code d'initialisation

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

Étape 3 : écrire la fonction de contrôle de base

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.

Étape 4 : Rédigez un exemple de travail complet

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

Étape 5 : Test et débogage des problèmes courants

Problème Cause la plus probable Méthode de vérification
Le servo ne bouge pas du tout Connexion à la terre manquante Utilisez un multimètre pour vérifier la continuité entre la masse du servo et la masse du microcontrôleur
Le servo tremble ou vibre La synchronisation des impulsions est incohérente Assurez-vous que votre délai entre les impulsions est exactement de 20 ms (tolérance de ± 1 ms)
Le servo se déplace uniquement vers les extrémités Plage de largeur d'impulsion incorrecte Mesurez la largeur d'impulsion réelle avec un oscilloscope ou un analyseur logique
Le servo se déplace à l'opposé de celui prévu Fils de signal et d'alimentation échangés Vérifiez les couleurs des fils par rapport à la fiche technique

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.

04Avancé : écriture d'un programme servo non bloquant

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.

05Résumé : les deux points critiques à répéter

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.

06Recommandations concrètes pour renforcer vos résultats

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

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