Skip to content

Solar Resource Analyzer ​

Objective ​

The AGS - Analyseur de Gisement Solaire (Solar Resource Analyzer) - is a product composed of a tiltable solar panel. AGS

The goal of this project is to design several independent components:

  • A graphical interface in LabVIEW to supervise the solar panel
  • A microcontroller to read analog data using the ADC of a Microchip PIC18F45K20 microcontroller
  • A filter to filter the analog signal, particularly disturbed by the 50 Hz mains frequency

And finally, project management, with the design of a Gantt chart. The project was carried out in a group of 3 people.

Implementation ​

Graphical Interface ​

LabVIEW is a graphical programming language. I had never used it before, so I had to learn to use it.

A DLL was provided, offering different functions to communicate with the AGS. I therefore had to create a graphical interface to communicate with the AGS, and to visualize the data.

Click to display screenshots
HMI
LabVIEW Code

Microcontroller ​

The microcontroller part consisted of reading analog data using the PIC18F45K20's ADC, and lighting certain LEDs according to the value read. I used the MPLAB X software to program the microcontroller in C.

To give the ADC time to sample the signal, I used a timer to trigger sampling every 10ms.

c
void temporisation(void)
{
    // configuration of the timer's initial content
    // to overflow after about 500ms
    TMR0H = OxE1;
    TMR0L = Ox7A;

    // start the timer
    T0CONbits.TMR0ON = 1;

    // wait until TMR0IF is no longer zero, so it has overflowed
    while(INTCONbits.TMR0IF == 0b0) {}

    if (INTCONbits.TMR0IF == 0b1)
    {
        // turn off and reset the timer
        TOCONbits.TMROON = 0b0;
        INTCONbits.TMROIF = 0b0;
    }
}

Finally, you need to configure the ADC registers so that it works correctly, as well as the registers for the LEDs.

c
void main(void)
{
    // LED initialization
    TRISD = 0b00000000;
    PORTD = 0xFF;

    // ADC initialization on RA0
    initADC();

    // configure TMR0 in 16 bits and prescaler 1:16
    T0CON = 0b00000111;
    INTCON = 0x00; // reset the INTCON register

    while (1) {
        PORTD = ADC_read();
    }

}
Click to display the code related to the ADC
c
void initADC(void)
{
    // ADC configuration
    ADCON1 = 0b00000000;
    ADCON2 = 0b00111000;
    ADCON0 = 0b00000001;
}

int ADC_read(void)
{
    ADCON0bits.GO_DONE = 1; // start the conversion
    while (ADCON0bits.GO_DONE == 1); // wait for the conversion to finish
    return ADRESH; // return the value read
}