Commit ab6b58e3 authored by AntoineC.'s avatar AntoineC.
Browse files

Upload new file

parent ce8259b3
// CODE ARDUINO POUR PROJET PLIBOO
// PLIBOO EST DÉVELOPPÉ SOUS LICENCE CERN OHL
// LES INFORMATIONS COMPLÉMENTAIRES ET EXPLICATIVES
// SE TROUVENT DANS LE FICHIER LISEZ-MOI.TXT JOINT AVEC CE FICHIER
#include <PID_v1.h>
#include <LowPower.h>
// DÉCLARATION DES CONSTANTES ///////////////
const int FICHE_A0 = A0;
const int FICHE_3 = 3;
const int FICHE_11 = 11;
const float PONT_DIV_R1 = 390000.0;
const float PONT_DIV_R2 = 6800.0;
const float PONT_DIV_DIVISEUR = float((PONT_DIV_R1 + PONT_DIV_R2) / PONT_DIV_R2);
const float TENSION_CIBLE = 24.0;
const float TENSION_SEUIL_CHARGE_BATTERIE = 13.0;
const float TENSION_MAXI = float(TENSION_CIBLE + TENSION_SEUIL_CHARGE_BATTERIE);
const float TENSION_DISTANCE_MAXI_CIBLE = float(TENSION_MAXI - TENSION_CIBLE);
const float EQUIV_ANALOG_VOLT = (5.0/1023.0);
const float MOYENNE_MOB_NBRE = 10.0;
float MOYENNE_MOB_ALPHA = 0.0;
const float PID_FREQUENCE_OSCILLATION_Tu = 5.0;
const float PID_VALEUR_ULTIME_Ku = (float) TENSION_MAXI;
const float PID_DELAIS = 0.1; // en seconde
const float FREIN_1_R1 = 12.0;
const float FREIN_2_R2 = 1.2;
const int VAL_PWM_MIN = 0;
const int VAL_PWM_MAX = 255;
const float SEUIL_ACTIVATION_FREINAGE_2 = float(TENSION_MAXI);
const float SEUIL_DESACTIVATION_FREINAGE_2 = 12.0;
const float SEUIL_PWM_R1_MIN = 31.0;
int CONNECT_PONT_DIVISEUR = FICHE_A0;
int FICHE_FREIN_1 = FICHE_3;
int FICHE_FREIN_2 = FICHE_11;
float PID_CONSIGNE = TENSION_CIBLE;
float kp_ZieglerNickols = float(0.6 * PID_VALEUR_ULTIME_Ku);
float ki_ZieglerNickols = float(1.2 * ( PID_VALEUR_ULTIME_Ku / PID_FREQUENCE_OSCILLATION_Tu));
float kd_ZieglerNickols = float((3.0 * PID_VALEUR_ULTIME_Ku * PID_FREQUENCE_OSCILLATION_Tu) / 40);
// DÉCLARATION DES VARIABLES ////////////////////
float pidMesureEntree = 0.0;
float pidRetourCommande = 0.0;
float tensionEol = 0.0;
float moyenneMob = 0.0;
float tensionDistance = 0.0;
float instructionPwm = 0.0;
float retourPID = 0.0;
int frein = 0;
int fichePwmActive = 0;
int fichePwmNonActive = 0;
// Variables nécessaires pour faire fonctionner la librairie PID
// Lien entre les kp, ki et kd de ce code, et la librairie PID
double kpInitial = kp_ZieglerNickols, kiInitial = ki_ZieglerNickols, kdInitial = kd_ZieglerNickols;
// déclaration nécessaire pour faire fonctionner la librairie PID
double Setpoint, Input, Output;
PID myPID(&Input, &Output, &Setpoint, kpInitial, kiInitial, kdInitial, DIRECT);
// INITIALISATION ////////////////////
void setup()
{
Serial.begin(9600);
pinMode(CONNECT_PONT_DIVISEUR, INPUT);
pinMode(FICHE_FREIN_1, OUTPUT);
pinMode(FICHE_FREIN_2, OUTPUT);
analogWrite(FICHE_FREIN_1, 255);
analogWrite(FICHE_FREIN_2, 255);
instructionPwm = 0.0;
frein = 2;
Input = pidMesureEntree;
Setpoint = PID_CONSIGNE;
myPID.SetMode(AUTOMATIC);
}
// ROUTINE PRINCIPALE ////////////////////
void loop()
{
tensionEol = analogRead(CONNECT_PONT_DIVISEUR) * EQUIV_ANALOG_VOLT * PONT_DIV_DIVISEUR;
MOYENNE_MOB_ALPHA = (1.0 / (float) MOYENNE_MOB_NBRE);
moyenneMob = (MOYENNE_MOB_ALPHA * tensionEol) + ((1 - MOYENNE_MOB_ALPHA) * moyenneMob);
pidMesureEntree = moyenneMob;
Input = pidMesureEntree;
myPID.SetTunings(kpInitial, kiInitial, kdInitial);
myPID.Compute();
pidRetourCommande = Output;
retourPID = pidRetourCommande;
instructionPwm = map(retourPID,255,0,0,255);
// Portion de code qui pilote l'application du frein 1 ou 2
tensionDistance = float(tensionEol - TENSION_CIBLE);
if (retourPID >= SEUIL_PWM_R1_MIN) {
// Plage d'utilisation de R1
float pwmR1 = map(retourPID, 255, SEUIL_PWM_R1_MIN, 0, 255);
instructionPwm = pwmR1;
fichePwmActive = FICHE_FREIN_1;
fichePwmNonActive = FICHE_FREIN_2;
}
else {
// Plage d'utilisation de R2
int R2_BY_R1 = 255 * (FREIN_2_R2 / FREIN_1_R1);
float pwmR2 = map(retourPID, 0, SEUIL_PWM_R1_MIN, R2_BY_R1, 255);
instructionPwm = pwmR2;
fichePwmActive = FICHE_FREIN_2;
fichePwmNonActive = FICHE_FREIN_1;
}
analogWrite(fichePwmNonActive, 0);
analogWrite(fichePwmActive, instructionPwm);
if (analogRead(CONNECT_PONT_DIVISEUR) == 0.0) {
  • Ces lignes 129 à 131 ne sont pas fonctionnelles. Elles tentent d'utiliser la bibliothèque LowPower pour réduire la consommation électrique de l'Arduino quand il n'y a pas de tension dans la fiche A0, c'est à dire, quand l'éolienne ne tourne pas du tout. Mais, nous n'avons pas la possibilité de savoir si l'arduino se met bel et bien en sommeil. Sous entendu, ces lignes sont inutiles et pourraient être retirées, ainsi que la ligne d'appel de la blibliothèque lowpower (ligne 07).

Please register or sign in to reply
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
}
/*
// LECTURE DANS LE MONITEUR PENDANT LA PÉRIODE R&D DE CE CODE
// Commenter cette partie dès que le code est fonctionnel
Serial.print("U;");
Serial.print(tensionEol);
Serial.print(";");
Serial.print("PID;");
Serial.print(Output);
Serial.print(";");
Serial.print("retourPID;");
Serial.print(retourPID);
Serial.print(";");
Serial.print("instructionPwm;");
Serial.print(instructionPwm);
Serial.println(";");
Serial.println("----------------------------");
*/
// delay(PID_DELAIS*1000);
  • Cette ligne 151, peut être utile si l'on souhaire que le code freine moins brusquement l'éolienne. Cependant, cela peut aussi générer un risque en cas de forte rafale inattendue. C'est la raison pour laquelle le code est commenté. cette ligne pourrait être supprimée.

Please register or sign in to reply
}
// FONCTIONS /////////////////////////
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment