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
-----