Neue Software für Grid Tie Inverter

Ladeelektronik, Messgeräte, Steuerungen etc.

Re: Neue Software für Grid Tie Inverter

Beitragvon vasonline » Mo 13. Mai 2013, 19:50

Hi Jörg & Nik.

Thank you for the detailled answer.
I can understand you do not want to open it up if it's working fine :)
Will do some research. But at this point: I'm already extremely happy the code
develloped on my breadbord runs fine on the "real" GTI300W. (without actually driving the AC FET's. But I replaced the fuse, disconnected the PWM pin from the µC to the UCC, so it thinks all is well, without running anything ;) )

I'm going to experiment with two waveforms.
Currently I have set up the original waveform in a 10ms period.

I'll try to move some of the "0" "'0" "0" "0" before and after waveform "A" and waveform "B" to better compensate/match it with the optocoupler/grid.
But if that does not give enough margin, Maybe then I'll make the period a (little) bit smaller, to account for the 1 ms dead time?
If that does not cause too much ill side effects?
vasonline
 
Beiträge: 60
Registriert: Sa 2. Feb 2013, 20:46

Re: Neue Software für Grid Tie Inverter

Beitragvon vasonline » Mi 15. Mai 2013, 14:36

I got it pretty good lined up with these modifications:

Bild

In the code I removed some of the beginning & the end of the sine wave. This was done to make it fit, and have a 1ms before and after.
Also to compensate for the optocoupler --> you'll see the SineA starts earlier then SineB.
Should be Ok?

I did not change the period of 10ms.
Do you also use the (normal) period of 10 ms?


Code: Alles auswählen
const unsigned int SinusA[100] = {
   126, 135, 143, 152, 160, 167, 175, 182,
   189, 196, 202, 208, 214, 219, 224, 229, 233, 237,
   240, 243, 246, 249, 251, 252, 253, 254, 255, 255,
   255, 255, 254, 253, 252, 251, 249, 246, 243, 240,
   237, 233, 229, 224, 219, 214, 208, 202, 196, 189,
   182, 175, 167, 160, 152, 143, 135, 126, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    };

// Tweede sinus om beter aan de optocoupler aan te passen.
const unsigned int SinusB[100] = {
   0, 0, 0, 0, 0, 0, 0,
   0, 126, 135, 143, 152, 160, 167, 175, 182,
   189, 196, 202, 208, 214, 219, 224, 229, 233, 237,
   240, 243, 246, 249, 251, 252, 253, 254, 255, 255,
   255, 255, 254, 253, 252, 251, 249, 246, 243, 240,
   237, 233, 229, 224, 219, 214, 208, 202, 196, 189,
   182, 175, 167, 160, 152, 143, 135, 126, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 
    };
vasonline
 
Beiträge: 60
Registriert: Sa 2. Feb 2013, 20:46

Re: Neue Software für Grid Tie Inverter

Beitragvon vasonline » So 19. Mai 2013, 20:03

Hi Jörg (e.a)

As you can see in my topic. It goes Ok so far.

One thing I noticed is that the formula...
Code: Alles auswählen
CCPR1L =  (PulsBreedte) * (SinusB[SineIndex++] ) >>12  ;  // Installeer de volgende pulsbreedte uit de sinus constante * PulsBreedte.

... which work Ok. (thanks for the help btw! :) )...
... takes quite a bit of cpu time on the little PIC microcontroller.

I noticed this because of the grid detection, it normally does 100 cycles (every 100 µS). It reduced to around 77 cycles with PWM on.
Did a bit of searching, and found it is by the multiplication ( * ). Apparantly that takes a lot of cycles on the pic.

Just for fun I did a test and added a ( + ) -> was way faster, but then the formula did not produce the desired waveform.

Is there an alternative that costs less cpu cycles and gives more or less same result?

Greetings & many thanks in advance
vasonline
 
Beiträge: 60
Registriert: Sa 2. Feb 2013, 20:46

Re: Neue Software für Grid Tie Inverter

Beitragvon JBecker » Di 21. Mai 2013, 22:14

Concerning your calculation:

I do not think that it is necessary to have the pulse width at a higher resolution than 8 bits, and as far as I can see in your Code, you just use 8 bits width:
if( PulsBreedte<255 ) //Suggestion by Jörg
PulsBreedte++;

So, use an unsigned char for PulsBreedte, it is big enough.
The same goes for the sine table. It is not necessary to use unsigned int there, just use unsigned char.

Then the multiplication is unsigned char * unsigned char, which should be around a factor of 4 faster than what you do now.
( the calculation still has to be done as follows: CCPR1L = (unsigned int)(PulsBreedte) * (SinusB[SineIndex++] ) >>12;)

Shifting by 12 bits is also slow (and I do not understand why you do that). You could try to shift by 8 bits first and than by another 4 bits.
But, if you multiply a value with maximum 8 bits (PulsBreedte) and another value with maximum 8 bits (sine value), the result will have maximum 16 bits. If you shift this by 12 bits to the right, you get maximum 4 (!) bits resolution in your result. Is this really what you want to do?

BR, Jörg.
Benutzeravatar
JBecker
 
Beiträge: 76
Registriert: Fr 11. Mai 2012, 14:13
Wohnort: Kirchlengern

Re: Neue Software für Grid Tie Inverter

Beitragvon vasonline » Do 23. Mai 2013, 20:49

Hi Jörg,

Many thanks for your input :)
I appreaciate it a lot. And I'm learning from it :)

- I will correct the char vs int in the variables.

Now, The reason why I bit shifted >> 12. was the following:

"It went too fast" for each step. (with >> 8)

If I compare the PWM with the saved original, on my scope...
...then the original, even at maximum power, it's pulses are stil relativly small. Even at the center of
the sine.

So I had to make the result of the calculation very small. This is probably not ideal, but at that time I could not come up with something better.
I tought of generating a sine wave with lower values, but did not do that. (I have found a program that generates the values)
Maybe that is a better idea?
Just my tought.
vasonline
 
Beiträge: 60
Registriert: Sa 2. Feb 2013, 20:46

Re: Neue Software für Grid Tie Inverter

Beitragvon vasonline » So 26. Mai 2013, 10:52

- With a lower value sine wave & defined as char, I am able to bit shift >>8
- CPU load is now under control.
- I reorganised some of the code, for faster execution.

Thanks for helping me :)
It's been a long time since I wrote anything in C.

Code: Alles auswählen
//   *************************************************************************************************************************
//   Grid Tie Inverter Code voor de GTI300W.
//   Microchip PIC 16F716.
//   MPLAB IDE.
//   Complier: Hi-Tech C.
//   
//   *************************************************************************************************************************

#include <htc.h>

__CONFIG (FOSC_HS & WDTE_OFF & BOREN_ON & BODENV_40 );         // Instellen PIC 16F716 Externe Oscillator. Kan ook met GUI -> Configure -> Configuration bits

#define _XTAL_FREQ 16000000           // 16Mhz kristal op de PIC/GTI.

// Functies

void CheckVolt(void);
void CheckFan(void);
void DoeMPP(void);
void StartOp(void);
void ADCInit(void);
void Timer0Initialisatie(void);
void Timer1Initialisatie(void);
void Timer2Initialisatie(void);
void Controle(void);
unsigned char ADCLees(unsigned char ch);


// Variabelen
unsigned char LeesVolt;
unsigned char VoltOk;
unsigned char LeesGrid;
unsigned char LeesAmp;
unsigned char LeesAmp1;
unsigned char LeesAmp2;
unsigned char LeesTemp;
unsigned char GridOk;
unsigned char WerkModeOk;
unsigned char PwmAan;
unsigned char PwmPeriode;
unsigned char PwmPeriode1;
unsigned char PwmPeriode2;
unsigned char PulsBreedte;         
unsigned char GridVorigeWaarde;
unsigned char AmpVorigeWaarde;
unsigned char GridPeriodeTeller;
unsigned char GridNulDoorgang;
unsigned char SineCyclusVoltooid;

unsigned int MppVermogenVorigeWaarde;
unsigned int MppVermogen;
unsigned char MpptGevonden;
unsigned char StapTerugGezet;

unsigned char MppVertragingTeller;
unsigned char Vertraging1;
unsigned char WerkVertragingTeller;
unsigned char FanVertragingTeller;
unsigned char SinusKeuze;
unsigned char SineIndex = 0;       // sine table index, 0..80


#define LaagVoltage 53        // ACD = Binair 76543210. Max 255, min 0 (byte 0b00000000) Vref=5V / 53 = 1.05V = 10.5V
#define HoogVoltage 153         // 153 = 2.95V = 28V
#define FanOpstartWaarde 63      // 63 = 1.24V Fan aan als deze onder deze waarde komt. (de originele firmware werkte zo)
#define MppVoltWaarde 86      // Mpp punt manueel ingeven van de 18V zonnepanelen (17V)
#define NetDetectieTimeOut   110   // Netdetectie elke 100µs / 10ms = 100. 110 Ok op de echte GTI300W, 120 op het prototype.
#define MppVertraging 8         // Vertraging die nodig is om de mpp tracker uit te voeren: 0.131 * 8 = 1 sec.
#define FanVertraging 16      // Vertraging die nodig is om de ventilator code uit te voeren 0.131 * 16 = 2 sec.
#define WerkVertraging 20      // Opstartvertraging als alle voorwaarden om te werken voldaan zijn 0.131 * 20 = 2.6 sec.      


// 'Sinustabelle' voor de modulatie van de pulsbreedte // Gebaseerd op GTI_LCD_EE.c // Based on GTI_LCD_EE.c
const unsigned char SinusA[80] = { 0, 0, 12, 13,
14, 14, 15, 15, 16, 17, 17, 18, 18, 19, 19, 20,
20, 21, 21, 22, 22, 22, 23, 23, 23,
24, 24, 24, 24, 24, 25, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 24,
24, 24, 24, 24, 23, 23, 23, 22, 22, 22,
21, 21, 20, 20, 19, 19, 18, 18, 17,
17, 16, 15, 15, 14, 14, 13, 12, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0
};

// Tweede sinus om beter aan de optocoupler aan te passen.
const unsigned char SinusB[80] = {
0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 12, 13, 14, 14, 15,
15,  16, 17, 17, 18, 18, 19, 19, 20,
20, 21, 21, 22, 22, 22, 23, 23, 23,
24, 24, 24, 24, 24, 25, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 24,
24, 24, 24, 24, 23, 23, 23, 22, 22, 22,
21, 21, 20, 20, 19, 19, 18, 18, 17,
17, 16, 15, 15, 14, 14, 13, 12, 0
};




void main()
{



StartOp();
ADCInit();
Timer0Initialisatie();
Timer1Initialisatie();
Timer2Initialisatie();


 

for (;;)
   {
   CheckVolt();
   CheckFan();
   Controle();
   DoeMPP();
   }
}


/////////////////////////////////////////////////////////////////////////////////////////////////////////////


void StartOp(){
   //    XX  XX  XX  RA4 RA3 RA2 RA1 RA0
   TRISA=0b11111111; // declare porta als input  RA0-RA3
   //    RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
   TRISB=0b00101000; // opgeven portb als output  RB0->RB2, RB4-RB7. RB5 input = NET. RB3 input omdat bij output de PWM start na de PWMInit().
   GIE=1;        //Enable Global Interrupt
   PEIE=1;      //Enable Peripal Interrupts   The PIR registers contain the interrupt flags for the “peripheral” interrupt sources, which include: The ADC, UART, CCP, USB, TMR3, TMR2, TMR1, and TMR0 modules.
   RB4=1;      // Shutdown UCC AAN.
   RB0=0;      // Fan AF.
}



// Main Interrupt Service Routine (ISR)
void interrupt isr(void){

   if (TMR2IF == 1) {         // PWM.
      
      TMR2IF = 0;             // Clear TMR2 interrupt flag  Om TMR2 interrupt vlag actief te zetten.   


      //*** PWM ***
      //----------------------------------------------------------------------------------------

      if ( WerkModeOk == 1 ) {

         if ( GridNulDoorgang == 1 ) {
               //CCPR1L =  0;         // Geen puls tijdens de nuldoorgang.
            SineIndex = 0;        // reset index at end-of-period.
         }
   
         if (SineIndex < 80) {
   
            if ( SinusKeuze == 1) {
                  CCPR1L = (PulsBreedte) * (SinusA[SineIndex++] ) >>8  ;  // Installeer de volgende pulsbreedte uit de sinus constante * PulsBreedte.
                                                      // Bit shiften om te kunnen varieëren. Anders is het resultaat te groot (255 stappen, 8 bits)
            }

            if ( SinusKeuze == 2) {
                  CCPR1L = (PulsBreedte) * (SinusB[SineIndex++] ) >>8   ;  // Installeer de volgende pulsbreedte uit de sinus constante * PulsBreedte.
                                                      // Bit shiften om te kunnen varieëren. Anders is  het resultaat te groot (255 stappen, 8 bits)
            }

         }

      }

   }



   
   if (TMR1IF == 1) {         //De MPP tracker & Startvertraging & Fanvertraging aansturen per Timer1      
      TMR1IF = 0;   

      TMR1L = 0; // preset for timer1 LSB register (16 bit teller, deel 2, 8 bit). Deze onthoud dit anders niet
      TMR1H = 0; //preset for timer1 MSB register (16 bit teller, deel 1, 8 bit). Deze onthoud dit anders niet.


      
      if( MppVertragingTeller<255 )                        
         MppVertragingTeller++;          //Teller voor Mppvertraging. Timer 1 is 0,1s, wat nog iets te snel is
                              //Daarom: 0,131 * 8  (1s) de mpp tracker uitvoeren.
                              //Fan: 0,131 * 20 (2s) elke 2ms de fan controle uitvoeren.
                              //Werkvetraging: 0,131 * 30 = 3s.

      if( WerkVertragingTeller<255 )   
         WerkVertragingTeller++;


      if( FanVertragingTeller<255 )
         FanVertragingTeller++;   


   }






   if ( TMR0IF == 1 ) {      
      TMR0IF = 0;            //Clear de Timer0 interrupt vlag.


      // *** Netdetectie ***
      //----------------------------------------------------------------------------------------
      
       GridVorigeWaarde = LeesGrid;
      LeesGrid = RB5;       // Lees de huidige waarde van de netinvoer op RB5 (digitale puls) in.

       if (GridVorigeWaarde > LeesGrid) {
      // 1 vs 0  ---___
      GridOk = 1;

      GridPeriodeTeller = 0;      // Begin van een nieuwe lage periode.
      GridNulDoorgang = 1;      // Nuldoorgang = JA
      SinusKeuze = 2;            // De eerste sinus activeren.
      
      //RB4 = 1;                  // Controle
      }

       if (GridVorigeWaarde < LeesGrid) {
      // 0 vs 1  ___---
      GridOk = 1;


      GridPeriodeTeller = 0;      // Begin van een nieuwe hoge periode.
      GridNulDoorgang = 1;      // Nuldoorgang = JA
      SinusKeuze = 1;            // De tweede sinus activeren.

      //RB4 = 0;               // Controle
      }
   
      if (GridVorigeWaarde == LeesGrid) {

         // 0 vs 0 ______ of 1 vs 1 ------
         // Tellen of het niet langer dan 10ms duurt, want anders hebben we geen grid (!) Dan onmiddelijk uitschakelen.
         // Anders Ok. 100µs / 10ms = 100. Tijdens het werken hoger belasting schijnbaar dan maar 77 de lus doorlopen. Anders inderdaad 100.
         GridNulDoorgang = 0;      // Nuldoorgang = NEE
         GridPeriodeTeller++;      
            if (GridPeriodeTeller > NetDetectieTimeOut) {
               GridOk = 0;
               PulsBreedte = 0;
               WerkModeOk = 0;
               RB4 = 1; // UCC shutdown // Controle      
               GridPeriodeTeller = 0;
             }

      }

   }

}



void Controle(){
   if (VoltOk == 1 && GridOk == 1 )
      {      
         if (WerkModeOk == 0) {         // Als dit de eerste keer starten is, even wachten.
            WerkVertragingTeller=0;
              WerkModeOk = 1;
          }

         if (WerkModeOk == 1 & WerkVertragingTeller > 30){
      
            RB4 = 0;       // UCC Shutdown AF
              TRISB3 = 0;     // Zet RA3 als output (PWM aan)
            RB1=1;          // Groene LED.   // LED AAN.
            RB2=0;         // Rode LED.
         }
      }

   if (VoltOk == 1 && GridOk == 0) {
      WerkModeOk = 0;         // WerkMode 0, als Net & Volt niet Ok is. Globale AAN/UIT Schakelaar.
       PulsBreedte = 0;        // Pulsbreedte af.
         TRISB3 = 1;           // Zet RA3 als input (PWM volledig uit)
      RB4 = 1;             // UCC Shutdown.
      MppVertragingTeller = 0;// Tijd om de Mpptracker te draaien.


       //Extra: Knipperen bij geen grid?
      //------------------------------
      //__delay_ms(200);
      RB2=1;   //Rode LED

      RB1=0;  // Groene LED

      }   

   if (VoltOk == 0 && GridOk == 1) {
      
      WerkModeOk = 0;         // WerkMode 0, als Net & Volt niet Ok is. Globale AAN/UIT Schakelaar.
        PulsBreedte = 0;        // Pulsbreedte af.
         TRISB3 = 1;           // Zet RA3 als input (PWM volledig uit)
      RB4 = 0;             // UCC Shutdown Niet AAN. Dit is zo in de originele firmware.
      MppVertragingTeller = 0;// Tijd om de Mpptracker te draaien.


      RB2=1;   //Rode LED
      RB1=0;  // Groene LED
      }   

   if (VoltOk == 0 && GridOk == 0) {
      
      WerkModeOk = 0;         // WerkMode 0, als Net & Volt niet Ok is. Globale AAN/UIT Schakelaar.
        PulsBreedte = 0;        // Pulsbreedte af.
         TRISB3 = 1;           // Zet RA3 als input (PWM volledig uit)
      RB4 = 1;             // UCC Shutdown AAN
      MppVertragingTeller = 0;// Tijd om de Mpptracker te draaien.


      RB2=1;   //Rode LED
      RB1=0;  // Groene LED
      }

}


void DoeMPP() {

      if (MppVertragingTeller > MppVertraging & WerkModeOk == 1) {
      MppVertragingTeller = 0;            //Vertragingsteller terug op nul zetten.
      
      //if (PulsBreedte == 0){
        //   PulsBreedte = 14;       //Omwille van de PWM bit shifting in de formule doen de eerste 10 stappen niets,
        //}                               //deze slagen we over om het lange wachten bij het opstarten te vermijden.
      

   
      // MppVermogenVorigeVorigeWaarde = MppVermogenVorigeWaarde;

      // MppVermogenVorigeWaarde = MppVermogen;
      // MppVermogen = (PulsBreedte * LeesVolt);
      
      


         RB1=0;    // Groene LED UIT.

                              
         if (  (LeesVolt  > MppVoltWaarde)   & MpptGevonden == 0 ) {
            
            
            if( PulsBreedte<255 )      //Suggestion by Jörg
            PulsBreedte++;

         }


         if  (LeesVolt <= MppVoltWaarde ) {
            MpptGevonden = 1;
         }


         if (MpptGevonden >= 1) {      //Als het mppt punt gevonden is, dit 10 seconden vasthouden, en dan opnieuw evalueren.

            if (LeesVolt < MppVoltWaarde ) {   
               if (PulsBreedte>0)      //Veiligheid
               PulsBreedte--;         //Mocht er door de weerstomstandigheden toch een terugval zijn in vermogen, dan stellen we dit bij om het uitvallen van de omvormer te (ver)minderen.
            }
            
            MpptGevonden++;

         
            if (MpptGevonden > 10)
               MpptGevonden = 0;
            }
      }

}

void CheckVolt(){

   LeesVolt= ADCLees(1);   //RA1 Lezen.
   
   if (LeesVolt >= LaagVoltage & LeesVolt <= HoogVoltage )
      {
      VoltOk=1;   
      }
   else
   {
      VoltOk=0;
   }

}

void CheckFan(){

   if(FanVertragingTeller > FanVertraging){
   FanVertragingTeller = 0;

      LeesTemp = ADCLees(0);    //RA0 Lezen.
      
      if (LeesTemp < FanOpstartWaarde)
         {
         RB0=1;      //Fan aan.
         }
      else
         {
         RB0=0;      //Fan uit.
         }
      }
}


void Timer1Initialisatie() {         // Netcontrole

   //   **** Timer 1 ***, Elke 0.131s Aandrijven tellers mppvertraging, fanvertraging, werkvertraging.

   TMR1L = 126; // preset for timer1 LSB register (16 bit teller, deel 2, 8 bit)
   TMR1H = 60; //preset for timer1 MSB register (16 bit teller, deel 1, 8 bit)

   TMR1CS = 0;            // Geen Teller mode. Interne klok.
   T1CKPS0 = 1;  // bit 4
   T1CKPS1 = 1;  // bits 5-4  Prescaler Rate Select bits // 1:1 = prescaler 1:8
   TMR1IF = 0;            // Timer1, op nul zetten.
   TMR1ON = 1;            // Timer1 aan.
   TMR1IE = 1;            // Timer1 interrupt aan.
 

}



void Timer2Initialisatie(){

   // *** PWM *** elke 100µS
   PR2 = 100;              // PWM Periode 50 x prescale 4 100Hz. Via PIC Timer calculator.
   CCP1CON = 0b00001100;     // '00------' unimplemented bits   
                             // '--00----'   DC1B1:DC1B0 duty cycle bits   
                             // '----1100' active hi PWM mode P1A B C en D actief, we hebben alleen A nodig. Aan te passen? Zie datasheet.
   TMR2IF = 0;             // TMR2IF wissen, op nul zetten. Deze komt op 1 van zodra PR2 = TMR2. (één PWM puls)
   TMR2IE = 1;             // Timer2 interrupt aan.
   T2CON = 0b00000001;       // '0-------' unimplemented bit   
                             // '-0000---' TOUTPS<3:0>, postscale 1   
                             // '-----1--' TMR2ON, turn Timer 2 on   
                             // '------01' T2CKPS<1:0>, prescale 4
   TMR2ON = 1;
   
   PulsBreedte = 0;

   
}


void Timer0Initialisatie(){

    //Timer0.
   TMR0 = 56;            //Tijd van de teller0. Elke 100µS - Netcontrole
   
   T0CS = 0;            //Klok bron selecteer interne klok.

   PSA=0;               //PreScaler Assigment bit: de prescaler hieronder is van toepassing op de Timer0
                     //Ofwel is ie bij timer0 ofwel bij de wdt. 1 = WDT, 0 = Timer0 (1:2)
   PS0 = 0;            //Prescaler.
   PS1 = 0;            //Prescaler.
   PS2 = 0;            //Prescaler.

   TMR0IF = 0;            // Interrupt vlag op nul.
   T0IE = 1;            // Timer0 interrupt AAN.




}
                                                                                                                 


void ADCInit(){
   //         76543210
   ADCON0 = 0b10000000; // P.43 van de datasheet. Fosc/32
   ADCON1 = 0b00000000; // P.44 van de datasheet: Referentievoltage van Vdd gebruiken (5V) RA0->RA3 allemaal analoog.
}



unsigned char ADCLees(unsigned char ch)         //Fuctie om ADC te lezen: RA0-RA4 Zie datasheet voor CHS waarden
{
   if(ch>4) return 0;  // Ongeldige invoer: Tusssen 0 en 4

      switch(ch){
      case 0: CHS2=0b0;CHS1=0b0;CHS0=0b0;   //RA0
         break;
      case 1: CHS2=0b0;CHS1=0b0;CHS0=0b1;   //RA1
         break;
      case 2: CHS2=0b0;CHS1=0b1;CHS0=0b0;   //RA2
         break;
      case 3: CHS2=0b0;CHS1=0b1;CHS0=0b1;   //RA3
         break;
      case 4: CHS2=0b1;CHS1=0b0;CHS0=0b0;   //RA4
         break;
   }


   ADON=1;  // ADC Module aanzetten
   __delay_us(5); // Wachten tot de condensator geladen is. P43 datasheet

   GO_DONE=1;  //Start conversie
         while(GO_DONE); // Wachten op de het meetresultaat. GO_DONE gaat terug op nul als de pic klaar is met meten.
      
   ADON=0;  //switch off adc

   return ADRES;
}


vasonline
 
Beiträge: 60
Registriert: Sa 2. Feb 2013, 20:46

Re: Neue Software für Grid Tie Inverter

Beitragvon vasonline » Fr 7. Jun 2013, 19:54

Jörg (e.a),

I have a question about "how often" you read the voltage from the ADC.

If I read your code correctly, it's every 100µS ? (Same as grid)
I think I'm going to implement this also. Currenty were just reading voltage as much as we can in the main loop, which might be a bit excessive.

BTW: I found your source code very inspiring! :)
Very well done :)
vasonline
 
Beiträge: 60
Registriert: Sa 2. Feb 2013, 20:46

Re: Neue Software für Grid Tie Inverter

Beitragvon Totte » Fr 12. Jul 2013, 09:30

Hallo zusammen,

nach einiger Zeit Abstinenz habe ich es nun geschafft, den ATMEGA8_LCD Code von Badwater an meinen GTI300 (selbes Modell wie Bernhard verwendet) anzupassen.
-->#define PJ14V / #define P300W / #define _USE_LCD4x20

Beim Test zeigt sich nun folgendes Phänomen:
Beim Startup wird kurz im Display ausgegeben: VERSION 2.00.200, danach
solange die Einschaltspannung des GTI nicht erreicht ist, funktioniert die LCD Ausgabe, bspw. angezeigt bei Ue=10,5 Volt, 2.8W 41° UG=229V usw.
Fahre ich nun die Eingangsspannung hoch und der GTI beginnt ins Netz einzuspeisen, werden wilde Zahlen-/Zeichenkombinationen am Display ausgegeben.
Das führt dann bei weiterem Erhöhen zum Ausfall der Zeile 2 und 4 und danach zum kompletten Auszustand des Displays.
Die Versorgungsspannung am Display und am Schieberegister beträgt zu jeder Zeit 4,92V.
Erst ein Neustart der Eingangsspannung unterhalb der Einschaltschwelle führt wieder zu einer LCD Display Ausgabe.
Die Displayausgabe habe ich zum Test auf disp>=6 verlangsamt - das ändert aber nichts.
Wer hat eine Idee, wie ich hier den Fehler weiter eingrenzen und beheben kann?
Totte
 
Beiträge: 93
Registriert: Mi 28. Nov 2012, 15:08
Wohnort: Dresden

Re: Neue Software für Grid Tie Inverter

Beitragvon Stromer » Fr 12. Jul 2013, 14:33

Hallo
Ich würde auf vagabundierende HF Tipen :o , da der Inverter ja ähnlich wie ein Schaltnetzteil arbeitet.
Versuch doch mal eine kleine Drossel,3-4 Wdg. 0,5mm Lackdraht auf irgend etwas Ferrit mäßiges, davor u.dahinter 1nf nach Masse in die Plusleitung zu deiner Display Geschichte. Und auch an dem Messeingang mal 1nf nach Masse versuchen.
Dann müsste die Anzeige doch ruhiger werden.
Stromer
 
Beiträge: 9
Registriert: Fr 17. Mai 2013, 19:34

Re: Neue Software für Grid Tie Inverter

Beitragvon Totte » Fr 12. Jul 2013, 23:17

Hallo Stromer,

das Modell "Schaltnetzteil" war gut für mich - 5cm Abstand des Flachbandkabel und Schieberegister zum GTI haben geholfen und die fehlerhafte Darstellung ist beseitigt:
GTI300W_LCD.jpg
GTI300W_LCD.jpg (151.09 KiB) 16754-mal betrachtet

Sobald ich die Lochrasterplatine nach rechts näher an den GTI300W schiebe, erscheinen wieder die wilden Zeichen ... Abstand und Abschirmung sind hier echt Gold wert.
Totte
 
Beiträge: 93
Registriert: Mi 28. Nov 2012, 15:08
Wohnort: Dresden

VorherigeNächste

Zurück zu Elektronik für Windkraftanlagen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste

cron