Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Créer un signal pour servo moteur avec ATMega16



  1. #1
    Dewep

    Question Créer un signal pour servo moteur avec ATMega16


    ------

    Bonjour,



    Etant en terminal, nous avons cette année un projet en SI à faire (PPE).
    Nous avons choisi comme sujet la commande d'une caméra à distance.

    Pour faire pivoter la caméra (sur l'axe x et l'axe y), nous utilisons deux servos moteurs.
    Nous savons comment les commander (signal inférieur à 20ms avec une période "haute" variant de 1 à 2 ms (cette variation permettant de savoir la position de la caméra)).
    Nous avons d'ailleurs réussis à commander un servo moteur via un GBF.

    Maintenant, pour commander la caméra, nous allons utiliser les 2 "boutons" de variations U1 et U2 (partie "Entrées" puis "U-VAR") de notre maquette ATMega16 (voir image de la "maquette" en pièce jointe).
    Etant donné qu'ils fournissent chacun un signal analogique, nous avons fait le programme via le microcontroller pour les convertir en signal numérique (en 0 et 1).
    Cependant maintenant, nous n'avons aucune idée de comment faire un signal permettant de commander le servo moteur via le microcontroller.

    Le prof nous a dit d'utiliser la fonction delay. Nous avons réussis à l'utiliser, mais cela ne nous dit pas grand chose sur comment générer le signal...

    Comment devons-nous procéder ?



    Merci d'avance.

    -----
    Images attachées Images attachées

  2. Publicité
  3. #2
    Qristoff
    Animateur Électronique

    Re : Créer un signal pour servo moteur avec ATMega16

    Bonsoir,
    Le plus simple est de convertir les tensions U1 et U2 en valeurs numériques en utilisant deux entrées ADC de l'Atmega puis envoyer cette valeur dans deux modules PWM de l'Atmega. Il faut juste prévoir un petit traitement entre l'ADC et le module PWM pour translater la pleine échelle de tension dans la gamme 1 à 2ms du PWM.
    Tout existe, il suffit de le trouver...!

  4. #3
    Dewep

    Re : Créer un signal pour servo moteur avec ATMega16

    Bonsoir,

    Citation Envoyé par Qristoff Voir le message
    Le plus simple est de convertir les tensions U1 et U2 en valeurs numériques en utilisant deux entrées ADC de l'Atmega
    Ca c'est ok si j'ai bien comprit ce que l'on a fait.
    C'est valeur, doit-elle être sous forme décimal ou binaire ?


    Citation Envoyé par Qristoff Voir le message
    [...] puis envoyer cette valeur dans deux modules PWM de l'Atmega. Il faut juste prévoir un petit traitement entre l'ADC et le module PWM pour translater la pleine échelle de tension dans la gamme 1 à 2ms du PWM.
    Et c'est ça que l'on arrive pas. On avait vu sur internet quelque chose de similaire, mais ce que cela donne du point de vue du code, on a un peu de mal.
    Pourrais-tu nous donner un petit exemple s'il te plait ?


    Merci.

  5. #4
    Qristoff
    Animateur Électronique

    Re : Créer un signal pour servo moteur avec ATMega16

    C'est valeur, doit-elle être sous forme décimal ou binaire ?
    L'ADC va fournir un code binaire sur 10 bits (pour l'Atmega 16), c'est à dire de 0 à 1023 en binaire. Ce qui sera l'image de la tension U (0-5V par exemple).
    Donc 0 correspondra à 0V et 1023 à 5V, pour faire simple.
    Ensuite il y a les modules PWM de l'atmega, où un registre définit la période du signal (dans ton cas, ce sera fixe à 20ms) puis un autre registre qui régle la largeur de l'état hau de l'impulsion.
    Donc il faut associer la valeur de sortie de ton ADC (0-1023) à la valeur de registre qui permet de régler la durée de l'état haut de ton signal.
    Il faudra donc convertir (une petite formule..) la valeur brute de l'ADC pour que 0 corresponde à une durée de 1,5ms et 1023 à une durée de 2,5ms.
    Tout existe, il suffit de le trouver...!

  6. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  7. #5
    Dewep

    Re : Créer un signal pour servo moteur avec ATMega16

    Citation Envoyé par Qristoff Voir le message
    L'ADC va fournir un code binaire sur 10 bits (pour l'Atmega 16), c'est à dire de 0 à 1023 en binaire.
    Ca ok, nous l'avions déjà fait. On avait d'ailleurs essayé que si U1 > 500 alors on allumait la lampe, et ça marchait.


    Citation Envoyé par Qristoff Voir le message
    Ce qui sera l'image de la tension U (0-5V par exemple).
    Donc 0 correspondra à 0V et 1023 à 5V, pour faire simple.
    Ok.


    Citation Envoyé par Qristoff Voir le message
    Ensuite il y a les modules PWM de l'atmega, où un registre définit la période du signal (dans ton cas, ce sera fixe à 20ms) puis un autre registre qui régle la largeur de l'état hau de l'impulsion.
    Donc il faut associer la valeur de sortie de ton ADC (0-1023) à la valeur de registre qui permet de régler la durée de l'état haut de ton signal.
    Tu n'aurais pas un lien donnant l'équivalence au niveau code s'il te plait ?
    Car pour le principe, je comprends, mais comment convertir cela en code C ?


    Citation Envoyé par Qristoff Voir le message
    Il faudra donc convertir (une petite formule..) la valeur brute de l'ADC pour que 0 corresponde à une durée de 1,5ms et 1023 à une durée de 2,5ms.
    Ca ok oui, pas de problème.
    Par contre, c'est pas plutôt 0 -> 1ms et 1023 -> 2ms ?

  8. A voir en vidéo sur Futura
  9. #6
    Qristoff
    Animateur Électronique

    Re : Créer un signal pour servo moteur avec ATMega16

    Salut,
    pour voir comment fonctionne le module PWM de ton Atmega, il va te falloir te plonger dans la datasheet au chapitre module PWM et quel registre il faut ajuster ! ça je ne peux pas le faire pour toi. De plus, je suis une bille en C et je ne pourrais pas t'être d'une grande aide.
    Tout existe, il suffit de le trouver...!

  10. Publicité
  11. #7
    Dewep

    Re : Créer un signal pour servo moteur avec ATMega16

    Bonjour,


    Nous avons eu PPE cette après-midi, et nous avons réussis à le faire fonctionner sans PWM.
    On a en fait créé le signal directement, du genre :

    Code:
    PORTB = PORTB | 0x01; // Force à 1
    delay_us(1500); // On attends 1,5ms pour la position du servo par exemple
    PORTB = PORTB & 0xFE; // Force à 0
    delay_us(16500); // On le fait patienter pour créer un signal de 18 ms

    Bon c'est un peu plus complet quand même (vu que ce sont des variables déjà), mais c'ets le principe.

    Sujet résolu donc.
    Merci Qristoff pour toutes tes réponses.

Discussions similaires

  1. Labyrinth electronique avec 2 servo moteur + pic basic 1s
    Par skizo42 dans le forum Électronique
    Réponses: 1
    Dernier message: 29/12/2010, 17h19
  2. Réponses: 12
    Dernier message: 13/08/2009, 21h08
  3. Génerer un signal logique pour Servo
    Par FoxDeltaSierra dans le forum Électronique
    Réponses: 2
    Dernier message: 07/04/2009, 16h56
  4. [Divers] pilotage servo-moteur avec batterie 12v
    Par EXTEENSE dans le forum Dépannage
    Réponses: 1
    Dernier message: 20/06/2008, 16h28
  5. pb avec doc servo moteur
    Par MeMyki dans le forum Électronique
    Réponses: 1
    Dernier message: 29/03/2004, 16h30
Découvrez nos comparatifs produits sur l'informatique et les technologies.