Publié 2026-05-06
"La connaissance, c'est le pouvoir." -Francis Bacon.
Dans ce monde intégré, cette devise a une chair et un sang complètement nouveaux, c'est-à-dire qu'un timing précis est aussi un pouvoir.
Tard dans la nuit, un homme passionné de bras robotiques faisait face à l’écran. A ce moment-là, il découvrit que son servo tremblait comme un malade de Parkinson. À ce moment-là, il réalisa soudain que le code de contrôle n’était pas quelque chose de magique, mais en réalité mathématique.
je vais le chercher icikpuissance servomoteurPrenons un exemple pour analyser la logique sous-jacente du microcontrôleur 51 qui génère des signaux PWM, puis fournissez un squelette de code qui peut être directement transplanté.。
Tous les cas sont dérivés de situations courantes en laboratoire, telles que « mécanisme de direction bloqué », « dérive d'angle » et « saut à la mise sous tension » et d'autres défauts fréquents.
argument central: L'essence de la servocommande est la « sculpture temporelle » de la largeur d'impulsion.
Servo est un "paranoïaque du temps".
Il ne reconnaît qu'un seul langage, qui est une onde PWM d'une période de 20 ms, et son temps de haut niveau est compris entre 0,5 ms et 2,5 ms.。
chaîne de causalité:
Raison A : la fréquence de l'oscillateur à cristal dévie, ce qui entraîne un calcul incorrect de la valeur initiale de la minuterie, ce qui à son tour provoque l'accumulation de l'erreur de largeur d'impulsion, provoquant une déviation du positionnement de l'appareil à gouverner.
Raison B, l'imbrication des interruptions n'est pas traitée, la boucle principale interrompt la sortie PWM, la période d'impulsion devient de plus en plus courte et le servo émet un bip aigu.。
Un passionné a déjà utilisé un oscillateur à cristal de 12 MHz pour appliquer directement une valeur de minuterie de 11,0592 MHz. Ensuite, le servo a fait un « hochement de tête » à une fréquence de 15 Hz, comme pour se moquer du code parce qu'il avait été écrit trop hâtivement.
Demandez-vous la réponse: Pourquoi certaines personnes ne parviennent-elles pas à copier le code depuis Internet ?
Réponse d'eux-mêmes : la raison est que personne ne leur a dit que le cycle de la machine du microcontrôleur 51 est 12 fois supérieur au cycle de l'oscillateur à cristal et que le mode 1T de la série STC est 12 fois supérieur à la vitesse du 8051 traditionnel.。
L'expression mathématique de la modulation de largeur d'impulsion est la suivante (pseudocode) :
Temps de niveau haut (ms) = 0,5 + (angle/180)Valeur de rechargement de la minuterie 2,0 = 65536 - (largeur d'impulsion_us) / (12/cristal MHz)
La principale conclusion est qu’il n’existe pas de commande de l’appareil à gouverner calibrée sur une base de temps obsolète. C’est comme si on utilisait un ruban à mesurer pour mesurer le niveau de la mer. L’outil en lui-même est bien, mais le système de référence est un désastre.
Astuce : modulation de largeur d'impulsion
Ouvrez Keil, créez un nouveau projet et sélectionnez AT89C52.
C'est un cas de base très courant, et c'est aussi le point de départ pour 95% des débutants pour faire tourner tranquillement le servo pour la première fois.

Ligne de signal → P1.0
Ligne rouge → 5 V (alimentation indépendante ! Ne pas prendre l'alimentation de la carte de développement)
Ligne noire → GND
Structure du code(Divisé en quatre étapes selon le calendrier) :
1. Initialiser la minuterie: Mode 1 (16 bits), mode 12T.
2. Paramètres de calcul:
Période 20 ms → 20 000 us
Zéro degré Celsius correspond à 0,5 milliseconde. On peut voir que la précision de l'accumulation de 0,1 microseconde après une interruption de minuterie est trop inutile. Sur cette base, le comptage logiciel au sein d’une seule interruption temporisée doit être utilisé à la place.
3. Fonction d'interruption de service:
void Timer0_ISR() interruption 1 { compteur de caractères statiques non signés = 0 ; TH0 = 0xFC ; // Valeur de rechargement : interruption une fois toutes les 1 ms (oscillateur à cristal de 12 MHz) TL0 = 0x66 ; compteur++; si (compteur = 20) compteur = 0 ; }
Notez que la plage de valeurs de pulse_width_in_ms est comprise entre 0,5 et 2,5, mais dans le code, elle est multipliée par 10 et stockée sous forme d'entier.
4. La boucle principale modifie la largeur d'impulsion:
pulse_width_in_ms = 10 ; // 1,0 ms → 0 degré ? Non, il fait -45 degrés ! pulse_width_in_ms = 15 ; // 1,5 ms → médiane pulse_width_in_ms = 20 ; // 2,0 ms → 90 degrés
Dans le cas pertinent pour la vérification, lorsque pulse_width_in_ms est égal à 10, l'angle réel mesuré pointé par le bras d'asservissement est de -45°. Cet état d'angle est dû à la méthode de connexion commune, qui provoque le déplacement du point zéro. La raison pour laquelle un tel résultat montre que l'opération d'étalonnage doit être effectuée dans le sens opposé.
La demande d'aide a été envoyée par un ingénieur en automatisation d'usine avec le même code.kpuissance servomoteurC'est le même. Sur sa chaîne de production, le servo du poste 5 se bloque toujours.
Après trois heures d'enquête, nous avons découvert :
Questions/Réponses :Pourquoi le servo tourne-t-il follement dès qu'il est allumé ?
Réponse : Étant donné que le port P1.0 est haut lors de la réinitialisation, il doit être réglé sur bas lors de l'initialisation.
Questions/Réponses :Pourquoi ma correspondance d'angle est-elle inversée ?
Ce qui suit est : Vérifiez le sens d’installation du bras de servo. Pour de nombreuses marques de servos, 0 degré correspond à 0,5 ms. Cependant, la définition de certains servos de modèles d’avions est à l’opposé.。

Questions/Réponses :Que dois-je faire si le servo tremble après une chute de tension de la batterie ?
Réponse : En raison d'un courant insuffisant dû à une réduction de tension, un verrouillage en cas de sous-tension est défini lors de la configuration d'une alimentation indépendante et le seuil est réglé sur 4,8 V.
Questions/Réponses :Est-il possible qu'un microcontrôleur 51 contrôle 8 servos en même temps ?
Réponse : Ce n'est pas possible, car une interruption de minuterie distincte expirera, elle doit donc être remplacée par un module PCA ou actualisée en temps partagé.
La peur séduit. Si vous ignorez l'un des éléments ci-dessus, votre servo fumera à la 47e minute de débogage, et il s'agit du moment d'épuisement matériel le plus fréquent dans les statistiques de laboratoire.
Mot d'invite : base de temps
Contrôler un servo est une énumération ; contrôler huit servos est un algorithme.
Lorsque vous devez laisser le bras du robot tracer une trajectoire sinusoïdale, le contrôle linéaire de la largeur d'impulsion expose immédiatement ses faiblesses :
La vitesse angulaire de chaque joint présente un état discontinu, ce qui provoque un changement soudain de l'accélération de l'extrémité, provoquant finalement la transmission de vibrations mécaniques à la base.
argument causal:
Le microcontrôleur 51 n'a pas de matrice matérielle PWM, il doit donc utiliser la méthode « interrogation en temps partagé + interpolation de variables intermédiaires ».
Solution:
1. Divisez la grande période de 20 ms en N plages horaires (N = nombre de servos).
2. Une seule ligne de signal est élevée dans chaque créneau horaire et les autres restent basses.
3. Utilisez un tableau pour stocker la largeur d'impulsion de chaque servo et sortez-la séquentiellement dans l'interruption.
C'est comme si une éducatrice en maternelle distribuait des collations croustillantes et comestibles à de nombreux enfants, un par un et en alternance. Chaque fois qu’ils sont émis, cela ne dure qu’une très courte milliseconde. Bien que cela semble impitoyable et froid, cela a un effet efficace.
Exemple de transformation de code (logique de pseudocode) :
unsigned int pwm_val[8] = {10,15,20,12,18,9,14,16} ; caractère non signé current_servomoteur= 0 ; void Timer0_ISR() interruption 1 { // Désactive le signal d'asservissement précédent P1 &= 0xFE; // Effacer uniquement P1.0, le masque réel est requis // Charger le temps de niveau haut du servo actuel TH0 = (65536 - pwm_val[current_servo]100) >> 8; // Supposons que l'unité soit 0,1 ms TL0 = (65536 - pwm_val[current_servo]100) & 0xFF; // Active le signal d'asservissement actuel P1 |= (1
Le premier est un rappel clé. Quant à ce code, chaque fois qu'un servo-interrupteur se produit, la minuterie sera redémarrée. En conséquence, la période totale finale ne conserve plus la valeur initiale de 20 ms. Face à cette situation, il est nécessaire d’ajouter une logique temporelle supplémentaire.
Astuce : zone morte
Même s'ils proviennent du même lotkpuissanceLes servos, en raison des différences individuelles, feront également que 15 % des servos auront une différence statique de un à trois degrés.
Ce n'est pas un problème, c'est la tolérance de la physique.
En regardant l'histoire, dans les années 1980, les robots industriels utilisaient une méthode de rétroaction par potentiomètre, et le réglage de la zone morte selon cette méthode de rétroaction atteignait cinq degrés ; désormais, les servos à codeur magnétique peuvent déjà atteindre une précision de répétition de 0,1 degré. Cependant, la résolution PWM de huit bits du microcontrôleur 51, qui est du type à 256 niveaux, ne peut distinguer que des changements d'environ 0,7 degrés.
organisme d'évaluation des produitsÉtapes de réglage :
1. Utilisez une méthode d'étalonnage approximative, réglez la largeur d'impulsion médiane à 1,5 ms et écrivez-la, puis mesurez l'angle réel et enregistrez le décalage Δθ.
2. Compensation linéaire : dans la formule composée de l'angle et de la largeur d'impulsion, un terme de correction de décalage est ajouté. Ce terme de correction se présente sous la forme où la largeur d'impulsion est égale à la valeur de base plus le pas d'angle plus le décalage. La formule spécifique est : impulsion = base + anglestep + offset.
3. Éviter les zones mortes: Lorsque l'angle cible est différent de l'angle actuel
Exemple : Dans un projet de bras robotique sous-marin, les changements de température de l'eau de mer ont provoqué une dérive de la fréquence de l'oscillateur à cristal de ±0,1 %. Les ingénieurs se sont calibrés toutes les 10 minutes : en tournant le servo jusqu'à la position limite mécanique, en enregistrant la largeur d'impulsion correspondante et en corrigeant la base de temps dans des conditions dynamiques.
"La patience est la base de toute intelligence." - Platon.
Le secret ultime du contrôle du servo du microcontrôleur 51 ne réside pas dans les merveilleuses compétences affichées par le code, mais dans l'admiration de chaque microseconde.
Répétez les points clés:
PWM n'est pas une théorie complexe ;modulation de largeur d'impulsionLes contraintes mathématiques derrière ce mot-clé.
Stabilité de la base de temps > Élégance du code.
Lorsque vous rencontrez des conditions de gigue, de hurlement ou de dérive, vérifiez d'abord l'alimentation électrique, puis vérifiez l'interruption et enfin interrogez l'appareil à gouverner.
Suggestions d'actions(Le pied final de la spirale) :
1. Ce soir, j'utiliserai une maquette pour construire un seul circuit de test de servo.
2. À partir de dix degrés, avancez par étapes et utilisez un oscilloscope ou un analyseur logique pour enregistrer la largeur d'impulsion réelle correspondant à chaque angle.
3. Ajoutez une fonction de zone morte et un avertissement de surveillance de tension au code.
4. Utilisez votre microcontrôleur 51 comme « machine à graver le temps ». A chaque interruption, c'est le moment où le couteau graveur tombe.
Par une nuit d’automne, une brise fraîche traverse la fenêtre du laboratoire. À ce moment-là, une rangée d’ondes carrées soigneusement disposées affichées sur l’oscilloscope saute sur l’écran fluorescent. A cet instant, vous comprenez enfin que le contrôle n’est pas une conquête, mais une réconciliation avec le temps.
À ce moment, commencez à écrire votre premier code de servocommande pour le microcontrôleur 51. N'oubliez pas que pour chaque mouvement précis, vous remplissez votre promesse de microsecondes.
Heure de mise à jour:2026-05-06
Contactez le spécialiste des produits Kpower pour recommander un moteur ou une boîte de vitesses adapté à votre produit.