- Composants requis
- Description de la broche du servomoteur
- Schéma
- Contrôle du servomoteur avec AVR ATmega16
- Programmation d'Atmega16 avec USBasp
Les servomoteurs sont largement utilisés là où un contrôle précis est nécessaire, comme les robots, les machines automatisées, le bras robotique, etc. Cependant, la portée du servomoteur n'est pas limitée à cela et peut être utilisé dans de nombreuses applications. Pour en savoir plus sur les bases, la théorie et le principe de fonctionnement du servomoteur, suivez le lien.
Nous avons précédemment interfacé le servomoteur avec de nombreux microcontrôleurs:
- Interfaçage du servomoteur avec ARM7-LPC2148
- Interfaçage du servomoteur avec le MSP430G2
- Interfaçage du servomoteur avec STM32F103C8
- Interfaçage du servomoteur avec le microcontrôleur PIC utilisant MPLAB et XC8
- Interfaçage du servomoteur avec Arduino Uno
- Interfaçage du servomoteur avec le microcontrôleur 8051
Dans ce didacticiel, nous allons interfacer le micro servomoteur avec le microcontrôleur Atmega16 AVR à l' aide d'Atmel Studio 7.0. Le servomoteur est conçu pour fonctionner en 4.8-6V. Nous pouvons contrôler son angle de rotation et sa direction en appliquant un train d'impulsions ou des signaux PWM. Notez que les servomoteurs ne peuvent pas bouger pour une rotation complète de 360 degrés, ils sont donc utilisés là où une rotation continue n'est pas nécessaire. L'angle de rotation est de 0 à 180 degrés ou de (-90) à (+90) degrés.
Composants requis
- Micro servomoteur SG90 Tower Pro
- CI microcontrôleur Atmega16
- Oscillateur à cristal 16Mhz
- Deux condensateurs 100nF
- Deux condensateurs 22pF
- Bouton poussoir
- Fils de cavalier
- Planche à pain
- USBASP v2.0
- Led (toute couleur)
Description de la broche du servomoteur
- Rouge = alimentation positive (4,8 V à 6 V)
- Marron = Terre
- Orange = Signal de contrôle (broche PWM)
Schéma
Connectez tous les composants comme indiqué dans le schéma ci-dessous pour faire tourner le servomoteur à l'aide du microcontrôleur AVR. Il y a quatre broches PWM, nous pouvons utiliser n'importe quelle broche PWM d'Atmega16. Dans ce tutoriel, nous utilisons la broche PD5 (OC1A) pour générer PWM. PD5 est directement connecté au fil orange du servomoteur qui est la broche de signal d'entrée. Connectez n'importe quelle LED de couleur pour l'indicateur d'alimentation. Connectez également un bouton-poussoir dans la broche de réinitialisation pour réinitialiser Atmega16 chaque fois que nécessaire. Connectez Atmega16 au circuit d'oscillateur à cristal approprié. Tout le système sera alimenté par une alimentation 5V.
La configuration complète ressemblera à ci-dessous:
Contrôle du servomoteur avec AVR ATmega16
Comme le moteur pas à pas, le servomoteur n'a besoin d'aucun pilote externe, par exemple le pilote de moteur ULN2003 ou L293D. Juste PWM suffit pour entraîner le servomoteur et il est très facile de générer du PWM à partir d'un microcontrôleur. Le couple de ce servomoteur est de 2,5 kg / cm, donc si vous avez besoin d'un couple plus important, ce servo ne convient pas.
Comme nous le savons, le servomoteur recherche une impulsion toutes les 20 ms et la longueur de l'impulsion positive déterminera l'angle de rotation du servomoteur.
La fréquence requise pour obtenir l'impulsion de 20 ms est de 50 Hz (f = 1 / T). Donc, pour ce servomoteur, la spécification dit que pour 0 degré, nous avons besoin de 0,388 ms, pour 90 degrés, nous avons besoin de 1,264 ms et pour 180 degrés, nous avons besoin d'une impulsion de 2,14 ms.
Pour générer des impulsions spécifiées, nous utiliserons Timer1 d'Atmega16. La fréquence du processeur est de 16Mz mais nous n'utiliserons que 1Mhz car nous n'avons pas beaucoup de périphériques connectés au microcontrôleur et il n'y a pas beaucoup de charge sur le microcontrôleur, donc 1Mhz fera le travail. Le Prescaler est réglé sur 1. Ainsi, l'horloge est divisée en 1Mhz / 1 = 1Mhz (1uS), ce qui est excellent. Timer1 sera utilisé comme mode PWM rapide, c'est-à-dire le mode 14. Vous pouvez utiliser différents modes de minuteries pour générer le train d'impulsions souhaité. La référence est donnée ci-dessous et vous pouvez trouver plus de description dans la fiche technique officielle de l'Atmega16.
Pour utiliser Timer1 comme mode PWM rapide, nous aurons besoin de la valeur TOP de ICR1 (Input Capture Register1). Pour trouver la valeur TOP, utilisez la formule ci-dessous:
f pwm = f cpu / nx (1 + TOP)
Cela peut être simplifié à, TOP = ( f cpu / ( f pwm xn)) - 1
Où, N = Valeur de l'ensemble de Prescaler
f cpu = fréquence du processeury
f pwm = largeur d'impulsion du servomoteur qui est de 50 Hz
Calculez maintenant la valeur ICR1 car nous avons toutes les valeurs requises, N = 1, f cpu = 1 MHz, f pwm = 50 Hz
Il suffit de mettre les valeurs dans la formule ci-dessus et nous obtiendrons
ICR1 = 1999
Cela signifie que pour atteindre le degré maximum, c'est-à-dire 180 0, l'ICR1 devrait être 1999.
Pour le cristal 16MHz et le Prescaler mis à 16, nous aurons
ICR1 = 4999
Passons maintenant à la discussion du croquis.
Programmation d'Atmega16 avec USBasp
Le code AVR complet pour contrôler le servomoteur est indiqué ci-dessous. Le code est simple et peut être compris facilement.
Ici, nous avons codé l'Atmega16 pour faire tourner le servomoteur de 0 0 à 180 0 et revenir de 180 0 à 0 0. Cette transition se terminera en 9 étapes soit 0 - 45 - 90 - 135 - 180 - 135 - 90 - 45 - 0. Pour le delay, nous utiliserons la bibliothèque interne d'Atmel Studio ie
Connectez votre USBASP v2.0 et suivez les instructions de ce lien pour programmer le microcontrôleur Atmega16 AVR en utilisant USBASP et Atmel Studio 7.0. Créez simplement le croquis et téléchargez-le à l'aide d'une chaîne d'outils externe.
Le code complet avec la vidéo de démonstration est donné ci-dessous. Apprenez-en également plus sur les servomoteurs en connaissant leur importance en robotique.