Commande de ventilateur pwm

Bonjour
Je souhaite commander des ventilateurs en vitesse Grace a leur fil PWM.
J'ai tenté un montage avec le + du ventilo sur du 12v ( c'est un ventilo en 12v)
La masse sur un transistor pour la couper complètement ( avec une digital input de l'arduino )
Et le PWM sur une sortie PWM de l'arduino

Mais le ventilo tourne tout doucement...
Au voltmètre j'ai en sortie PWM un signal qui ne dépasse pas les 5v (je m'y attendais vu que l'arduino sort du 5v)

Du coup je me demandai si le ventilo PWM régulais sa vitesse en fonction de l'alternance haut/bas du signal PWM (quelque soit la tension) ou si il utilisait la tension moyenne et donc qu'il fallait que j'amplifie le PWM a 12v?

Si il faut amplifier le PWM vous me conseillez quoi?

Merci

c'est un ventilo type PC?

le troisième fil (en général jaune) n'est pas une commande, mais un retour d'info vitesse. sur ce fil, le ventilo envoit 3 ou 6 impulsion par tour (selon le modèle).

C'est un ventilo type Pc mais à 4 fils et j'utilise le 4ème fils pour la commande
Le troisième me sert en effet à récupérer la vitesse

ah... connais pas trop ces ventilos à 4 fils...

Ce fil de commande, tu as essayé de lui mettre une tension continue?

Il faut être sûr de la forme de signal qu'attend l'électronique du ventilo. Il est possible de créer une PWM sur 12V avec un simple transistor NPN, petit montage à insérer entre l'arduino et le ventilo :

A gauche : génère une PWM 0-12V, à droite : génère une tension continue de 0 à 12V. c'est pas violamment linéaire, mais ça marche. J'utilise déjà ce genre de montages pour gérer le contraste d'un LCD en tension négative... Tout transistor petits signaux peut remplacer le 2N2222.

Petit piège : ces montages inversent la PWM. Si tu envoies 0, ça sort 12V, si tu envoies 255, ça sort 0V... il faut dans ce cas écrire fonction_pwm(255-valeur) au lieu de fonction_pwm(valeur) (je ne sais pas quelle fonction tu utilises, mais le principe est là.)

EDIT : pour le générateur de tension continue, tu peux rajouter une diode pour rendre la tension un peu plus linéaire :

en gros, Vout = 12 x (valeur / 255).

Merci pour le Schéma, je sais pas si ca servira pour mon pb car j'ai vu des forums ou ils disent que le venitlo attend bien du PWM en 5V
par contre il semble qu'il attende du PWM a 25kHz et l'arduino en envoi a 16kHz...
Donc il y aurai de la conf a faire.
Faut que je creuse ce point.

Par contre pour ton schéma (j'essai d’apprendre un peu l’électronique...) 2 question.
Pourquoi ne pas prendre la sortie PWM entre le +12V et le GND ?
Comment as tu calculé les valeurs des résistances ? et pourquoi en mettre (Car je comprend bien l'action du transistor mais pas celle des résistances...

Merci

voici un code que j’avais fait pour générer une vraie PWM sur les pins 9 et 10 d’une méga. Il n’y a que deux lignes à changer pour passer en UNO.

#define pwm9 OCR2B   // accès registre pwm timer2
#define pwm10 OCR2A  // accès registre pwm timer2

void pwmTimer2Init(byte prescaler){ 
// prescaler = 1 à 7 (Fpwm = [1 => 62,5KHz; 2 => 7,8KHz; 3 => 2KHz; 4 => 1KHz; 5 => 488Hz; 6 => 244Hz; 7 => 61Hz])
  cli();
  DDRH |= 0x40;  // pin9 en sortie
  PORTH &= 0xBF;  // pin9 = 0
  DDRB |= 0x10;  // pin10 en sortie
  PORTB &= 0xEF;  // pin10 = 0
  TIMSK2 = 0x00;
  ASSR &= 0xBF;  // désactiver timer ext_clk.
  TCCR2A = 0x03;
  TCCR2B = prescaler;  // mode WGM2 = 3 = fast PWM 8 bits, CS2 = prescaler.
  sei();
}

void pwm2Set(byte pin, byte value){  // pin = 9 ou 10, 0 < value < 255
  if (value < 2) {  // sortie = 0
    if (pin == 9) {
      TCCR2A &= 0xCF;
      PORTH &= 0xBF;  // pin9 = 0
    } else if (pin == 10) {
      TCCR2A &= 0x3F;
      PORTB &= 0xEF;  // pin10 = 0
    }
  } else {                   // sortie = PWM
    if (pin == 9) {
      TCCR2A |= 0x20;  // activer OC2B sur pin 9
      pwm9 = value;
    } else if (pin == 10) {
      TCCR2A |= 0x80;  // activer OC2A sur pin 10
      pwm10 = value;
    }
  }
}

void setup(){
  pwmTimer2Init(2);  // initialiser la PWM à 7,8KHz sur pins 9 et 10
}

void loop(){
  pwm2Set (9, 127); // pwm 50% sur pin 9
  pwm2Set (10, 64); // pwm 25% sur pin 10

// on peut aussi accéder directement aux valeurs pwm9 et pwm10 :
  pwm9 = 127; // pwm 50% sur pin 9
  pwm10 = 64; // pwm 25% sur pin 10
// mais dans le cas où la valeur est inférieure à 2, c'est plus compliqué, mieux vaut passer par pwm2Set 
}

Le souci, c’est que pour faire de la PWM 8 bits, on est limité aux fréquences citées, il y a moyen de tricher et diviser les fréquences par 2 (dans ce cas, on pourrait tapper dans les 31,25KHz, ce qui serait le plus proche de tes besoins.

Pour les résistances, elles servent à limiter le courant, c’est tout… je suis étonné que tu connaisses les transistors mais pas les résistances…

Le +12V est l’alimentation, donc tu n’auras pas grand chose de PWM dessus…

Super pour le code et ça tombe bien j'ai aussi une Mega :slight_smile:
C'est sur que j'était passé à côté sur le PWM. J'utilisait la commande analogwrite comme description dans la doc, mais j'avais pas vu cette histoire de fréquence à 490 Hz (celle de base de l'arduino)
Je vais tenter la manip des 32kHz même si il semble que le "range acceptable" soit 21kHz-28kHz

Pour les résistances je connais la loie d'ohm mais sur la datasheet du transistor ils disaient que le courant Max était de 800mA
Et comme la sortie de l'arduino était à 50mA je pensai pas qu'on avait besoin de cette résistance de 4,7 kOhm ( dont j'imagine le but est de limiter le courant de la base?)

Pour la tension 12v si la base n'a rien en entrée et que tu met ton ventilo en série sur l'entree 12v ça ne l'empechera pas de tourner?
Le transistor faisant office d'interupteur ouvert?

Merci de ton aide j'ai plus des notions d'électricité que d'électronique :wink: