Programmation PIC 18f2431 Chargeur de Batterie
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

Programmation PIC 18f2431 Chargeur de Batterie



  1. #1
    Jefflafrite

    Programmation PIC 18f2431 Chargeur de Batterie


    ------

    Bonjour,
    Dans le cadre d'un projet de cours, avec deux de mes amis nous devions réaliser un projet.
    Nous avons choisi d'utiliser un pic pour réguler la charge.
    Nous bossons sur ce projet depuis pas mal de temps, mais l'échéance approchant (mardi 23 ou mercredi 24 Avril), et les simulation peu fructueuse, nous avons besoin d'aide.
    Avant de faire appel à vous, j'ai déjà été rendre visite à un amis qualifié dans le domaine. Il nous a rectifié le circuit et programmé le pic. Sachant qu'il programme 4 à 5 pic par semaine je lui fait confiance. Seulement c'était en soirée et nous étions quelque peu pressé. Je me dis qu'il aurait peut-être fait une erreur car la simulation sur ISIS ne fonctionne pas, ensuite en analysant le programme il y a quelque chose que je ne comprend pas.

    Ce que le pic doit faire : lire la tension de la batterie (Pin AN0) et déterminé si c'est une 12 ou 24 v, une led (LV RC4 ou HV RC5) sera allumée en conséquence.
    Nous utilisons un transfo 220v, vers deux secondaire 12v couplé avec un relais. En position normalement fermé, le relais place les deux secondaires en parallèle, en normalement ouvert il les monte en série. Par la pin RC0 (SelVolt), le pic choisira le 12 ou le 24v. Nous avons opté de placé un relais et non d'utiliser une pwm et un buck pour des raisons de sécurité. Imaginons que le pic se crash et qu'une batterie 12v soit branchée. Si jamais elle est chargée en 24v, c'est finis...
    La pin RC1 (Enable) chargera où non la batterie.
    Dix leds sont placée sur les bornes RB0-RB7 et RC6 et RC7
    Celle-ci indiqueront le niveau de charge de la batterie (Gradateur).
    Lorsque celle-ci sera chargée, elles clignoterons.
    Si aucune batterie n'est branchée, les leds LV et HV clignoterons.

    Venons-en au vif du sujet, ayant rédigé le programme en la présence de mon avis, j'avais tout compris.
    Cependant pour la fonction Void Display (pour le gradateur de charge), il a réduit le code de la fonction de moitié en utilisant un gain. Si c'est une batterie 12v, le gain est de 1, pour une 24v de 2. Selon moi, aucune valeur de V n'est attribuée.

    Je pense donc qu'il faudrait prendre en compte la valeur lue par la fonction ReadVoltage. Si c'est le cas, ne faudrait-il pas la convertir ? En effet, une pin d'un pin accepte maximum 5.26 v, on a posé comme condition qu'une batterie 24v chargée à font peut attendre +- 30 v. Via les résistance le rapport de transformation est de 36. De plus c'est une entrée analogique 8bit, il faut donc diviser la valeur par 255 et la multiplier par 36.
    Ou bien sinon, diviser par un facteur les conditions pour allumer les leds dans la fonction display.

    Ne faudrait-il par faire l'inverse quand on Calcule V et faire V= ReadVoltage() *255/36 * gain ??

    Par ailleurs, si vous le voulez, vous pouvez jetter un oeil sur le circuit.
    Je fait appel à vous, car avant de réaliser le pcb, je voudrais être sûr de la réalisation. Et la simulation sur Protéus n'est pas très bonne, mais bon ce n'est peut-être pas fiable ce genre de programme.

    Merci d'avance pour votre aide.
    Bonne journée.

    Voici le schéma :


    Voici le code : (Si vous préférer je peux tout vous transférer par email ou héberger sur un site)

    C:\Users\Jeff\Documents\Ecole\ 1 MII\Electronique de Puissance\Chargeur à PIC\BattLoad.c
    1: #include <18F2431.h>
    2: #device adc=8
    3:
    4: #FUSES NOWDT //No Watch Dog Timer
    5: #FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
    6: #FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz 7: #FUSES NOPROTECT //Code not protected from reading
    8: #FUSES NOIESO //Internal External Switch Over mode disabled
    9: #FUSES NOBROWNOUT //No brownout reset
    10: #FUSES BORV27 //Brownout reset at 2.7V
    11: #FUSES NOPUT //No Power Up Timer
    12: #FUSES NOCPD //No EE protection
    13: #FUSES STVREN //Stack full/underflow will cause reset
    14: #FUSES NODEBUG //No Debug mode for ICD
    15: #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used 16: #FUSES NOWRT //Program memory not write protected
    17: #FUSES NOWRTD //Data EEPROM not write protected
    18: #FUSES FCMEN //Fail-safe clock monitor enabled
    19: #FUSES NOWINEN //WDT Timer Window Disabled
    20: #FUSES T1LOWPOWER //Timer1 low power operation when in sleep
    21: #FUSES HPOL_HIGH //High-Side Transistors Polarity is Active-High (PWM 22: //PWM module high side output pins have active high output polarity
    23: #FUSES NOWRTC //configuration not registers write protected
    24: #FUSES NOWRTB //Boot block not write protected
    25: #FUSES NOEBTR //Memory not protected from table reads
    26: #FUSES NOEBTRB //Boot block not protected from table reads
    27: #FUSES NOCPB //No Boot Block code protection
    28: #FUSES LPOL_HIGH //Low-Side Transistors Polarity is Active-High (PWM 29: //PWM module low side output pins have active high output polar
    30: #FUSES PWMPIN //PWM outputs disabled upon Reset
    31: #FUSES MCLR //Master Clear pin enabled
    32:
    33: #use delay(clock=4000000)
    34:
    35: #define SelVolt PIN_C0
    36: #define Enable PIN_C1
    37: #define LED_LV PIN_C4
    38: #define LED_HV PIN_C5
    39:
    40: float ReadVoltage();
    41: void Display (float V, float Gain);
    42: static int1 Test, Blink;
    43:
    44: #int_TIMER1
    45: void TIMER1_isr(void)
    46: {
    47: static int CountLoop;
    48: set_timer1(53036); //réglage timer pour interruption toutes les 100mS
    49:
    50: if (CountLoop++==50) //Boucle 5 secondes
    51: {
    52: Test = 1;
    53: CountLoop=0;
    54: }
    55:
    56:
    57: }
    58:
    59: float ReadVoltage()
    60: {
    61: set_adc_channel(0);
    62: delay_us(50);
    63: return(Read_ADC()*36.0/255.0); //à ajuster (calibration)
    64: }
    65:
    66: void Display (float V, float Gain)
    67: {
    68: V = V*Gain;
    1
    C:\Users\Jeff\Documents\Ecole\ 1 MII\Electronique de Puissance\Chargeur à PIC\BattLoad.c
    69:
    70: if (V>11.0) output_high(PIN_C6);
    71: else output_low(PIN_C6);
    72: if (V>11.3) output_high(PIN_C7);
    73: else output_low(PIN_C7);
    74: if (V>11.6) output_high(PIN_B0);
    75: else output_low(PIN_B0);
    76: if (V>11.9) output_high(PIN_B1);
    77: else output_low(PIN_B1);
    78: if (V>12.2) output_high(PIN_B2);
    79: else output_low(PIN_B2);
    80: if (V>12.5) output_high(PIN_B3);
    81: else output_low(PIN_B3);
    82: if (V>12.8) output_high(PIN_B4);
    83: else output_low(PIN_B4);
    84: if (V>13.1) output_high(PIN_B5);
    85: else output_low(PIN_B5);
    86: if (V>13.4) output_high(PIN_B6);
    87: else output_low(PIN_B6);
    88: if (V>13.8) output_high(PIN_B7);
    89: else output_low(PIN_B7);
    90: }
    91:
    92: void main()
    93: {
    94: float Voltage;
    95:
    96: setup_adc_ports(sAN0|VSS_VDD);
    97: setup_adc(ADC_CLOCK_INTERNAL|A DC_TAD_MUL_8|ADC_WHEN_INT0|ADC _INT_EVERY_OTHER);
    98: setup_wdt(WDT_OFF);
    99: setup_timer_0(RTCC_INTERNAL);
    100: setup_timer_1(T1_INTERNAL|T1_D IV_BY_8);
    101: setup_timer_2(T2_DISABLED,0,1) ;
    102: enable_interrupts(INT_TIMER1);
    103: enable_interrupts(GLOBAL);
    104:
    105: while(TRUE)
    106: {
    107: if (Test)
    108: {
    109: Voltage = ReadVoltage();
    110:
    111: if (Voltage<5.0) //Pas de batterie
    112: {
    113: output_low(SelVolt);
    114: output_low(LED_HV);
    115: output_low(LED_LV);
    116: output_low(Enable);
    117: }
    118: else
    119: {
    120: if (Voltage<15.0) //Batterie 12V
    121: {
    122: output_low(SelVolt);
    123: output_low(LED_HV);
    124: output_high(LED_LV);
    125: if (Voltage>14.4)
    126: {
    127: output_low(Enable);
    128: Blink = 1;
    129: }
    130: if (Voltage<13.8)
    131: {
    132: output_high(Enable);
    133: Display (Voltage,1.0);
    134: Blink = 0;
    135: }
    136: }
    2
    C:\Users\Jeff\Documents\Ecole\ 1 MII\Electronique de Puissance\Chargeur à PIC\BattLoad.c
    137: else //Batterie 24V
    138: {
    139: output_high(SelVolt);
    140: output_high(LED_HV);
    141: output_low(LED_LV);
    142: if (Voltage>28.8)
    143: {
    144: output_low(Enable);
    145: Blink = 1;
    146: }
    147: if (Voltage<27.6)
    148: {
    149: output_high(Enable);
    150: Display (Voltage,2.0);
    151: Blink = 0;
    152: }
    153: }
    154: }
    155: }
    156: Test=0;
    157:
    158: if (Blink)
    159: {
    160: output_toggle(PIN_B0);
    161: //ajouter les 9 autres
    162: delay_ms(200);
    163: }
    164: }
    165: }
    3

    -----

  2. #2
    HAYAC

    Re : Programmation PIC 18f2431 Chargeur de Batterie

    Bonjour Jefflafrite,
    Je travail en ce moment sur un projet du même type, avec des choix de conception différents, ceci étant, sur le test d'origine du choix de batterie se pause un problème :
    Lors d'une décharge profond de l'accumulateur 24V, la tension testé pourrait être inférieur à 12V, dans ton raisonnement, le chargeur va donc l'interpréter comme une batterie de 12V (ça na pas de conséquence dramatique autre que de ne pas recharger ta batterie, mais bon).
    Pour ce qui est du code (à première lecture) :
    - Tu as deux déclaration de ReadVoltage() ligne 40 et 59 (à corriger).
    - As-tu essayer de compiler ? ligne 107 : " if (Test)", tu déclare test à 1 plus haut mais quel est ta condition ?
    - "Je pense donc qu'il faudrait prendre en compte la valeur lue par la fonction ReadVoltage. Si c'est le cas, ne faudrait-il pas la convertir ?", dans la fonction ReadVoltage() la conversion est effectué "return(Read_ADC()*36.0/255.0); //à ajuster (calibration)".
    - En terme de structure de programme les déclarations sont un peux anarchique, elles sont dispatché dans le programme.
    - Sauf erreur de lecture, dans le corps du programme (while(TRUE)), si test est égale à 1 il exécute la lecture du port analogique et convertie.
    En espèrent t'avoir aidé,
    Cordialement,

  3. #3
    vincent66

    Re : Programmation PIC 18f2431 Chargeur de Batterie

    Bonjour,
    La programmation n'est pas mon fort...
    Mais niveau hardware un truc m'inquiète : l'indicateur de niveau à 10 led... plusieurs led allumées simultanément peuvent cramer le pic... pour t'en assurer regarde la datasheet "absolute maximum ratings" le courant max que supportent les pins d'alimentation Vcc et Gnd...
    Une sortie de pic peut bien délivrer 20mA dans une led mais cinq led allumées simultanément crameront un pic dont le courant d'alim Vcc est limité à 80mA ...

    Vincent
    Leonardo était ingénieur "sans papier", et moi diplômé juste...technicien...

  4. #4
    HAYAC

    Re : Programmation PIC 18f2431 Chargeur de Batterie

    Bonjour vincent66,
    Correction sur ce point : il y à deux intensités à surveiller dans un montage à PIC xxxxxx, la première étant l'intensité par sortie, la deuxième la globale.
    Il est préférable qu'un PIC puisse alimenter dix LED, sinon on ne pourrait pas faire grand chose avec .
    Dans ce cas nous avons bien une LED par sortie.
    Voici les infos constructeurs :
    Maximum current out of VSSpin .............................. .............................. .............................. .............................. ...300 mA

    Maximum current into VDDpin .............................. .............................. .............................. .............................. ......250 mA

    Input clamp current, IIK(VI< 0 or VI> VDD).......................... .............................. .............................. .............................. .. ±20 mA

    Output clamp current, IOK(VO< 0 or VO> VDD).......................... .............................. .............................. ........................ ±20 mA

    Maximum output current sunk by any I/O pin........................... .............................. .............................. ...................25 mA

    Maximum output current sourced by any I/O pin .............................. .............................. .............................. ..........25 mA

    Maximum current sunk by all ports .............................. .............................. .............................. .............................2 00 mA

    Maximum current sourced by all ports .............................. .............................. .............................. ........................200 mA


    Cordialement,

  5. A voir en vidéo sur Futura
  6. #5
    vincent66

    Re : Programmation PIC 18f2431 Chargeur de Batterie

    C'était bien sur ce point que je voulais venir, 10 led à 20mA chacune seront à l'extrême limite...
    Mieux vaut se limiter à 5mA par led...

    Vincent
    Leonardo était ingénieur "sans papier", et moi diplômé juste...technicien...

  7. #6
    Jefflafrite

    Re : Programmation PIC 18f2431 Chargeur de Batterie

    Bonjour,
    Merci pour vos réponses.
    Effectivement, nous avons fait attention à cela lors du placement des leds.
    Finalement la présentation est demain, personnes na des idées au niveau de la programmation ?
    Bonne journée,
    Cordialement.

Discussions similaires

  1. Type de batterie/Chargeur pour batterie d'onduleur.
    Par invitee17aeca5 dans le forum Électronique
    Réponses: 16
    Dernier message: 30/12/2012, 00h31
  2. problème de programmation mikroc 18f2431
    Par invite114c880e dans le forum Électronique
    Réponses: 3
    Dernier message: 08/06/2011, 11h47
  3. charger batterie voiture avec chargeur batterie au plomb
    Par macmah dans le forum Électronique
    Réponses: 5
    Dernier message: 15/03/2008, 18h41
  4. erreur 0X00 programmation PIC plus questions sur les PIC
    Par invite4a8ccabd dans le forum Électronique
    Réponses: 4
    Dernier message: 22/07/2007, 14h36
Découvrez nos comparatifs produits sur l'informatique et les technologies.