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 :
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.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();
}
}
}
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 !
-----