Table des matières:

Génération de signaux PWM haute résolution pour servos RC avec dispositifs STM32 : 3 étapes
Génération de signaux PWM haute résolution pour servos RC avec dispositifs STM32 : 3 étapes

Vidéo: Génération de signaux PWM haute résolution pour servos RC avec dispositifs STM32 : 3 étapes

Vidéo: Génération de signaux PWM haute résolution pour servos RC avec dispositifs STM32 : 3 étapes
Vidéo: Le Servomoteur Expliqué 2024, Juillet
Anonim
Génération de signaux PWM haute résolution pour servos RC avec dispositifs STM32
Génération de signaux PWM haute résolution pour servos RC avec dispositifs STM32
Génération de signaux PWM haute résolution pour servos RC avec dispositifs STM32
Génération de signaux PWM haute résolution pour servos RC avec dispositifs STM32
Génération de signaux PWM haute résolution pour servos RC avec dispositifs STM32
Génération de signaux PWM haute résolution pour servos RC avec dispositifs STM32

Actuellement, je construis un émetteur/récepteur RC basé sur la puce RF SX1280. L'un des objectifs du projet est que je veux une résolution de servo de 12 bits des bâtons jusqu'aux servos. En partie parce que les servos numériques modernes ont une résolution de 12 bits, deuxièmement, un émetteur haut de gamme utilise de toute façon 12 bits. J'étudiais comment générer des signaux PWM haute résolution sur des appareils STM32. J'utilise actuellement la pilule noire (STM32F103C8T8) pour le prototype.

Étape 1: Liste des pièces

Matériel

  • Toute carte de développement STM32F103 (pilule bleue, pilule noire, etc.)
  • Une banque d'alimentation USB comme alimentation
  • Programmeur STM32 (Segger j-links, ST-LINK/V2, ou simplement un clone st-link)

Logiciel

  • STM32CubeMX
  • Atollic TrueSTUDIO pour STM32
  • Source du projet depuis github

Étape 2: La solution évidente

La solution évidente
La solution évidente
La solution évidente
La solution évidente
La solution évidente
La solution évidente

La solution la plus simple consiste probablement à utiliser l'une des minuteries pouvant générer des signaux PWM, comme TIM1-3 sur un STM32F103. Pour un servo numérique moderne, la fréquence d'images peut descendre à environ 5 ms, mais pour un ancien servo analogique, elle devrait être de 20 ms ou 50 Hz. Donc, dans le pire des cas, générons cela. Avec une horloge de 72 MHz et une résolution de compteur de temporisateur de 16 bits, nous devons régler le pré-échelonneur du temporisateur au minimum à 23 afin de couvrir la fréquence d'images de 20 ms. J'ai sélectionné 24 car pendant 20 ms, je dois régler le compteur exactement sur 60000. Vous pouvez voir la configuration de CubeMX et les signaux PWM de 1 et 1,5 ms générés dans les captures d'écran. Malheureusement, pendant 1 ms, le compteur du timer devrait être réglé sur 3000, ce qui ne nous donnerait qu'une résolution de 11 bits. Pas mal, mais le but était de 12 bits, alors essayons autre chose.

Bien sûr, si je sélectionnais un microcontrôleur avec un compteur de temps 32 bits, comme le STM32L476, cette résolution peut être beaucoup plus élevée et le problème serait résolu.

Mais ici, je voudrais proposer une solution alternative qui augmentera encore la résolution même sur le STM32F103.

Étape 3: Minuteries en cascade pour une résolution plus élevée

Minuteries en cascade pour une résolution plus élevée
Minuteries en cascade pour une résolution plus élevée
Minuteries en cascade pour une résolution plus élevée
Minuteries en cascade pour une résolution plus élevée
Minuteries en cascade pour une résolution plus élevée
Minuteries en cascade pour une résolution plus élevée

Le principal problème avec la solution précédente est que la fréquence d'images (20 ms) est relativement élevée par rapport au signal PWM réellement généré (entre 1 et 2 ms), nous gaspillons donc des bits de valeur pour les 18 ms restants lorsque nous attendons l'image suivante. Cela peut être résolu en mettant en cascade des minuteries à l'aide de la fonction de liaison de minuterie pour la synchronisation.

L'idée est que j'utiliserai TIM1 comme maître pour générer la fréquence d'images (20 ms) et TIM2, TIM3 pour gérer les signaux PWM comme esclaves. Lorsque le maître déclenche les esclaves, ils ne génèrent qu'un signal PWM en un seul mode d'impulsion. Par conséquent, je n'ai besoin que de couvrir 2 ms dans ces minuteries. Heureusement, vous pouvez cascader ces temporisateurs dans le matériel afin que cette synchronisation ne nécessite aucune intervention du processeur et qu'elle soit également très précise, la gigue est dans la région ps. Vous pouvez voir la configuration de CubeMX sur les captures d'écran.

Comme vous pouvez le voir, j'ai sélectionné 3 comme précalaires, donc pour les 2 ms, je dois définir 48000 dans le compteur de la minuterie. Cela nous donne 24000 pour 1 ms, ce qui est en fait plus ce dont nous avons besoin pour une résolution de 14 bits. Tadaaaa…

Veuillez jeter un œil aux captures d'écran de l'oscilloscope dans l'introduction pour le résultat final. Le canal 3 (violet) est l'interruption de la minuterie principale qui déclenchera les salves pour générer une impulsion. Les canaux 1 et 4 (faisceau jaune et vert) sont les signaux PWM réels générés par différentes minuteries. Notez qu'ils sont synchronisés mais qu'ils sont synchronisés sur les bords arrière, c'est à cause du mode PWM 2. Ce n'est pas un problème, car le taux PWM pour le servo particulier est toujours correct.

Un autre avantage de cette solution est que changer la fréquence d'images signifierait changer la période dans TIM1 uniquement. Pour les servos numériques modernes, vous pouvez même descendre jusqu'à 200-300 Hz, mais veuillez consulter le manuel du servo si vous voulez affiner le réglage.

Conseillé: