Titolo: INSEGUITORE MOTORIZZATO PER IMPIANTI SOLARI, GESTITO DA PIC. PROGETTO DI: Marco Romani Progetto di: Marco Romani Descrizione generale: I pannelli fotovoltaici sfruttano la luce, in particolare quella del sole, diventando generatori di tensione e corrente. Essi devono essere orientati in modo da prendere in maniera ottimale la luce del sole durante le ore diurne. Il posizionamento, secondo la legge di Lambert (L’energia ceduta da un raggio di luce alla superficie che investe è direttamente proporzionale al coseno dell’angolo formato tra la direzione della luce e la normale della superficie stessa), deve essere fatto in modo che il pannello riceva la massima energia, e quindi lavori con la massima efficienza possibile. Il mio progetto è in grado di seguire orizzontalmente la posizione del sole, da est ad ovest (si potrebbe fare anche verticalmente, ma per semplicità ho tenuto un’inclinazione verticale fissa di circa 135°), durante la giornata e di tornare alla posizione iniziale al sorgere del sole, in modo da ricominciare l’inseguimento. Il progetto è stato creato come prototipo per applicazioni su impianti solari di piccole dimensioni. Funzionamento: Per rilevare la direzione verso la quale deve girare il pannello, l’inseguitore utilizza un circuito a microcontrollore (PIC), che esamina i tre segnali analogici dei sensori ottici disposti in modo da ricevere la luce solare, quando è perpendicolare a loro. Il dispositivo “ottico” è composto di due sensori disposti nella stessa direzione frontale (ma inclinati tra loro di circa 60°), ed un sensore_alba disposto in direzione opposta agli altri due. Il micro legge periodicamente i valori dei sensori, se il valore del sensore che indica la direzione ovest è molto maggiore del valore del sensore che indica la direzione est, allora il pannello ruota verso ovest fino a quando i due valori non si eguagliano. La notte tutti e tre i sensori hanno stesso valore ed il pannello non compie movimenti. All’alba il sensore_alba posizionato in maniera opposta agli altri due, è rivolto verso il sole, a differenza degli altri che sono in ombra. Essendo quindi il valore del sensore_alba maggiore degli altri due, il pannello ruota verso est fino a che non attiva il pulsante di fine-corsa. Il pannello solare va montato su una staffa rotante insieme ai sensori ottici. Tutto il circuito funziona a 12 Vdc. Composizione: 2 Progetto di: Marco Romani Lo schema a blocchi riportato di seguito indica i principali elementi che compongono l’inseguitore; il gruppo dei sensori ottici è collegato al micro tramite 3 fili, più 2 fili per l’alimentazione a 5Vdc. Il micro è collegato al driver per motori passo-passo tramite 4 fili, e lo stesso driver è collegato tramite 4 fili allo stepper bipolare. Il driver per stepper richiede di una doppia alimentazione, 5 Vdc e 12 Vdc. Anche il microcontrollore funziona con una tensione di 5Vdc, ed è per questo che se alimentiamo il tutto ad una tensione di 12Vdc, abbiamo bisogno di uno stabilizzatore di tensione a 5vdc. Sensori ottici Microcotrollore PIC Stabilizzatore di Tensione 5 Vdc Driver Stepper Stepper 12 Vdc Gruppo sensori ottici: Di seguito riporto il circuito: Il gruppo dei sensori ottici non è nient’altro che tre partitori di tensione. Ogni partitore è costituito da una fotoresistenza da 47 KΩ e una resistenza da 100 Ω. 3 Progetto di: Marco Romani Le fotoresistenze sono elementi a semiconduttore in cui la radiazione assorbita viene convertita in una variazione di resistività per il materiale stesso. n genere il materiale utilizzato è il CdS (solfuro di cadmio) oppure il PbS (solfuro di piombo), depositato in uno strato sottile su un supporto isolante. Affinché il sensore abbia un’elevata sensibilità, esso deve essere in rado di catturare un numero elevato di fotoni e pertanto si tende a realizzare una superficie sufficientemente ampia. Per ottenere una fotoresistenza di superficie elevata e contemporaneamente un cammino dei portatori di carica abbastanza breve, si realizzano elettrodi metallici a forma di pettine che costituiscono il giusto compromesso tecnico ai due problemi esposti. La caratteristica statica di una fotoresistenza con resistenza in oscurità totale 10M assume l’aspetto di figura: Come si può osservare la relazione che intercorre tra la resistenza e la quantità di radiazione incidente (illuminamento) è di tipo lineare in scala logaritmica e quindi si può scrivere: log R=log R1- log IL in cui R1 è la resistenza presentata dalla fotoresistenza in condizioni di illuminamento IL unitario. 4 Progetto di: Marco Romani La relazione può essere scritta anche: log R/R1= log IL^- ossia: R= R IL^- Quindi, la resistività diminuisce con l’aumentare della luce; più ho luce e più sarà alta la tensione del partitore. Questi partitori vanno alimentati con una tensione di 5Vdc. Driver per motori passo-passo: Dato che la motorizzazione del pannello è fatta con un motore passo-passo bipolare, ho bisogno di un driver per la gestione del motore, perché il PIC non può gestirlo direttamente. Il Driver utilizzato è l’integrato L298, il quale necessita di due alimentazioni: una a 5 Vdc per alimentare la parte logica, ed una che deve essere la tensione di alimentazione dello stepper (max 46V), che in questo caso è 12 Vdc. Per questo motivo nel circuito ho inserito uno stabilizzatore di tensione a 5V del tipo L7805 messo in configurazione in modo che funzioni da regolatore di tensione fissa, come riportato in figura: Per la protezione del circuito dalle sovracorrenti è bene utilizzare 8 diodi di tipo veloce (shottky) da 1 o 2 o 5 Ampere. I diodi da utilizzare devono avere due caratteristiche fondamentali: Essere veloci, cioè essere capaci di passare in poco tempo dalla condizione di non passaggio di corrente a quella di conduzione e viceversa. In genere sono richiesti tempi di intervento dell'ordine dei 100 ns o anche meno. Per questo motivo non sono adatti per esempio i comuni 1N4001, troppo lenti. Essere capaci di gestire correnti elevate in quanto al momento dello spegnimento tutta la corrente del motore passa nei diodi, ed in genere si tratta di ampere. Per questo motivo non sono adatti per esempio i comuni 1N4148, che sopportano correnti dell'ordine dei 100 mA. E’ bene mettere anche un dissipatore sul L298, e sugli stabilizzatori di tensione. Il circuito è quindi il seguente: 5 Progetto di: Marco Romani Dove K2 è il connettore per gli ingressi che arrivano direttamente dal microcontrollore e K3 è il connettore per le uscite che vanno collegate alle 4 fasi dello stepper bipolare. Per l’alimentazione, il pin 8 va a +5V e il pin 9 a massa (tali pin non sono rappresentati in figura). 6 Progetto di: Marco Romani I motori passo_passo: Per far muovere il pannello utilizzeremo un motore passo-passo (stepper) bipolare. I motori bipolari sono caratterizzati dall'avere solo quattro fili di connessione. Una categoria particolare è costituita dai motori unipolari a sei fili: è infatti sufficiente in questi motori non collegare la coppia di fili comuni tra due fasi per ottenere un motore bipolare, anche se in genere con caratteristiche peggiori di quelli che" nascono bipolari". Per questi motori il pilotaggio è più complesso che per quelli unipolari: infatti la corrente deve attraversare gli avvolgimenti nei due versi e questo rende piuttosto complesso il circuito di pilotaggio. Il vantaggio deriva dal fatto che, essendo le fasi due anziché quattro, a parità di potenza del motore, il peso e la dimensione sono minori in quanto è necessario usare una minor quantità di rame. Inoltre, usando appositi schemi, è possibile ottenere circuiti di pilotaggio più efficienti in termini di consumo energetico e velocità di rotazione ottenibile. Infine si rende possibile introdurre nuove modalità di pilotaggio senza appesantire in modo sostanziale le difficoltà di progettazione dell'elettronica di potenza. Anche nel pilotaggio bipolare sono possibili diverse modalità: WaveMode: una sola fase alla volta è attiva. Da notare che le condizioni di funzionamento per ciascuna fase sono tre: corrente in un verso, corrente nell'altro verso, assenza di corrente (situazioni indicate rispettivamente con I, -I e 0 nella tabella). Passo Ph1 Ph2 1 I 0 2 0 I 3 -I 0 4 0 -I Two phase-on: la corrente è sempre presente nelle due fasi ma cambia verso. Ho già descritto nel paragrafo dedicato ai motori unipolari gli effetti sulla coppia (che aumenta di 1.4 volte) e la corrente assorbita (che raddoppia). Passo Ph1 Ph2 1 I I 2 -I I 3 -I -I 4 I -I L’unità di controllo, il microcontrollore PIC: E’ la parte più importante del sistema perché presiede a tutte le funzioni, è costituita da un microcontrollore Microchip PIC16F877A basato su un’architettura a 16 bit, provvisto di Flash-EPROM da 8k e organizzata in parole da 14 bit e funzionante, in quest’applicazione, con un quarzo esterno a 20 MHz. Dispone inoltre di convertitori A/D, di comparatori e di porta USART. 7 Progetto di: Marco Romani Durante l’inizializzazione, il programma azzera le linee delle porte A, B ed E, e imposta le linee RA0, RA2, RA3 e RE0 come ingressi, e RB7, RB6, RB5, RB4 come uscite, destinante al driver per lo stepper. Il programma in sequenza acquisisce i valori analogici sui canali AN5, AN2, AN0 e AN3, ne fa la conversione A/D, e assegna tali valori a delle variabili, rispettivamente res_alba, ok, res_dx e res_sx (resistenza destra e resistenza sinistra s’intendono guardando il pannello di fronte). Se la resistenza di destra, res_dx, risulta essere minore della resistenza di sinistra (res_sx), (N.B. In realtà il PIC rileva la tensione creata dal partitore, essa aumenta o diminuisce in base al valore della fotoresistenza, più ho luce più bassa sarà la resistenza e più alta sarà la tensione, in pratica vuol dire che è illuminata maggiormente la res_sx), il micro inizia ad abilitare le uscite in sequenza tale che lo stepper si muova in verso orario, questo fino a quando il valore delle due fotoresistenza non si eguaglia, cioè ricevono la stessa quantità di luce. Seguendo il sole da est ad ovest, la notte il pannello si trova rivolto verso ovest, e la res_alba rivolta verso est, che aspetta il sorgere del sole. Il mattino la tensione su res_alba è molto maggiore di quella sulle altre due resistenze e il micro inizia la procedura per far muovere il pannello in senso antiorario, questo fino a che il pannello fa commutare a massa il fine-corsa, in modo che sull’ingresso AN2 ci sia una tensione di 0V e la variabile ok diventi 0. Se il pannello non fosse proprio affacciato al sole, appena avrei la condizione res_dx<res_sx il micro entra nella procedura per muovere il pannello in senso orario fino a che le due resistenze si eguagliano; ora il pannello è di fronte al sole. Ora continua il ciclo d’inseguimento del sole. Quando viene premuto il finecorsa porto le uscite del PIC a 0 (disattivate), questo perché così non ho fasi attive sullo stepper e non ho consumo di corrente (evitando il surriscaldamento dell’ L298). La stessa cosa si potrebbe fare, quando le due resistenze frontali hanno lo stesso valore, cioè, quando ricevono la stessa luce (soprattutto di notte); si può inserire un pezzo di programma del tipo: if (res_dx==res_sx) { PORTB=0; } Il circuito risulta essere: 8 Progetto di: Marco Romani Elenco componenti utilizzati: -Oscillatore al quarzo: 20MHz -R1, R2, R3: 100 Ω -R4, R5: 0,47 Ω -R6: 10 KΩ -R7: 470 Ω -C1: 1 nF -C2, C4: 0,1 µF -IC1: L7805 -IC2: L298 -U: PIC16F877A -PH1, PH2, PH3: fotoresistenza 47 KΩ -D1÷D8: diodi shottky 2 A -D9: 1N4005 -Sw1: pulsante -Stepper bipolare (1 pz.) Varie: -Interruttore 12 Vdc (1 pz.) -Ventola raffreddamento 12 Vdc (1 pz.) -Zoccoli -Morsettiera 2 poli (1 pz.) -Boccole (2 pz.) -Dissipatori (3 pz.) -Millefori o base in rame per circuiti stampati -Ingranaggi per il movimento Per evitare che res-alba venga disturbata dal sole durante la giornata, possiamo mettere una specie di parasole per eliminare i riflessi solari. 9 Progetto di: Marco Romani Programma principale: Main_stepper.c /********************************************************** Comando motore passo-passo (stepper) modalita' passo intero velocita' fissa Connessioni: RA0/AN0 <--> Sensore di luminosita' res_dx RA3/AN3 <--> Sensore di luminosita' res_sx AN5 <--> Sensore di luminosita' res_alba AN2 <--> Pulsante finecorsa RB7 <--> comando P1 ponte motori RB6 <--> comando P2 ponte motori RB5 <--> comando P3 ponte motori RB4 <--> comando P4 ponte motori *********************************************************/ #include <pic.h> #include "Macro.h" // NOTA BENE: modificare il valore di PIC_CLK nel file seguente // se la frequenza del quarzo e' diversa da 20 MHz // CONFIGURATION BITS #include "delay.h" __CONFIG(HS & WDTDIS & PWRTEN & BORDIS & UNPROTECT); // INTIO: Internal RC No Clock // XT: External quartz <= 4 MHz // HS: External quartz > 20 MHz //WDTDIS: Watchdog timer Disabled //PWRTEN: Power-up Timer Disabled //BORDIS: Brown-out detect Disabled //UNPROTECT: Do not read protect EEPROM data // INIZIO PROGRAMMA PRINCIPALE main(void) { // DICHIARAZIONE DELLE VARIABILI int res_dx, res_sx, res_alba, n, ok; short i; int full_step[]={0b10000000, 0b00010000, // P1, P4, int full_stepi[]={0b00100000, 0b01000000, // P3, P2, unsigned char step_delay; 0b01000000, P2, 0b00010000, P4, 0b00100000}; 0b10000000}; // array per il controllo delle fasi antiorario P3 attive in sequenza // array per il controllo delle fasi orario P1 attive in sequenza // INIZIALIZZAZIONE HARDWARE PORTA = 0; PORTB = 0; PORTE = 0; // Azzera le linee della porta A // Azzera le linee della porta B // Azzera le linee della porta E TRISA = 0b00001101; TRISB = 0b00000000; TRISE = 0b11111111; ADCON1 = 0b10100000; // Imposta la porta A con AN0, RA3,RA2 come ingresso // Imposta la porta B come uscite // Imposta la porta E con AN5 ingresso // Setto la conversione A-D: // Conversion Clock Fosc/16 // Allineamento a DX // SPEGNI COMPARATORI CMCON=0x07; i = 0; // INIZIO CICLO DEL PROGRAMMA while(1) { ADCON0 = 0b10010001; DelayMs(50); GODONE=1; while(GODONE==1) continue; ok=ADRESL/100; ADCON0 = 0b10101001; DelayMs(50); GODONE=1; while(GODONE==1) continue; // Uso AN2 // Ritardo di 50 ms // Partenza della conversione A-D // Attesa della fine della conversione // Assegnazione dal registro alla variabile ok // Uso AN5 // Ritardo di 50 ms // Partenza della conversione A-D // Attesa della fine della conversione 10 Progetto di: Marco Romani res_alba=ADRESL/100; // Assegnazione dal registro alla variabile res_alba ADCON0 = 0b10000001; DelayMs(50); GODONE=1; while(GODONE==1) continue; res_dx=ADRESL/100; // Uso AN0 // Ritardo di 50 ms // Partenza della conversione A-D // Attesa della fine della conversione ADCON0 = 0b10011001; DelayMs(50); GODONE=1; while(GODONE==1) continue; res_sx=ADRESL/100; // Uso AN3 // Ritardo di 50 ms // Partenza della conversione A-D // Attesa della fine della conversione // Assegnazione dal registro alla variabile res_dx // Assegnazione dal registro alla variabile res_sx while(res_dx<res_sx ) { // Passo intero orario { step_delay=200; PORTB=full_stepi[i]; DelayMs(step_delay); i=i+1; i=i%4; // Cambiamento di fase // Ritardo per il cambio di fase // incremento di passo in modulo 4 // i rimane fra 0 e 3 } ADCON0 = 0b10010001; DelayMs(50); GODONE=1; while(GODONE==1) continue; ok=ADRESL/100; // Uso AN2 // Ritardo di 50 ms // Partenza della conversione A-D // Attesa della fine della conversione ADCON0 = 0b10000001; DelayMs(50); GODONE=1; while(GODONE==1) continue; res_dx=ADRESL/100; // Uso AN0 // Ritardo di 50 ms // Partenza della conversione A-D // Attesa della fine della conversione ADCON0 = 0b10011001; DelayMs(50); GODONE=1; while(GODONE==1) continue; res_sx=ADRESL/100; // Uso AN3 // Ritardo di 50 ms // Partenza della conversione A-D // Attesa della fine della conversione // Assegnazione dal registro alla variabile ok (controllo finecorsa) // Assegnazione dal registro alla variabile res_dx // Assegnazione dal registro alla variabile res } if(res_alba>res_sx && res_alba>res_dx) { // Passo intero antiorario while(ok) { step_delay=200; PORTB=full_step[i]; DelayMs(step_delay); i=i+1; i=i%4; // Cambiamento di fase // Ritardo per il cambio di fase // incremento di passo in modulo 4 // i rimane fra 0 e 3 ADCON0 = 0b10010001; DelayMs(50); // Uso AN2 // Ritardo di 50 ms GODONE=1; while(GODONE==1) continue; ok=ADRESL/100; // Partenza della conversione A-D // Attesa della fine della conversione ADCON0 = 0b10101001; DelayMs(50); GODONE=1; while(GODONE==1) continue; res_alba=ADRESL/100; // Uso AN5 // Ritardo di 50 ms // Partenza della conversione A-D // Attesa della fine della conversione ADCON0 = 0b10000001; // Uso AN0 // Assegnazione dal registro alla variabile ok // Assegnazione dal registro alla variabile res_sx 11 Progetto di: Marco Romani DelayMs(50); GODONE=1; while(GODONE==1) continue; res_dx=ADRESL/100; // Ritardo di 50 ms // Partenza della conversione A-D // Attesa della fine della conversione ADCON0 = 0b10011001; DelayMs(50); GODONE=1; while(GODONE==1) continue; res_sx=ADRESL/100; } // Uso AN3 // Ritardo di 50 ms // Partenza della conversione A-D // Attesa della fine della conversione if(!ok) { //se viene premuto il finecorsa // Assegnazione dal registro alla variabile res_dx // Assegnazione dal registro alla variabile res_sx } PORTB = 0; //azzero l'uscita } } //fine while loop } // FINE MAIN Il programma appena visualizzato è nominato come: - Main_stepper.c Per il funzionamento dell’intero programma occorre aprire in MPLab un progetto con caricati anche i seguenti file: - delay.c - delay.h - macro.h 12