Bonjour !

Je suis actuellement sur un projet automobile, en effet je souhaite changer le type d'ampoules sur mon véhicules pour du LED, mais contrairement à la majorité des véhicules, deux problèmes interviennent :

1) Un signal de envoie une impulsion de 12v sur chaque ampoule toutes les 3 secondes de manière individuelle, signal d'une durée de 100mS, normalement une ampoule halogène ne s'allumerait pas mais une LED oui... Ce signal sert à détecter si une ampoule est grillée ou non, il est donc en permanence envoyé sur les ampoules éteintes.
2) A l'arrière, les feux de position, de frein et d'antibrouillard ne sont pas alimentées par un +12V DC standard mais du PWM. Par exemple, les feux de position arrière sont alimentées par un signal PWM de 68Hz & Duty Cycle de 20%.

Le but est de contourner le premier problème sans utiliser de relais pour chaque ampoule, c'est une solution proposée mais encombrante et non fonctionnelle lorsque l'on parle de PWM.

J'ai déjà établi un code, qui permet de ne pas tenir compte des signaux dont la durée est inférieure à 300mS, ce dernier fonctionne très bien, les ampoules ne clignotent plus toutes les 3sec comme un sapin de Noël et lorsqu'un signal 12V DC est envoyé, l'ampoule s'allume.

Mon problème vient lorsque du PWM arrive. Je souhaiterais être en mesure de détecter ce signal et d'en mesurer la largeur d'impulsion (secondes) afin de décider de la répliquer en sortie, ou bien de créer un nouveau signal PWM (pour les feux de position par exemple, un duty cylce de 20% pour mes ampoules LED n'éclaire pas assez).

Voici le code en question :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#define NR_INPUT 1
#define TEST_SIGNAL 300
 
 
const int signalPins[NR_INPUT] = {5}; // Testing only one INPUT before testing the whole bulbs
const int outputPins[NR_INPUT] = {13}; // Testing only one OUTPUT before testing the whole bulbs
 
void setup() {
  for (uint8_t i = 0; i < NR_INPUT; i++) {
    pinMode(signalPins[i], INPUT_PULLUP);  
    pinMode(outputPins[i], OUTPUT);  
  }
  Serial.begin(9600);
}
 
void loop() {
  static int oldPinState[NR_INPUT]; 
  static uint32_t pinChangeMoment[NR_INPUT];  
 
  uint32_t moment = millis(); 
 
  for (uint8_t i = 0; i < NR_INPUT; i++) { 
 
    int pinState = digitalRead(signalPins[i]); 
    int PulseWidth = pulseIn(pinState, LOW);
 
    if (oldPinState[i] != pinState) { 
      pinChangeMoment[i] = moment;  
    }
    if (moment - pinChangeMoment[i] > TEST_SIGNAL) { 
      if (pinState == LOW) {  
        digitalWrite(outputPins[i], HIGH); 
      }
    }
    else {
      digitalWrite(outputPins[i], LOW); 
    }
    oldPinState[i] = pinState; 
  }
}
Et le schéma electrique expliquant pourquoi la logique est inversée (protection par octocoupleur des E/S et interface entre le 12 et le 5V avec un TIP120.

Nom : Schematics V3.png
Affichages : 319
Taille : 46,0 Ko

J'espère que les explications sont claires et que le problème est bien exposé

Merci d'avance pour votre aide !!!!