Programmation d'un moteur sur ESP32

Bonjour à tous.
J'ai une carte électronique sur laquelle j'ai un driver de moteur L6203.

J'ai réalisé ce code :

#include <Arduino.h>

#define RELAY_PORTE GPIO_NUM_16
#define COMMAND_OPEN GPIO_NUM_2
#define COMMAND_CLOSE GPIO_NUM_4

void setup() 
{
  pinMode(RELAY_PORTE, OUTPUT);
  pinMode(COMMAND_CLOSE, OUTPUT);
  pinMode(COMMAND_OPEN, OUTPUT);

  digitalWrite(RELAY_PORTE, LOW);

}

void loop()
{

// Ouverture
  digitalWrite(RELAY_PORTE, HIGH);
  digitalWrite(COMMAND_OPEN, HIGH);
  digitalWrite(COMMAND_CLOSE, LOW);
  delay(5000);

// Coupe relais puissance.
  digitalWrite(RELAY_PORTE, LOW);
  delay(5000);

// Fermeture
  digitalWrite(RELAY_PORTE, HIGH);
  digitalWrite(COMMAND_OPEN, LOW);
  digitalWrite(COMMAND_CLOSE, HIGH);
  delay(5000);

// Coupe relais puissance.
  digitalWrite(RELAY_PORTE, LOW);
  delay(1000);
  
}

Ce code fonctionne bien. Le moteur me va dans un sens et dans l'autre.

J'ai donc voulu le piloter en pwm, j'ai donc fait ce code :

#include <Arduino.h>

#define PIN_DRIVER_IN1 GPIO_NUM_2
#define PIN_DRIVER_IN2 GPIO_NUM_4
#define PIN_RELAY_PORTE GPIO_NUM_16


#define DELAY_OUVERTURE_FERMETURE 6000


void MarcheAv();
void MarcheAr();


void setup() 
{
  ledcSetup(0, 1000, 8); // Initialisation du canal pwm 0 à 1kHz en 8 bits (0-254)
  pinMode(PIN_RELAY_PORTE, OUTPUT); // Pilote relais alim puissance moteur porte.
}

void loop() 
{
  MarcheAv();
  delay(10000);
  MarcheAr();
  delay(10000);
}


void MarcheAv()
{
  uint64_t timeCount = millis();

    digitalWrite(PIN_RELAY_PORTE,HIGH);
    delay(20);

	ledcWrite(0, 250); // Initialise le canal pwm 0 (voir setup()) à un signal pwm de 254 (= 1 logique).
	ledcAttachPin(PIN_DRIVER_IN1, 0); // Attache la pin PIN_DRIVER_IN1 au canal pwm N°0 configuré précédement.
	digitalWrite(PIN_DRIVER_IN2, LOW);

    delay(5000);
        
	ledcDetachPin(PIN_DRIVER_IN1);
    digitalWrite(PIN_RELAY_PORTE,LOW);
    
}

void MarcheAr()
{
   ulong timeCount = millis();
    
    digitalWrite(PIN_RELAY_PORTE,HIGH);
    delay(20);

	ledcWrite(0, 250);
	ledcAttachPin(PIN_DRIVER_IN2, 0);
	digitalWrite(PIN_DRIVER_IN1, LOW);

    delay(5000);
   	
	ledcDetachPin(PIN_DRIVER_IN2);
    digitalWrite(PIN_RELAY_PORTE,LOW);
}

Mais ce code ne fonctionne pas. Mon moteur lance l'ouverture une première fois lors de la mise sous tension (usb), mais pas systématiquement (parfois il ne fait rien) et après plus rien... Mon relais s'enclanche bien et j'ai bien un signal qui sort de mes pin 4 et 2.

Je ne comprends pas pourquoi le premier code est OK mais pas le second en pwm :triumph:!!!

si quelqu'un comprends d'où vient mon souci , merci de m'éclairer :sweat_smile:

Bonjour @Vidou12

ledcWrite(0, 250); // Initialise le canal pwm 0 (voir setup()) à un signal pwm de 254 (= 1 logique).
ledcAttachPin(PIN_DRIVER_IN1, 0); // Attache la pin PIN_DRIVER_IN1 au canal pwm N°0 configuré précédement.

mettre plutôt les ledcAttachPIn() avant les ledcWrite() il me semble

ledcSetup(), puis ledcArrachPin() et enfin ledcWrite(), c'est du moins le séquencement donné par Espressif dans la doc : LED Control (LEDC) - ESP32 - — ESP-IDF Programming Guide latest documentation...... qui sait , ça fonctionne peut êtreaussi dans un ordre différent !

1 Like

En effet ça a l'air de mieux marcher. Je fais d'autre tests pour voir. Merci.
Curieux que ça ait fonctionné parfois du coup !!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.