Problema con MOSFET y PWM

Hola Amigos,

Este es mi primer post para pediros que me eches in cable con este tema del PWM que me esta volviendo loco.

Resulta que tengo que gobernar 4 mostee mediante PWM. He hecho pruebas con canales por separado y todo va genial.

El problema viene cuando quiero gobernar los tres mosfet a la vez. Utilizo las salidas D5,D9,D11.

He cambiado de puertos y no consigo un buen funcionamiento.

Os envio mi código para que lo podéis repasar:

#define fadePin01 5
#define fadePin02 11
#define fadePin03 9

const int buttonPin = 2;
int count = 0;
int buttonState = 0;
int sensorValue;

void setup(){

pinMode(fadePin01, OUTPUT);
pinMode(fadePin02, OUTPUT);
pinMode(fadePin03, OUTPUT);
pinMode(buttonPin, INPUT);

}

void loop(){

buttonState = digitalRead(buttonPin);
sensorValue = analogRead(0);
if (buttonState == LOW){
count++;
}

if (count == 1){

Encender();
count++;
}

if (count == 3) {

Apagar();
count = 0;
}

}

void Encender(){
int r;
delay(25);

for (r = 0; r < 255; r++) {
analogWrite(fadePin01, r);
delay(25);
analogWrite(fadePin02, r);
delay(25);
analogWrite(fadePin03, r);
delay(25);
}

}

void Apagar(){
int b;
delay(25);

for (b = 255; b > -1; b–) {
analogWrite(fadePin01, b);
delay(25);
analogWrite(fadePin02, b);
delay(25);
analogWrite(fadePin03, b);
delay(25);
}

}

Gracias de antemano.

Saludos

La mejor forma de depurar un código es ir leyendo el valor de las variables en diferentes partes del mismo y a través del monitor serial. No le des mas vueltas y te llevarás sorpresas.

Jopapa www.jopapa.me

Cuantas imprecisiones en la explicación y el código.
Hablas de 4 mosfet y tu código refiere a 3.
No muestras el esquema electrico asi que no se si habamos de 3/4 mosfet encendiendo y apagando leds o que otra carga.

Tu código tiene un botón pero no tiene nada que controle los rebotes. Al menos usa una variable con el ultimo estado que vea la transición 1 a 0.
Es muy estricto con las posiciones para encender y apagar.
Como está es dificil que presiones una vez y count pase de 0 a 1. Puede que si y puede que termine en 10.

Porque en encender y apagar haces esto

 analogWrite(fadePin01, r);
    delay(25);

por cada pin?

Para terminar dos cosas: Lee las normas del foro
Punto 7 como presentar códigos. Cuando lo comprendas edita tu post#1. Gracias por eso.

#define fadePin01 5
#define fadePin02 11
#define fadePin03 9

const int buttonPin = 2;

int count = 0; 
int buttonState = 0; 
int buttonStateLast = 0; 
int sensorValue;

void setup(){

  pinMode(fadePin01, OUTPUT); 
  pinMode(fadePin02, OUTPUT);
  pinMode(fadePin03, OUTPUT);
  pinMode(buttonPin, INPUT);

}

void loop(){


  sensorValue = analogRead(0);
  buttonState = digitalRead(buttonPin);
  if (buttonState == LOW & buttonStateLast == HIGH){
     count++;
  }
  buttonStateLast = buttonState;

  if (count == 1){   
     Encender();
  }

  if (count == 2) {
     Apagar();
     count = 0;
  }
 
}

void Encender(){
  int r;
  delay(25);

  for (r = 0; r < 255; r++) {
   analogWrite(fadePin01, r);
   delay(25);
   analogWrite(fadePin02, r);
   delay(25);
   analogWrite(fadePin03, r);
   delay(25);
 }
}


void Apagar(){
  int b;
  delay(25);

  for (b = 255; b > 0; b--) {
    analogWrite(fadePin01, b);
    delay(25);
    analogWrite(fadePin02, b);
    delay(25);
    analogWrite(fadePin03, b);
    delay(25);
  }
}

Una pregunta
sensorValue = analogRead(0); que haces con ese valor?

prueba con esto:

#define fadePin01 5
#define fadePin02 6
#define fadePin03 9
#define fadePin04 10

const byte buttonPin = 2;
byte count = 0;
byte buttonState = 0;
byte sensorValue = 0;

void setup(){
pinMode(fadePin01, OUTPUT);
pinMode(fadePin02, OUTPUT);
pinMode(fadePin03, OUTPUT);
pinMode(fadePin04, OUTPUT);
pinMode(buttonPin, INPUT);

}

void loop(){
buttonState = digitalRead(buttonPin);
delay(20);
if(buttonState == LOW) count++;

if(count == 1) {
  encender();
  count++;
}
if(count == 3){
  apagar();
  count = 0;
}
}

void encender(){
byte i;

for (i = 0; i < 100; i++){
 analogWrite(fadePin01,map(i, 1, 100, 0, 255));
 analogWrite(fadePin02,map(i, 1, 100, 0, 255));
 analogWrite(fadePin03,map(i, 1, 100, 0, 255));
 analogWrite(fadePin04,map(i, 1, 100, 0, 255));
delay(20);
}
}
void apagar(){
byte i;

for (i = 0; i < 100; i++){
 analogWrite(fadePin01,map(i, 1, 100, 255, 0));
 analogWrite(fadePin02,map(i, 1, 100, 255, 0));
 analogWrite(fadePin03,map(i, 1, 100, 255, 0));
 analogWrite(fadePin04,map(i, 1, 100, 255, 0));
delay(20);
}
}

Lo mejor para hacer un debug. Es separar el codigo .... Si tu problema es con la activación de los tres mosfets... Prueba a escribir Un queño código q escriba su señal pwm de 0 a 100,en 10 seg por ejemplo.

Si eso funciona. Tu problema mas seguramente esta en el código que rodea a esa función.

Alex.