[Programmation] commande de moteur pas à pas avec pic16f877
Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

commande de moteur pas à pas avec pic16f877



  1. #1
    embar

    commande de moteur pas à pas avec pic16f877


    ------

    Bonjour à tous,

    Je suis en train de mettre en place le contrôle d'un moteur pas à pas comme indiqué dans l'image suivante. Mon objectif est de pouvoir ajuster la vitesse, changer le sens de rotation et afficher la vitesse actuelle sur un écran LCD.

    Voici le code que j'ai utilisé jusqu'à présent :

    Copy code
    // Affichage du sens de rotation
    // Paramétrage des broches pour l'afficheur LCD
    sbit LCD_RS at RC0_bit;
    sbit LCD_EN at RC1_bit;
    sbit LCD_D4 at RC2_bit;
    sbit LCD_D5 at RC3_bit;
    sbit LCD_D6 at RC4_bit;
    sbit LCD_D7 at RC5_bit;

    // Direction des broches de l'afficheur LCD
    sbit LCD_RS_Direction at TRISC0_bit;
    sbit LCD_EN_Direction at TRISC1_bit;
    sbit LCD_D4_Direction at TRISC2_bit;
    sbit LCD_D5_Direction at TRISC3_bit;
    sbit LCD_D6_Direction at TRISC4_bit;
    sbit LCD_D7_Direction at TRISC5_bit;

    char a, b;
    unsigned char speed = 1; // Vitesse initiale
    unsigned char lastSpeed = 1; // Dernière vitesse enregistrée

    void displayMessage(char* message) {
    Lcd_Cmd(_LCD_CURSOR_OFF); // Désactiver le curseur
    Lcd_Out(2, 1, message); // Afficher le message sur la deuxième ligne
    }

    void v() {
    if(PORTB.B2 == 0) {
    a++;
    speed = a; // Mettre à jour la vitesse
    displayMessage("desacceleratio n"); // Afficher "Acceleration"
    }
    if(PORTB.B3 == 0) {
    a--;
    speed = a; // Mettre à jour la vitesse
    displayMessage("Acceleration") ; // Afficher "Desacceleration"
    }

    if(a >= 20) a = 19; // Limiter a à 19 maximum
    if(a <= 0) a = 1; // Limiter a à 1 minimum

    for(b = 0; b < a; b++) { // Utiliser b comme compteur de boucle
    delay_ms(100);
    }
    }

    void displayRotationDirection(char direction) {
    Lcd_Cmd(_LCD_CLEAR); // Effacer l'écran LCD
    Lcd_Cmd(_LCD_CURSOR_OFF); // Désactiver le curseur

    // Affichage du texte sur la première ligne de l'écran LCD
    if (direction == 'F') {
    Lcd_Out(1, 1, "Sens avant");
    }
    else if (direction == 'R') {
    Lcd_Out(1, 1, "Sens arriere");
    }
    }

    void main() {
    TRISA = 0x00; // Configuration des broches de PORTA en sortie
    TRISB = 0xFF; // Configuration des broches de PORTB en entrée
    TRISC = 0x00; // Configuration des broches de PORTC en sortie pour l'afficheur LCD

    PORTA = 0; // Initialiser PORTB à zéro
    lcd_init(); // Initialiser l'afficheur LCD
    a = 1; // Initialiser 'a' à 1

    for(; { // Boucle infinie
    if(PORTB.B0 == 0) { // Si le bouton B0 est enfoncé
    displayRotationDirection('F'); // Afficher "avant" sur l'afficheur LCD
    // Sens horaire
    PORTA = 0b00000001; v();
    PORTA = 0b00000010; v();
    PORTA = 0b00000100; v();
    PORTA = 0b00001000; v();
    }

    if(PORTB.B1 == 0) { // Si le bouton B1 est enfoncé
    displayRotationDirection('R'); // Afficher "arriere" sur l'afficheur LCD
    // Sens anti-horaire
    PORTA = 0b00001000; v();
    PORTA = 0b00000100; v();
    PORTA = 0b00000010; v();
    PORTA = 0b00000001; v();
    }
    }
    }
    Maintenant, j'aimerais afficher la valeur de la vitesse actuelle sur l'écran LCD. J'ai essayé d'utiliser la fonction sprintf pour convertir la valeur en chaîne de caractères, mais le compilateur MikroC ne semble pas reconnaître cette fonction. Les seules alternatives que je trouve sont sprinti et sprintl.

    Si quelqu'un peut m'aider à trouver une méthode pour afficher la vitesse actuelle du moteur pas à pas, et me faire part de ses remarques concernant le code (si je dois effectuer des modifications ou s'il existe une méthode plus efficace pour ajuster la vitesse), je vous en serais très reconnaissant.

    Merci d'avance pour votre aide !


    Nom : stepper.JPG
Affichages : 79
Taille : 123,4 Ko

    -----

  2. #2
    umfred

    Re : commande de moteur pas à pas avec pic16f877

    Pourtant la doc indique sa présence https://download.mikroe.com/document...ry.htm#sprintf

  3. #3
    umfred

    Re : commande de moteur pas à pas avec pic16f877

    Sinon les sprinti et sprintl font la même chose que sprintf, mais en occupant moins de place et avec des contraintes sur le type de données en entrées.

Discussions similaires

  1. Commande d'un servoMoteur avec PIC16F877
    Par invitebfa43842 dans le forum Électronique
    Réponses: 5
    Dernier message: 25/09/2012, 22h57
  2. commande moteur pas pas avec un pic16f877
    Par invite04138050 dans le forum Électronique
    Réponses: 3
    Dernier message: 14/12/2011, 11h23
  3. Commande d'un vérin avec un PIC16F877
    Par inviteba85c925 dans le forum Électronique
    Réponses: 2
    Dernier message: 19/04/2011, 00h06
  4. aide mini projet "commande moteur cc " pic16f877
    Par invite86c6a0a1 dans le forum Électronique
    Réponses: 18
    Dernier message: 10/04/2010, 18h23
  5. pic16f877, commande moteur
    Par invite0b8beced dans le forum Électronique
    Réponses: 1
    Dernier message: 19/11/2006, 20h13
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...