Solar Tracker Code
Solar Tracker Code
* solar_tracker.c
* MPLAB X / XC8 code pour PIC16F877A
* Application: Solar Tracker à 2 axes (horizontal + vertical)
* Capteurs: 4 LDR en pont diviseur (canaux AN0..AN3)
* Actionneurs: 2 servomoteurs via PWM (CCP1, CCP2)
* Afficheur: LCD HD44780 16x2 (mode 4 bits)
*/
#include <xc.h>
// Configuration bits
#pragma config FOSC = HS // Oscillateur externe haute vitesse
#pragma config WDTE = OFF // Watchdog Timer désactivé
#pragma config PWRTE = ON // Power-up Timer activé
#pragma config BOREN = ON // Brown-out Reset activé
#pragma config LVP = OFF // Low-Voltage Programming désactivé
#pragma config CPD = OFF // Data EEPROM protection off
#pragma config WRT = OFF // Flash write protection off
#pragma config CP = OFF // Code protection off
// Prototypes
void init_ports(void);
void init_adc(void);
unsigned int read_adc(uint8_t channel);
void init_pwm(void);
void set_servo1(uint16_t duty);
void set_servo2(uint16_t duty);
void lcd_cmd(uint8_t cmd);
void lcd_data(uint8_t data);
void lcd_init(void);
void lcd_goto(uint8_t line, uint8_t pos);
void lcd_puts(const char *s);
void main(void) {
unsigned int ad0, ad1, ad2, ad3;
int16_t diff_h, diff_v;
uint16_t duty1, duty2;
init_ports();
init_adc();
init_pwm();
lcd_init();
lcd_goto(1,1);
lcd_puts("Solar Tracker");
while (1) {
// Lecture des 4 LDR
ad0 = read_adc(0); // canal AN0
ad1 = read_adc(1); // AN1
ad2 = read_adc(2); // AN2
ad3 = read_adc(3); // AN3
set_servo1(duty1);
set_servo2(duty2);
__delay_ms(200);
}
}
void init_ports(void) {
ADCON1 = 0x0E; // AN0..AN3 analogique, reste numérique
TRISA = 0x0F; // RA0..RA3 en entrée (LDR)
TRISB = 0x00; // PORTB sorties pour LCD et PWM
TRISCbits.TRISC2 = 0; // CCP1
TRISCbits.TRISC1 = 0; // CCP2
PORTB = 0;
}
void init_adc(void) {
ADCON2 = 0b10101010; // ADFM=1 (droite), ACQT=101, ADCS=010
ADCON0 = 0; // ADC off
__delay_ms(2);
}
void init_pwm(void) {
// Timer2: prescaler 16 -> PWM_Freq ~50Hz
T2CON = 0b00000110;
PR2 = 249;
CCP1CON = 0b00001100; // PWM mode
CCP2CON = 0b00001100;
TMR2 = 0;
T2CONbits.TMR2ON = 1;
}
void lcd_init(void) {
__delay_ms(20);
lcd_cmd(0x33);
lcd_cmd(0x32);
lcd_cmd(0x28);
lcd_cmd(0x0C);
lcd_cmd(0x06);
lcd_cmd(0x01);
__delay_ms(2);
}