Analyseur de Gisement Solaire
Objectif
L'AGS - Analyseur de Gisement Solaire - est un produit composé d'un panneau solaire inclinable.
Le but de ce projet est de concevoir plusieurs briques indépendantes:
- Une interface graphique en LabVIEW pour superviser le panneau solaire
- Un microcontrôleur pour pour lire les données analogiques grâce à l'ADC d'un microcontrôleur Microchip PIC18F45K20
- Un filtre pour filtrer le signal analogique, notamment perturbé par le 50 Hz du secteur
Et enfin, la gestion de projet, avec la conception d'un diagramme de Gantt. Le projet a été réalisé en groupe de 3 personnes.
Réalisation
Interface graphique
LabVIEW est un langage de programmation graphique. Je ne l'avais jamais utilisé auparavant, et j'ai donc dû apprendre à l'utiliser.
Une DLL était fournie, proposant différentes fonctions pour communiquer avec l'AGS. J'ai donc dû créer une interface graphique permettant de communiquer avec l'AGS, et de visualiser les données.
Cliquer pour afficher des captures d'écran
Microcontrôleur
La partie microcontrôleur consistait à lire les données analogiques à l'aide de l'ADC du PIC18F45K20, et à allumer certaines LEDs en fonction de la valeur lue. J'ai utilisé le logiciel MPLAB X pour programmer le microcontrôleur en C.
Pour laisser le temps à l'ADC d'échantillonner le signal, j'ai utilisé un timer pour déclencher l'échantillonnage toutes les 10ms.
void temporisation(void)
{
// configuration du contenu initial du timer
// afin d'overflow au bout d'environ 500ms
TMR0H = OxE1;
TMR0L = Ox7A;
// on démarre le timer
T0CONbits.TMR0ON = 1;
// on attend que TMR0IF ne soit plus nul, donc qu'il ait overflow
while(INTCONbits.TMR0IF == 0b0) {}
if (INTCONbits.TMR0IF == 0b1)
{
// on éteint et on reset le timer
TOCONbits.TMROON = 0b0;
INTCONbits.TMROIF = 0b0;
}
}
Enfin, il faut configurer les registres de l'ADC pour qu'il fonctionne correctement, ainsi que les registres pour les LEDs.
void main(void)
{
// initialisation des LEDs
TRISD = 0b00000000;
PORTD = 0xFF;
// initialisation de l'ADC sur RA0
initADC();
// configuration TMR0 en 16 bits et prescaler 1:16
T0CON = 0b00000111;
INTCON = 0x00; // on reset le registre INTCON
while (1) {
PORTD = ADC_read();
}
}
Cliquer pour afficher le code relatif à l'ADC
void initADC(void)
{
// configuration de l'ADC
ADCON1 = 0b00000000;
ADCON2 = 0b00111000;
ADCON0 = 0b00000001;
}
int ADC_read(void)
{
ADCON0bits.GO_DONE = 1; // on démarre la conversion
while (ADCON0bits.GO_DONE == 1); // on attend la fin de la conversion
return ADRESH; // on retourne la valeur lue
}