esp32 pwm

Bonjour dans mon programme j envoi une commande serial print puis j active mon signal pwm (réglé en 25khz)
entre le moment ou je reçois mon serial print et le moment ou mon pwm ce lance j ai une seconde de décalage pourquoi ? Logiquement cela devrait etre synchronisé

ex: si dans code on place ledcWrite(pin1, val) et ensuite on fait un digitalWrite(pin2, HIGH), la broche pin2 passe à HIGH
et après environ une petite seconde la broche pin1 change de valeur.

Merci pour vos retours

Poste ton code

oops j ai edité le code
je te poste un exemple :
ex: si dans code on place ledcWrite(pin1, val) et ensuite on fait un digitalWrite(pin2, HIGH), la broche pin2 passe à HIGH
et après environ une petite seconde la broche pin1 change de valeur.
merci

Bonjour

mets ton code entier !!

içi on ne voit pas l'initialisation du PWM (fréquence ,timer, attachement à une pin....)

Attention le second paramètre de ledcWrite() est le rapport cyclique du PWM associé à la pin. Avec la valeur 1 le rapport cyclique est mini.

ledcWrite() sert essentiellement à mettre à jour le rapport cyclique 'au vol' d'un PWM dédié LEDs , définit par ailleurs et attaché à une pin.... du moins c'est comme ça que je le comprends.

içi un exemple d'utilisation de ledcWrite()

bonjour , je fais suite a ta demande en postant le code

Message du membre de notre groupe qui s occupe du code
voilà la partie du code qu’il faut poster pour notre problème de décalage tu spécifies bien entre le moment ou le ventilateur doit ce déclencher, on a un décalage d’environ 1s entre le moment ou la broche power passe à HIGH et celle du pwm = 255 (la fonction “quickstart”)

Merci :stuck_out_tongue:

////////////////////////////////////////////////////////////////////////////////

//                             FICHIER INO                                    //

////////////////////////////////////////////////////////////////////////////////





#include <Wire.h>

#include <EEPROM.h>

#include "BluetoothSerial.h"

#include "VAR.H"

#include "LM75.H"

#include "FAN.H"



#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)

#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it

#endif



BluetoothSerial SerialBT;



void setup() {

  for(int i = 0; i < 5; ++i){

    ledcSetup(channel[i], freq, _8BITS_);

    ledcAttachPin(pwmPins[i], channel[i]);

  }

  pinMode(F_PWR, OUTPUT);

  Serial.begin(115200);

  Wire.begin();

  SerialBT.begin("ESP32");

  while(!LM75_isPresent());

  startFan = true;

}



void loop() {

  

  getTemp(&temperature);

  SET_PWM_FAN();

  serialBT.println((FAN_PWM == 0) ? "FAN OFF" : ((String) "FAN :" + map(FAN_PWM, 0, 255, 0, 100) + " %"));

  delay(150);

}



////////////////////////////////////////////////////////////////////////////////

//                             FICHIER VAR.H                                  //

////////////////////////////////////////////////////////////////////////////////



#ifndef VAR_H_

#define VAR_H_



/* Variables pin pwm */

#define _8BITS_   8 //0~255

#define _12BITS_ 12 //0~4095



const int freq = 25000;

const int pwmPins[5] = { 16, 17, 18, 19, 4}; //LED1, LED2, LED3, LED4, FAN_PWM

const int channel[5] = { 0, 1, 2, 3, 4};

const int F_PWR = 5;



/* variables ventilateur */

static uint32_t timerAlarme = 0;

static uint32_t timerFan = 0;

static bool startFan = false;

static bool kickStart = false;

static int FAN_PWM = 0;



float temperature = 0;



#endif



////////////////////////////////////////////////////////////////////////////////

//                             FICHIER LM75.H                                 //

////////////////////////////////////////////////////////////////////////////////



#ifndef LM75_H_

#define LM75_H_



#define LM75_ADDR     0x48

#define LM75_REGISTER 0



bool getTemp (float *temp) {

  float _temp;

  Wire.beginTransmission(LM75_ADDR);

  Wire.write(LM75_REGISTER);  

  Wire.endTransmission();

  Wire.requestFrom(LM75_ADDR, 2);

  word regdata = (Wire.read() << 8) | Wire.read();

  _temp = ((float)(int)regdata / 32.00) / 8.00;

  if(_temp - *temp > 0.4 || _temp - *temp < 0.4){

    *temp = _temp;

  } return true;

}



bool LM75_isPresent() {

  Wire.beginTransmission (LM75_ADDR);

  Wire.write((uint8_t)0x00);

  return (Wire.endTransmission() == 0 ? true : false);

}



#endif



////////////////////////////////////////////////////////////////////////////////

//                             FICHIER FAN.H                                  //

////////////////////////////////////////////////////////////////////////////////



#ifndef FAN_H_

#define FAN_H_



/* adresse eeprom */

#define tmpMini 0

#define tmpMaxi 1

#define tmpCritique 2

#define pwrStart 3



/*Consignes temperature */

#define tempMini     (EEPROM.read(tmpMini == 0)     ?  20 : EEPROM.read(tmpMini))

#define tempMaxi     (EEPROM.read(tmpMaxi == 0)     ? 35 : EEPROM.read(tmpMaxi))

#define tempCritique (EEPROM.read(tmpCritique == 0) ? 45 : EEPROM.read(tmpCritique))

#define pwmMini      10 // valeur mini 10%

#define pwmMaxi      100 // valeur maxi 100%

#define delayAlarme  5000



void SET_PWM_FAN(){

  

  if(startFan == false) { /* si pas besoin du ventilateur */

	digitalWrite(F_PWR, LOW);

    FAN_PWM = 0;

    ledcWrite(pwmPins[4], FAN_PWM);

    kickStart = false;

	return;

  } else if(startFan == true) { 

    if(temperature < tempMini){ /* si temperature inférieure à temperature mini */

      kickStart = false;

      FAN_PWM = 0;

      ledcWrite(pwmPins[4], FAN_PWM);

	  digitalWrite(F_PWR, LOW);

      return;

    } else if(temperature >= tempMini) { /* si temperature comprise entre temperature mini et maxi*/

      digitalWrite(F_PWR, HIGH);            

      if(!kickStart) { /* si démarrage du ventilateur, impulsion au maxi afin de s'assurer que le ventilateur tourne*/

        FAN_PWM = 255;

        ledcWrite(pwmPins[4], FAN_PWM);

        timerFan = millis();

        kickStart = true;

      } else {

        if(millis() - timerFan >= 500) { /* fonctionnenement normal après impulsion */

          if(temperature < tempMaxi) {

            FAN_PWM = map((temperature*100), (tempMini*100), (tempMaxi*100), (pwmMini*2.55), (pwmMaxi*2.55));

            if(FAN_PWM > 255) FAN_PWM = 255;

            ledcWrite(pwmPins[4], FAN_PWM);

          } else if(temperature >= tempMaxi) {

            FAN_PWM = 255;

            ledcWrite(pwmPins[4], FAN_PWM);

          }

        }

      }

    }

  } 

}

je n'ai pas analysé la structure des if, then , else.... du proramme

Une remarque sur la congifuration des pwm 'leds' , je ne vois pas dans la doc de possibilité de timer 8 bits, je ne vois que les valeurs de 10 à 15. (Duty resolution)

:slight_smile: :slight_smile: :slight_smile: :slight_smile: :slight_smile: Je confirme tu m a apporté la solution big merci

t en que je te tiens j ai deux autre question

j ai du mal a comprendre comment les interruption sont géré ( je veux utilise un gpio pour obtenir les tours en temps reel du ventilateur via le tachymètre

je sais egalement que l esp32 et compatible avec le bt mesh

par contre et il possible par exemple de faire en sorte que tout les équipement d un groupe ce connecte entre eux en déclarant un maître tous en gardant la possibilité d avoir sur chaque module la connexion pour récupéré la com

en quelque sorte une double connexion
esp32 to esp32 et en meme temps esp32 to pc

merci a toi encore 1000 fois

Salut,

J'imagine à ta question que l'ESPNow a l'air adapté. Tu peux faire interagir jusqu'à 100 appareils il me semble. Faudrait que tu vois si ça correspond à ton cas. Je me suis posé la question aussi mais dans mon cas il est préférable de créer un point d'accès wifi.

Après j'ai survolé l'ESPNow et je ne sais pas trop s'il y a compatibilité avec le pc. C'est une sort de wifi-direct entre esp32