routeur pour autoconso en triphasé [dev]



Vous pensez être victime d'une arnaque au photovoltaïque ?
http://victime-photovoltaique.fr/


stephG38
Messages : 150
Enregistré le : 21 mars 2018 19:36
Departement/Region : 38
Professionnel PV : Non

Re: routeur pour autoconso en triphasé [dev]

Messagepar stephG38 » 05 mai 2019 19:19

Grâce a toi et Pascal ! :D
Autoconso Tri avec 8 panneaux + MO M215 + 2 Routers sur ECS 300l
Ma fiche BDPV :
https://www.bdpv.fr/fr/ficheUtilisateur.php?util=stephg38

silicium81
Membre GPPEP
Membre GPPEP
Messages : 2353
Enregistré le : 04 mars 2009 01:00
BDPV : silicium81
Departement/Region : 81000
Professionnel PV : non
Localisation : 81

Re: routeur pour autoconso en triphasé [dev]

Messagepar silicium81 » 14 sept. 2019 10:03

Bon, petit bilan des progrès du routeur triphasé construit autour d'un compteur a disque.
Le ballon ecs electrique est installé en amont du chauffe eau gaz pour absorber le surplus et j'ai installé la moitié des panneaux
Le e-compteur triphasé à disque est aussi en place en amont du tableau électrique.
La carte arduino est en place pour router vers le ballon si le disque veut tourner a l'envers.
Image
Hier ça routait correctement, dès que le disque reculait, la puissance de routage augmentait rapidement pour stabiliser le disque a l'arrêt, le linky indiquait alors une injection que je n'ai pas quantifié. En fonction de celle ci, je decalerai peut être le point d'équilibre pour ne pas arrêter le disque... je ferai un bilan ce soir.
Modifié en dernier par silicium81 le 14 sept. 2019 16:24, modifié 2 fois.
Producteur d'électricité depuis le 17-08-2009 2940Wc en Rec Solar, SMA3000 TL-20, Intersole
+ 14,4kWc en Sunpower, SMA7000HV, Bac Acier (20 MWh produits par an)
BDPV 3kWc et sujet
BDPV 14,4kWc et sujet
Mon petit forum technique http://vae-tech.forumactif.org/

stephG38
Messages : 150
Enregistré le : 21 mars 2018 19:36
Departement/Region : 38
Professionnel PV : Non

Re: routeur pour autoconso en triphasé [dev]

Messagepar stephG38 » 14 sept. 2019 10:08

Hello
Super ça avance !
Il n'y a pas de ssr ?
Que fait l'arduino au juste ?
Merci pour le partage
Stéphane
Autoconso Tri avec 8 panneaux + MO M215 + 2 Routers sur ECS 300l
Ma fiche BDPV :
https://www.bdpv.fr/fr/ficheUtilisateur.php?util=stephg38

silicium81
Membre GPPEP
Membre GPPEP
Messages : 2353
Enregistré le : 04 mars 2009 01:00
BDPV : silicium81
Departement/Region : 81000
Professionnel PV : non
Localisation : 81

Re: routeur pour autoconso en triphasé [dev]

Messagepar silicium81 » 14 sept. 2019 10:13

Si evidemment qu'il y a un ssr, l'arduino agit sur la consigne de découpage de phase du ssr en fonction de la vitesse du disque qui a été équipé d'un codeur incrémental de 1000pts par tour (résolution de 7,5 mWh pour le type de compteur que j'ai utilisé)
j'ai decrit le systeme plus haut.
Producteur d'électricité depuis le 17-08-2009 2940Wc en Rec Solar, SMA3000 TL-20, Intersole
+ 14,4kWc en Sunpower, SMA7000HV, Bac Acier (20 MWh produits par an)
BDPV 3kWc et sujet
BDPV 14,4kWc et sujet
Mon petit forum technique http://vae-tech.forumactif.org/

stephG38
Messages : 150
Enregistré le : 21 mars 2018 19:36
Departement/Region : 38
Professionnel PV : Non

Re: routeur pour autoconso en triphasé [dev]

Messagepar stephG38 » 14 sept. 2019 10:15

Hello
Ok désolé j'avais pas regardé !
Beau boulot !
A bientôt
Stéphane
Autoconso Tri avec 8 panneaux + MO M215 + 2 Routers sur ECS 300l
Ma fiche BDPV :
https://www.bdpv.fr/fr/ficheUtilisateur.php?util=stephg38

silicium81
Membre GPPEP
Membre GPPEP
Messages : 2353
Enregistré le : 04 mars 2009 01:00
BDPV : silicium81
Departement/Region : 81000
Professionnel PV : non
Localisation : 81

Re: routeur pour autoconso en triphasé [dev]

Messagepar silicium81 » 16 sept. 2019 09:35

Le routeur fonctionne impec. L'index d'injection du linky n'a pas bougé depuis la mise en fonction du programme et j'ai arrêté la chaudière gaz :sun:
Le code actuel dans l'arduino:

Code : Tout sélectionner

// codeur avec 1008 impultions par tour
// Une seule entrée d'interruption utilisée pour le codeur
// résolution de 26W
// codeur sur 4(int) et 3(int) pour la détection du zéro secteur.
// contrôle de phase sur la sortie 5
//
//
// V3 ajout de la sortie série pour openlog

// include the library code:

#include <Adafruit_RGBLCDShield.h>
#include <utility/Adafruit_MCP23017.h>
#include <TimerOne.h> // Pour le timer 1

Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();  // gestion d'un module afficheur I2C (avec boutons)

#define ON 0x1
#define OFF 0x0

#define ENCODEURA 3
#define ENCODEURB 4
#define DETECT 2
#define Triac 5
#define minPhase 114 //valeur minimum du timer pour un retard de phase de 0° (Pmax)
#define maxPhase 255  //valeur maximale du timer pour retard de phase de 180° (Pmin)
#define dureeImpGachette 200  // La gachette du triac est à 1 pendant 200 µs

//PID constants
double kp = 2000;  //2000
double ki = 10;  //5
double kd = 10;
double time;

volatile int lastcount =0; // comptage de tick d'encoder  qui sera incrémenté sur interruption " On change " sur l'interruption matériel 0 qui se fait sur le pin 2
volatile int count =0;
volatile int compte =0; // comptage précédent
volatile byte laststate =0;  // etat précédent de l'encodeur
volatile byte phase=254;  //pas de retard de phase à l'initialisation
long wh;
long puissanceWatt;
long consignePuissance=0;
long out;
byte puissanceTriac=0;
boolean drapPid;
boolean drapSec;

unsigned long currentTime, previousTime;
long elapsedTime;
long error;
long lastError;
long input, output;
long setPoint=0;
long cumError, rateError;
int puissancePid;


void setup()
  {
  Serial.begin(9600);
  Serial.print("puissanceWatt");
  Serial.print("  ");
  Serial.print("puissanceTriac");
  Serial.print("  ");
  Serial.println("timeMs");
  lcd.begin(16, 2);     // set up the LCD's number of columns and rows:
  lcd.setBacklight(ON);
  pinMode(ENCODEURA, INPUT_PULLUP);
  pinMode(ENCODEURB, INPUT_PULLUP);
  pinMode(DETECT, INPUT_PULLUP);     //zero cross detect
  pinMode(Triac, OUTPUT);
  attachInterrupt(1,counter, CHANGE); // on crée l'interruption sur changement sur la pin 3 => interruption 1, la routine counter va se faire toute seule sans l'appeler à chaque changement d'état sur le pin 2
  attachInterrupt(0,zeroSec, RISING);  //on crée l'interruption sur front montant sur la pin 2
  Timer1.initialize(1000000); // On défini le timeur : 1000000 microseconds ( 1 sec - or 1Hz )
  Timer1.attachInterrupt(timerIsr); // attach the service routine here la fonction timerIsr est une routine qui va se faire automatiquement 1* par secondes sans l'appeler
  cli(); // Désactive l'interruption globale
  bitClear (TCCR2A, WGM20); // WGM20 = 0
  bitClear (TCCR2A, WGM21); // WGM21 = 0
  TCCR2B = 0b00000111; // Clock / 1024 soit 64 us et WGM22 = 0
  TIMSK2 |= (1<<0);       // Interruption locale autorisée par TOIE2
  sei(); // Active l'interruption globale
  }
 


void loop()
  {
    puissanceWatt=compte*26;
    lcd.setCursor(0, 0);
    lcd.print(count); lcd.print("p"); lcd.print(" "); lcd.print((count*7.5)/1008); lcd.print(" Wh   ");
    lcd.setCursor(0,1);
    lcd.print(puissanceWatt); lcd.print(" W ");lcd.print(puissanceTriac);lcd.print("   ");
    if (drapSec)          // une seconde c'est écoulé -> emission d'une trame série
    {
      time = millis();
      Serial.print(puissanceWatt);
      Serial.print("  ");
      Serial.print(puissanceTriac);
      Serial.print("  ");
      Serial.println(time);
      drapSec=0;
    }
     

//*******PID début

        input = puissanceWatt;                //consigne de puissance
        output = computePID(input);
        delay(100);
        puissanceTriac=output;
       
        phase=(((maxPhase-minPhase)*puissanceTriac)/255)+minPhase; // 0<puissanceTriac<255 ->  114<phase<254
//*******PID fin
}

long computePID(long inp){     
        currentTime = millis();                //get current time
        elapsedTime = (long)(currentTime - previousTime);        //compute time elapsed from previous computation
          error = setPoint - inp;                                // determine error
          cumError += error * elapsedTime;                // compute integral
         
          if (cumError>2600000)   //2500000
          {
            cumError=2600000;
          }
          if (cumError<0)
          {
            cumError=0;
          }

         rateError = (error - lastError)/elapsedTime;   // compute derivative
               
          out = (kp*error) + (ki*cumError) + (kd*rateError);                //PID output     
       

        lastError = error;                                //remember current error
        previousTime = currentTime;                        //remember current time
        puissancePid=out/100000;
 
        if (puissancePid<0)
        {
          puissancePid=0;
        }
        if (puissancePid>255)
        {
          puissancePid=255;
        }
       
      return puissancePid;                                        //have function return the PID output
}

ISR(TIMER2_OVF_vect)    // dépassement du timer 2, il faut générer la commande de la gachette du triac
{
  TIMSK2 = TIMSK2&0b11111110;      // pas d'autre interruption (on bloque l'it de dépassement)
  if (phase!=minPhase) digitalWrite(Triac, 1);   //si phase au min pas d'impultions à 1
  delayMicroseconds(dureeImpGachette); // largeur de l'impultion de commande de 200 us
  if (phase!=maxPhase-1) digitalWrite(Triac, 0);   //si phase au max pas d'impulsions à 0
}


// Comptage des pulses du codeur

void counter()       // On entre ici s'il y a une interuption sur la broche 3 (sur changement d'état logique)
{
  byte state=PIND;  // state = port D (PIND est le registre de lecture du port D)
 
  state|=B11100111;  // masque OU pour ne regarder que les changements sur 3 et 4
  if( state!=laststate)
  {
    (((state&8)>>3)^((state&16)>>4))?count++:count--;
    laststate=state;
  }
}

void zeroSec()        // passage à zéro du secteur (toute les 10ms)
{
TIMSK2 = TIMSK2|0b00000001;   //autoriser l'interruption d'overflow du timer 2
TCNT2 = phase;                //valeur de départ du comptage
}

// Une seconde c'est écoulée
void timerIsr()
{
    compte=count-lastcount; // nombre de tick en 1s dans compte
    lastcount=count; // comptage précédent
    drapSec=1;       // drapeau seconde a 1 pour indiquer qu'une seconde c'est écoulé et emettre une trame série
}


Je mettrai des courbes dès que les enregistrements seront significatifs.
Producteur d'électricité depuis le 17-08-2009 2940Wc en Rec Solar, SMA3000 TL-20, Intersole
+ 14,4kWc en Sunpower, SMA7000HV, Bac Acier (20 MWh produits par an)
BDPV 3kWc et sujet
BDPV 14,4kWc et sujet
Mon petit forum technique http://vae-tech.forumactif.org/


Retourner vers « Divers pour installation »