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

Aide pour commander un servo moteur



  1. #1
    any_one

    Aide pour commander un servo moteur

    bonjour,
    je suis etudiant et debutant en langage assembleur, j 'ai besoin d'aide dans un projet . il faut ke je change la periode a 10ms( a la place de 83,3ns) et genere une impultion de 2ms pour ke le servomoteur tourne a droite une autre de 1ms pour tourner a gauche. est j sais pas cmmment manupuler les timer.
    pour vos sinformation: l'horloge interne du microcontroleur 12MHz


    merci

    -----


  2. Publicité
  3. #2
    JPL

    Générer une impulsion grâce à un microcontrôleur

    J'ai séparé ton message qui n'avait rien à faire dans la discussion où tu l'avais mis. J'ai changé le titre qui ne voulait rien dire. Enfin je te rappelle la charte du forum :

    Respectez les lecteurs du forum, n'écrivez pas vos messages en style SMS ou phonétique.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  4. #3
    HULK28

    Aide pour commander un servo moteur

    Bonjour,

    il faut d'abord donner un titre explicite à ta demande, "Help je m'ennuie" n'est pas approprié à ta requête...

    Ensuite évite le langage sms, ton clavier possède toutes les touches nécessaires à un texte intelligible et tu ne seras pas facturé plus cher.


    Pour ton problème, il faut déjà te documenter sur ce qu'est un timer.
    Le principe est le suivant:

    Un quartz ou une base de temps externe cadence les actions du µC à une vitesse fixe qui sera la fréquence d'oscillation (Fosc) de référence.
    Un µC possède en général un ou plusieurs Timers de 8 bits ou 16 bits.
    Dans le cas d'un timer 8 bits celui-ci déclaré en compteur va s'incrémenter au rythme de l'horloge de référence divisé par 4.

    Si tu prends le Timer0 par exemple (8bits) le compteur va démarrer de 0 s'incrémenter jusqu'à 255 et va repasser à 0.

    avec un timer 16 bits (Timer1) se sera 2^16 soit 65536.
    Soit Tmax(8bits)=4/Fosc*256 et Tmax(16 bits)=4/Fosc*65536
    Sur un PIC la fréquence de référence est Fosc/4 soit dans ton cas F=3MHz

    D'où Tmax(8bits)=85,3µs et Tmax(16bits)=21,8ms

    Lors du franchissement (on dit débordement) une interruption va se déclencher et mettre un "drapeau" (flag) à 1 pour signaler le débordement du compteur.
    Pour pouvoir détecter ce débordement il faut au préalable configurer les registres d'interruptions afin que le programme puisse se servir de cette information.
    Il faut donc activer le bit GIE (global interrupt enable) et PEIE (peripheral interrupt enable), puis l'interruptions qui nous interresse: T0IE (timer0 interrupt enable).
    Enfin nous devons surveiller T0IF (timer0 interrupt flag) qui passera à 1 à chaque débordement et que nous remettrons à 0 après l'avoir pris en compte dans la routine d'interruption.

    Maintenant pour générer le pulse nécessaire au fonctionnement d'un servo il faut faire 2 choses:

    1/ Créer une période de 20ms
    2/ Générer un pulse calibré selon la position que nous voulons donner au servo:

    1ms pour la direction vers la gauche.
    1,5ms pour la position centrale.
    2ms pour la direction à droite.

    Il nous faut donc pour générer la période une fenêtre de comptage de 20ms (50Hz).

    Comme le timer0 permet de compter au maximum un temps de 85,3µs nous sommes loin des 20ms nécessaire, donc nous utiliserons les 4 bits du prescaler qui permettent de diviser la fréquence de référence jusqu'à 256.

    Ce qui permet alors d'obtenir: T(tick)max(8bits)=1024*1/12MHz=85,3µs
    temps qui incrémentera notre compteur.

    Soit cette fois un temps max de 85,3µs*256=21,8ms donc > au 20ms requise.

    La suite bientôt (après l'apéro).
    Tout est bien qui finit.

  5. #4
    mister_e

    Re : Aide pour commander un servo moteur

    Bonjour,
    Pour faciliter les calculs associé au Timers des PIC, j'ai créée un petit utilitaire qui s'appelle PICMultiCalc. Je vous invite à le télécharger sur mon site ici . Tout à fait gratuit et fort utile. Notez bien qu'il fait plus que les Timers.

    Aurevoir.
    Steve

  6. #5
    any_one

    Re : Aide pour commander un servo moteur

    merci beaucoup pour les rensegenments que vous venez de me dire car j'ai un manque d'information dans ce domaine et surtou la documentation sur les timers.
    pour moi c'est difficile de diviser lafrequance de 12MHz, j'ai reussi a metre le le registre TMOD pour utiliser le tomporisateur 0 sur 16 bits.mais pour charger le TH0 et le TL0 je ne sais pas la ethode pour calculer les bonne va leurs.
    merci

  7. A voir en vidéo sur Futura
  8. #6
    HULK28

    Re : Aide pour commander un servo moteur

    Me revoilou,

    donc pour calibrer une période de 20ms il faut définir un offset dans le registre du timer0 afin que le comptage donne précisemment 20ms.

    Soit 20ms/[1*256/(Fosc/4)]=234

    256-234=22
    L'offset sera donc de 22 -> TMR0=22

    Le prescaler fixé à 256.

    On peut de la même manière agir avec le Timer1, avec en plus l'avantage de se servir du registre CCPxCON qui permet le mode Compare qui consiste en un registre dédié à la comparaison entre le registre du timer1 et un registre contenant une valeur préfixée qui lorsqu'il y a un "match" (correspondance) va déclencher un flag et permettre une action (mise à 0 ou 1) sur un port quelconque du µC (selon où est connecté le servo).

    Tu as ici le principe général, il ne te reste plus qu'à extrapoler tout ça pour résoudre ton cas particulier.
    L'idéal étant de charger la doc de ton PIC et de consulter la partie Timer pour finaliser ton programme.
    Bon courage pour la suite.
    Tout est bien qui finit.

  9. Publicité
  10. #7
    any_one

    Re : Aide pour commander un servo moteur

    excuser moi mais l'offset ici c'est quoi le TH ou le TL
    merci et veuillez m'excuser si je comprend pas tres vite car j'ai pas bien compris.
    merci de vos effors je suis reconnaissant MR hulk28 et tt les membre

  11. #8
    HULK28

    Re : Aide pour commander un servo moteur

    Un timer 16 bits est constitué de 2 registres 8 bits, TH est le registre Haut composant les 8 bits de poids forts et TL le registre bas des 8 bits de poids faibles, TMR1=TH+TL

    L'offset représente le point de départ de comptage qui n'est pas forcément 0, donc on charge dans le registre du timer la valeur de départ souhaitée.
    Tout est bien qui finit.

  12. #9
    any_one

    Re : Aide pour commander un servo moteur

    merci ,voila ce que j'assay de faire mais j'ai des doutes veuillez m'expliquer mais fautes:
    org 0000H
    ljmp int

    org tmod
    int: mov th0,#8AH ;initialisation du tomporisateur0 pour
    mov tl0,#0D1H ;une tompo de 10ms a la place du 20ms
    ret

    org 4200H
    debut: mov P1,#FFFFH
    gauche: cjne P1,#04H,droite ;verifier si on a apuier sur
    ;le bouton A pour tourner
    ;a gauche
    impulbreve: mov tmod,#31H ;activation du tomporisateur 0
    ;et arret du tomporisateur 1
    mov th0,#F4H ;pour une impulsion de 1ms
    mov tl0,#49H ;
    setb tr0 ;declenchement du tomporisateur
    setb et0 ;validation de l'interuption de T0

    le sous programme qui debute a org tmod je ne suis pas sur de son ecriture, or pour cree les 3 impultion qui me reste comment faire ?
    merci

  13. #10
    any_one

    Re : Aide pour commander un servo moteur

    bonjour
    j'attend toujours une reponsse a ma question
    merci

  14. #11
    BastienBastien
    Invité

    Re : Aide pour commander un servo moteur

    Bonjour,

    Citation Envoyé par any_one Voir le message
    bonjour
    j'attend toujours une reponsse a ma question
    merci
    Un peu autoritaire, comme post. Tu ne trouves pas ?

  15. #12
    extra93

    Re : Aide pour commander un servo moteur

    Bonjour,
    Je suis étudiant et j'ai aussi le même problème que any_one.
    Dans le cas d'un timer 8 bits celui-ci déclaré en compteur va s'incrémenter au rythme de l'horloge de référence divisé par 4
    Pourquoi diviser par 4 ?

    Soit Tmax(8bits)=4/Fosc*256 et Tmax(16 bits)=4/Fosc*65536
    Sur un PIC la fréquence de référence est Fosc/4 soit dans ton cas F=3MHz
    D'où Tmax(8bits)=85,3µs et Tmax(16bits)=21,8ms
    Comment vous avez calculé les valeurs Tmax car je n'ai pas les mêmes résultats? et comment vous avez trouvé Tmax(8bits)=4/Fosc*256??
    merci

  16. Publicité
  17. #13
    HULK28

    Re : Aide pour commander un servo moteur

    Les PIC nécessitent 4 coups d'horloge pour accéder ou acquérir une information, comme ce sont 2 bus distincts on divise bien par 4.

    Ainsi il faut distinguer la fréquence de l'oscillateur et la fréquence d'horloge du PIC.

    Dans l'exemple, 12MHz en fréquence d'oscillateur implique donc une fréquence d'horloge de 3MHz.

    Un compteur 8 bits va s'incrémenter de 0 à 256 soit un temps de T=1/3MHz*256= 85,33µs, même type de calcul pour le timer en 16 bits.

    any_one ton code assembleur est vraiment indigeste, j'ai peur de devoir tout refaire et franchement le temps me manque.
    Désolé.
    @+
    Tout est bien qui finit.

  18. #14
    extra93

    Re : Aide pour commander un servo moteur

    Lorsque l'on utilise le temporisateur pour le servomoteur on le réalise sous forme de sous programme ou bien il doit être dans le programme principal

  19. #15
    any_one

    Re : Aide pour commander un servo moteur

    bonjour
    pour les tomporisateurs je ne sais pas , mais d'apres un livre ou 'ai lu la partie concernant les timers j'ai trouver un programme ou en declare le timer de cette façon:
    ORG TIMER0
    initialiser a des valeur puis il le reprend dans le programme principale:
    ORG 20
    on l'initialison a d'autre valeur. est je troubve ca bizard

Sur le même thème :

Discussions similaires

  1. schema pour commander un servo avec un potentiometre
    Par papango dans le forum Électronique
    Réponses: 11
    Dernier message: 10/12/2007, 18h36
  2. fréquence pour commander un moteur CC
    Par alainav1 dans le forum Électronique
    Réponses: 3
    Dernier message: 16/05/2007, 21h52
  3. Aide montage LANC + Relai pour commander un écran LCD
    Par bdemidde dans le forum Électronique
    Réponses: 0
    Dernier message: 03/03/2007, 14h22
  4. aide pour commander 2 moteurs dans les deux sens
    Par agno dans le forum Électronique
    Réponses: 0
    Dernier message: 10/07/2006, 10h41
  5. commander un/des servo/s avec un/des potard/s
    Par Tix dans le forum Électronique
    Réponses: 2
    Dernier message: 01/02/2005, 11h35