IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Embarqué Discussion :

Programmation PIC 18f2431 Chargeur de Batterie


Sujet :

Embarqué

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur Industriel Electro-Mécanique
    Inscrit en
    Septembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur Industriel Electro-Mécanique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8
    Points : 8
    Points
    8
    Par défaut 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|ADC_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_DIV_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
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut
    Salut
    ------

    Bon, tout d'abord, tu parles d'ami qualifié. Je pense qu'un "pro" de l'électronique aurait, sur un microcontrôleur, relié les LED dans l'autre sens, actives à l'état bas, surtout vu le datasheet d'un PIC, mais c'est un détail concernant tes problèmes.

    Pour ce qui est du code, on en revient au problème du C qui incite à gaspiller des ressources. En effet, quand on voit ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return(Read_ADC()*36.0/255.0);
    On voit bien qu'on oblige le PIC à réaliser une opération mathématique, sur des flots en plus (très lourd), pour ensuite "s'amuser" à comparer ce résultat avec une constante exprimée en float.

    N'importe quel programmeur programmant en langage d'assemblage aurait vu la surcharge d'opérations à réaliser en pure inutilité, puisqu'en fait :

    - Le rapport de conversion entre valeur analogique et tension est une constante

    - Les comparaisons s'effectuent également sur des constantes.

    Du coup, plutôt que de convertir la tension analogique en valeur float puis de comparer avec une autre valeur float, il suffisait de ne pas convertir la valeur lue et de la comparer avec les constantes précalculées par le compilateur, genre

    if (valeurBrute == (138 * ConstConversionMv))
    ...

    Le PIC n'a strictement plus aucune opération mathématique à effectuer, la conversion s'effectuant à la compilation par le compilateur, et le code restant aussi lisible. On peut même utiliser directement des defines vu le faible nombre de valeurs de comparaison.

    Mais bon, de nouveau, pour un programme "qui a le temps", ça n'a pas d'importance sur le fonctionnement. Mais si on avait autre chose à faire, on gaspillerait ici plus de 90% du temps de fonctionnement pour des opérations inutiles, surtout qu'il s'agit de programmes didactiques dans le cadre d'un enseignement, où il faut éviter de prendre de mauvaises habitudes.

    Pratiquer de façon élégante permet quand même dans la foulée de résoudre ton problème de conversion.

    Ensuite, sur le fond du fonctionnement. Tu établis la tension de la batterie en mesurant sa tension de départ. Ça veut dire que ton chargeur est dans l'incapacité de charger une batterie vide, c'est quand même assez dérangeant.

    De même, il est incapable de charger une batterie 24V qui sera déchargée sous la barre des 15V, c'est encore dérangeant.

    Donc, je dirais qu'il y a déjà à la base un défaut de conception ou de raisonnement.

    Concernant Isis, il ne faut jamais se fier à ce genre de simulateur pour déterminer le fonctionnement réel d'un composant programmé. Parfois ça fonctionne, d'autre fois non, et encore d'autres fois ça fonctionne partiellement. Ma boîte mail est pleine de messages indiquant qu'une application fonctionne sur prototype mais pas sur isis, ou même le contraire, la simulation étant approximative.

    Un simulateur peut aider au départ à prendre des décisions (encore que...), mais au final il faut quand même toujours tester sur une vraie carte prototype (du moins, c'est mon avis).

    Pour ton schéma, le condensateur de 1000µF introduit quand même une constante de temps relativement importante, plus grande que le délai en fin de boucle. As-tu calculé correctement cette valeur?

    Il manque les condensateurs de découplage sur le PIC et le condensateur sur le 7805 (sauf si C3 est très très près du 7805 auquel cas on tolère son absence).

    Je m'explique mal les deux zener D11/D12 dont la tension de seuil inverse n'est pas indiquée. Elles pourraient mener à charger partiellement la batterie sans passer par Q5, je ne comprends pas l'intérêt, surtout que ça risque d'empêcher la détection de l'absence de batterie selon ton programme.

    Il faudrait revoir ton pont diviseur pour profiter de la pleine plage de tension. Tu utilises par programme une tension max de 28.8V. Ça donne un rapport de 28.8/5 = 5.76 alors que tu utilises un rapport de 7.

    Le quartz est inutile pour une application de ce genre qui n'a aucun besoin de temporisations précises ni de vitesse de traitement.

    La résistance R1 ne sert pas à grand chose, le PIC avec ses LEDs va décharger le condensateur bien plus rapidement que cette résistance jusqu'à une tension suffisamment basse.

    Le relais est connecté directement sur une pin du PIC, sans aucune protection contre l'extra-courant de rupture. Si la bobine n'est pas d'une impédance suffisante et que le relais n'est pas pourvu d'une diode de protection interne, c'est risqué pour le PIC, et c'est au minimum un risque de dysfonctionnement aléatoire (resets intempestifs du PIC). Sans compter que vu que le courant de la bobine risque quand même d'être "limite" par rapport au courant admissible de la pin, et vu que le relais à besoin d'une tension minimale, il aurait fallu commander le relais par mise à la masse et non sur niveau haut.

    La conversion A/N sur un 18F, c'est en 10 bits, pas en 8 bits, sauf si on a décidé volontairement d'aligner le résultat à gauche et d'ignorer le registre de poids faible (on a le choix au niveau des registres du PIC). Mais j'ignore comment ta librairie C opère à ce niveau.

    Le MosFet semble monté en suiveur de tension. Vu R2/R3 qui est un diviseur de tension de rapport approximatif de 10, la conduction de Q1 ne fait que chuter la tension de grille de Q5 de 10%. Tu as vérifié le fonctionnement de cette partie?

    Le fusible de 15A permet une consommation de 3400W, autant dire que le transfo sera rôti avant qu'il n'entre en action, surtout qu'il n'y a aucun fusible pour protéger le secondaire d'une défaillance du pont de diode.

    Tu es sûr que ton ami est "qualifié"?

    Pour finir, tu indiques que la simulation n'est pas très bonne, tu aurais du préciser exactement en quoi.

    Il peut y avoir d'autres problème, j'ai jeté un oeil rapide.

    A+
    Claude

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur Industriel Electro-Mécanique
    Inscrit en
    Septembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur Industriel Electro-Mécanique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Bonsoir,
    Merci beaucoup pour cette réponse très complète Claude.
    Enfaite, mon groupe avait déjà réaliser le circuit, et il y a jeté un oeil. Mais celà a été fait de façon rapide. C'est pourquoi il a pu y laisser des erreurs. Ensuite, j'ai pu mal interpréter ses conseils.
    Je vais essayer d'y regarder.
    Bonne soirée.

Discussions similaires

  1. aide pour Programmation pic
    Par houcem88 dans le forum Réseau
    Réponses: 1
    Dernier message: 23/02/2013, 11h32
  2. Problème chargeur de batterie
    Par bambouboom dans le forum Windows 7
    Réponses: 1
    Dernier message: 25/10/2010, 13h42
  3. Programmation PIC 16F873
    Par ffopic dans le forum Général Java
    Réponses: 0
    Dernier message: 11/11/2009, 09h21
  4. Réponses: 7
    Dernier message: 08/05/2009, 13h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo