Desenvolvimento de Uma Luminária Led Autônoma Utilizando
Desenvolvimento de Uma Luminária Led Autônoma Utilizando
Desenvolvimento de Uma Luminária Led Autônoma Utilizando
JEFERSON KINDRAJH
CURITIBA
2015
JEFERSON KINDRAJH
CURITIBA
2015
TERMO DE APROVAÇÃO
Jeferson Kindrajh
Aos professores, Dr. Rogers Demonti, Dr. João Dias e Dr. James
Alexandre Baraniuk, pelo ensino ao longo dos anos e pelo interesse neste
trabalho.
This paper presents the study and development of a LED lamp that uses solar
modules and a bank of ultracapacitors. For this purpose, they sought after
sustainable solutions to meet the seventh goal of the eight Millennium
Development Goals set by the United Nations (UN), which is quality of life and
respect for the environment. The project uses three clean new technologies
designed to replace the two largest existing pollution sources in most stand-
alone fixtures: discharge lamps replaced with high-efficiency LEDs, with long
service life; batteries replaced with ultracapacitors, which can last up to 25
years; and photovoltaic panels to power the light, which a life expectancy
around 25 years. All with the purpose of meeting the environmental
sustainability requirement of the UN. In addition, tools such as DC-DC
converters and MPPT algorithm have been implemented to increase system
efficiency. The project created a working prototype of an autonomous LED
lamp, supported by a ultracapacitors bank, powered by photovoltaic panels, for
use in lighting pedestrian routes.
1 INTRODUÇÃO ...................................................................................................... 12
1.1 OBJETIVOS ........................................................................................................ 14
1.1.1 OBJETIVO GERAL ......................................................................................... 14
1.1.2 Objetivos específicos ...................................................................................... 14
2 JUSTIFICATIVA ................................................................................................... 16
3 FUNDAMENTAÇÃO TEÓRICA ............................................................................ 18
3.1 LUMINÁRIAS AUTÔNOMAS .............................................................................. 18
3.2 MPPT EM SISTEMAS FOTOVOLTAICOS ......................................................... 19
3.2.1 O algoritmo P&O ............................................................................................. 20
3.3 SUPERCAPACITORES E ULTRACAPACITORES ............................................ 22
3.4 LEDS DE POTÊNCIA ......................................................................................... 27
3.5 LEGISLAÇÃO PARA LUMINÁRIAS EM ILUMINAÇÃO PÚBLICA ...................... 31
4 METODOLOGIA ................................................................................................... 35
5 DESENVOLVIMENTO .......................................................................................... 40
5.1 CÁLCULO DO LED ............................................................................................. 40
5.2 CÁLCULO DO DISSIPADOR PARA CADA LED ................................................ 43
5.3 CÁLCULO DO BANCO DE SUPERCAPACITORES .......................................... 45
5.4 CÁLCULO MÓDULO SOLAR ............................................................................. 49
5.5 DIAGRAMA ESQUEMÁTICO DA CONTROLADORA ........................................ 50
5.5.1 Driver LED ...................................................................................................... 50
5.5.2 Conversor DC-DC para carga do Banco de Ultracapacitores ......................... 52
5.5.3 Conversor Boost para Alimentação dos Transistores dos Conversores
DC-DC ....................................................................................................................... 54
5.5.4 Regulador de Tensão para Alimentação do Microcontrolador, AOP e
Sensor de Movimento. .............................................................................................. 56
5.5.5 Microcontrolador e Circuito Amplificador do Sensor de Corrente de
Carga do Banco. ....................................................................................................... 57
5.5.6 Firmware ......................................................................................................... 59
6 RESULTADOS ..................................................................................................... 63
7 CONSIDERAÇÕES FINAIS .................................................................................. 66
REFERÊNCIAS ......................................................................................................... 67
ANEXO 1 – DATASHEET LED................................................................................. 69
ANEXO 2 - DESIGN DE REFERÊNCIA DA TEXAS INSTRUMENTS
“PMP7647 BOARD” ................................................................................................. 74
ANEXO 3 – DRIVER LM2510 ................................................................................... 75
ANEXO 4 – DRIVER LM2523 ................................................................................... 79
APÊNDICE 1 – CIRCUITO PROPOSTO .................................................................. 81
APÊNDICE 2 – LISTA DE MATERIAIS .................................................................... 82
APÊNDICE 3 – CALCULOS DOS GANHOS DA NOVA CONTROLADORA .......... 85
APÊNDICE 4 – MONTAGEM DO PROTÓTIPO ....................................................... 86
APÊNDICE 5 – FIRMWARE ..................................................................................... 92
12
1 INTRODUÇÃO
vida útil de LEDs de potência está na casa das 50.000 horas. Além da redução
de troca das lâmpadas, haverá a economia nos gastos relativos a transporte
até o local onde se localiza a luminária.
Para poupar energia, uma solução é o desenvolvimento de luminárias
autônomas, alimentadas por módulos solares fotovoltaicos. Alguns sistemas
autônomos de iluminação já foram desenvolvidos, inclusive luminárias com
LEDs. Contudo, continuam utilizando baterias que contêm metais pesados
como chumbo, cádmio, níquel ou lítio. Esses metais pesados são tóxicos aos
seres vivos e seu descarte inadequado causa grande impacto ambiental. Há
também a questão de necessidade periódica de manutenção dos
acumuladores de carga.
A proposta deste trabalho é o desenvolvimento de uma luminária LED
autônoma, alimentada por painéis solares fotovoltaicos, cuja energia
necessária para o funcionamento no período noturno ou de baixa luminosidade
será fornecida por um banco de ultracapacitores. O diagrama simplificado do
sistema pode ser visto na FIGURA 1.
1.1 OBJETIVOS
2 JUSTIFICATIVA
3 FUNDAMENTAÇÃO TEÓRICA
Célula Circuito de
Fotovoltaica Controle
Circuito
Driver para Módulo LED
LED
Circuito de
Bateria
proteção de
carga e
descarga
(1)
(2)
27
Já nos anos 60, o LED de cor amarela entre em cena. Apenas em 1975
é criado o primeiro LED verde, cujo comprimento de onda era de 550nm, o que
28
(3)
4 METODOLOGIA
FIGURA 11: PLACA PMP7647. ESQUERDA: FACE SUPERIOR. DIREITA: FACE INFERIOR.
FONTE: TEXAS INSTRUMENTS, 2013.
chumbo-ácida, pela potência estimada de saída dos LEDs ser menor e pela
potência do painel solar estimada também ser menor.
1) Modificações em hardware:
a) adequação da entrada à tensão/corrente do painel solar a ser
utilizado ou montado;
b) adequação do conversor DC-DC controlador de carga MPPT
para a corrente de carga desejada;
c) adequação do conversor DC-DC driver dos LEDs para a
tensão/corrente dos LEDs a serem utilizados. Assim como, a adequação de
sua mínima tensão de funcionamento para a mínima atingível, pois a tensão do
banco de ultracapacitores não é constante e decresce enquanto o banco se
descarrega;
d) adequação do circuito de alimentação do circuito de controle,
pelo mesmo problema do decréscimo de tensão do banco, o que poderia
causar mau funcionamento e até o não funcionamento da luminária caso o
banco esteja com tensão muito baixa. Preferencialmente implementar
alimentação independente (alimentação secundária), que também seja advinda
do painel solar, para evitar que o circuito de controle não funcione caso a carga
disponível da alimentação primária se esgote;
e) adição do sensor de movimento, para aplicações futuras;
f) desenho do circuito esquemático com as modificações
necessárias;
g) seleção de novos componentes;
h) desenho do novo layout da PCI, com base no novo
esquemático;
2) utilização de componentes e solda LeadFree, compatíveis com a
diretiva RoHS, devido à valorização da questão ambiental da luminária.
a) modificações em software:
b) alteração da corrente de carga do banco;
c) alteração da máxima tensão de carga do banco;
d) alteração da tensão de cut-off do banco de ultracapacitores;
e) alteração da corrente do driver para LEDs;
39
5 DESENVOLVIMENTO
(4)
Para determinar a altura dos postes, foi realizada a medição nas hastes
das luminárias da Universidade Federal do Paraná, onde foi verificada uma
altura de aproximadamente 4 metros. Além disso, as medidas das distâncias
entre postes também foram recolhidas. Constatou-se que o atual prédio do
departamento de Engenharia Elétrica possui uma distância média entre postes
de 12,5 m.
Com isso foi calculado a iluminância através do método da iluminância
pontual. A expressão calcula a Iuminância E, I é a intensidade luminosa da
fonte, α é o ângulo no qual se encontra o ponto em relação à fonte e h é altura
da fonte em relação a chão. Na figura 12 pode ser visualizada essa relação.
(5)
(6)
Para ligar os seis LEDs dispostos em série, foi utilizado um drive DC-DC
usando como referência o Design da Texas instruments (ANEXO2). O circuito
deverá fornecer corrente constante aos LEDs, sem que haja flutuações de
potência. Além disso, é importante considerar que o circuito deverá possuir alta
eficiência, o que não é possível utilizando resistores em função das perdas por
efeito joule.
51
(7)
(8)
(8)
5.5.6 Firmware
indica que a luminosidade ambiente está abaixo, sendo necessário que se ligue
os LEDs, para iluminação do ambiente. Sendo assim, passa ao estado
“INIC_LOAD”, cujo nome no código é “START_LOAD_MANAGEMENT”, onde
as configurações iniciais do modo seguinte são carregadas.
No próximo estado, “CTRL_LOAD” (no código
“LOAD_MANAGEMENT_STATE”), o conversor boost que alimenta os LEDs é
ligado e o controle de corrente é feito utilizando um controlador proporcional
implementado no firmware. A proteção contra sobrecorrente, que é a mais
crítica, é gerenciada pelo módulo interno denominado “COMPARATOR_B”, que
é um comparador analógico de tensão, com interface digital via registradores.
Quando sobrecorrente é detectada esse módulo gera uma interrupção na CPU
e essa interrupção é tratada. A proteção contra sobretensão, como não é
crítica, é executada via software. Constantemente a tensão do banco também é
monitorada e, se abaixo de 1V, o estado é alterado para “STBY_LPM4”. Caso a
tensão do módulo solar retorne à faixa ativa, os LEDs são desligados e é
gerado um sinal de reset via software, fazendo com que se retome o estado
inicial.
No estado “STBY_LPM4”, para máxima economia de energia, todos os
módulos internos do MCU são desligados, exceto o comparador analógico,
sendo sua interrupção mantida habilitada. Suas entradas são reconfiguradas
para monitorar a tensão do módulo solar e, se essa tensão for maior que 4V, o
microcontrador “acorda” e é gerado um reset via software, reiniciando o MCU,
para que volte ao estado inicial.
Diferentemente do modo “STBY_LPM4”, no modo “STBY_LPM3” são
desligados somente os timers que geram os sinais PWM para os conversores
DC-DC, o watch dog timer é reconfigurado para intervalo de 250 ms. Em cada
tratamento dessa interrupção a tensão do Módulo é verificada, para tomada de
decisão do estado seguinte, ou se irá continuar em modo de espera.
Quando o MCU opera no modo de carga do banco ou acionamento dos
LEDs, o watch dog timer é configurado com intervalo de 32 ms, sendo essa a
base de tempo para as conversões do ADC.
Há um quarto timer, denominado TIMER_A, que opera com base de
tempo de 1ms, servindo para a dimerização horária programada. No momento
não foi possível implementar a dimerização sensorizada.
63
6 RESULTADOS
L_S (Corrente) na figura 15, foram obtidos uma tensão de saída do conversor
boost de 18.0 V(figura 23) e uma tensão de 400 mV (Figura 24), ou seja, uma
corrente de 533 mA usando lei de Ohm no resistor shunt. Executando a
medição direta da corrente, com o multímetro, obteve-se 529 mA.
De modo a garantir que não haja curto de braço foi necessário utilizar
tempo morto nos sinais, implementado via software e timer do MCU, pois o CI
driver para os MOSFETs não possui esse recurso. O tempo morto calculado é
de 32 ns. O implementado no timer foi de 50 ns, por garantia. O detalhe do
tempo morto pode ser visto na figura 26.
7 CONSIDERAÇÕES FINAIS
REFERÊNCIAS
ALI, M.; ORABI, M.; ABDELKARIM, E.; QAHOUQ, J.A.A.; AROUDI, A.E.
Design and development of energy-free solar street LED light system.
Innovative Smart Grid Technologies - Middle East (ISGT Middle East), 2011.
IEEE PES conference on DOI: 10.1109/ISGT-MidEast.2011.6220812.
ASSOCIAÇÃO BRASILEIRA DE NORMAS TÉCNICAS. NBR 5101:2-12.
Iluminação Pública – Procedimento. Rio de Janeiro, 2012.
TEXAS INSTRUMENTS. Test report of MPPT & LED driver PMP7647. Texas,
USA, December 12th, 2013. Rev.C..
69
R$ R$
LED 1W/3W LED OSLON LCW CRDP.PC-LQLS-5F8F-1 BRANCO FRIO 5700K SMD 3030 Dualcom
5,60 33,60
R$ R$
Lente KB-H20-60P-OSN D21.5 H11.5mm Dualcom
1,20 7,20
R$ R$
Módulo sensor movimento IR ML
12,86 38,57
R$ R$
Q2, Q3 CSD17555Q5A MOSFET, N-Chan, 30V SON-5x6 Texas Instruments
3,50 10,50
R$ R$
Q5 CSD18531Q5A MOSFET, N-Chan, 60V SON-5x6 Texas Instruments
4,83 9,66
R$ R$
B1 0 Resistor 0R 0805 Dualcom
0,04 0,04
R$ R$
R2 0.75 Resistor, 0.68 Ohm, 2W, 1% (1R5//1R5) 2512 Dualcom
0,16 0,32
R$ R$
R1 0R020 Resistor, 20 milliOhm, 3W, 1% 2512 Brenno
0,20 0,20
R$ R$
R3 4.7 Resistor, 4.7Ohm, 1W, 5% 2512 Dualcom
0,16 0,16
R$ R$
R25 100K Resistor, Chip, 1/10W, 1% 0805 Brenno
0,04 0,04
R$ R$
R27 150K Resistor, Chip, 1/10W, 1% 0805 Dualcom
0,04 0,04
R$ R$
R11, R13, R16 7.5 Resistor, Chip, 1/10W, 5% (15R//15R) 0805 Dualcom
0,04 0,24
R$ R$
R31, R33 10K Resistor, Chip, 1/16W, 1% 0805 Brenno
0,04 0,12
R$ R$
R42, R43 1K Resistor, Chip, 1/16W, 1% 0805 Brenno
0,04 0,08
R$ R$
R23, R24 10 Resistor, Chip, 1/16W, 1% 0805 Dualcom
0,04 0,08
R$ R$
R22 1.8K Resistor, Chip, 1/16W, 1% 0805 Dualcom
0,04 0,08
R$ R$
R29 15K Resistor, Chip, 1/16W, 1% 0805 Dualcom
0,04 0,04
R$ R$
R32 15K Resistor, Chip, 1/16W, 1% 0805 Dualcom
0,04 0,04
R$ R$
R35 2.2K Resistor, Chip, 1/16W, 1% 0805 Dualcom
0,04 0,04
R$ R$
R12, R14, R17 33K Resistor, Chip, 1/16W, 1% 0805 Dualcom
0,04 0,16
R$ R$
R30 4.7K Resistor, Chip, 1/16W, 1% 0805 Dualcom
0,04 0,16
R$ R$
R34 5.6K Resistor, Chip, 1/16W, 1% 0805 Dualcom
0,04 0,04
R26, R28, R36, R37, R$ R$
2M Resistor, Chip, 1/16W, 1% (1M+1M) 0805 Dualcom
R38 0,04 0,40
R$ R$
R21 56R Resistor, Chip, 1/4 watt, ± 5% 0805 Dualcom
0,04 0,08
R$ R$
D7, D8, D9 LL4148 Small Signal Fast Switching Diodes MLL41 Brenno
0,10 0,30
84
R$ R$
D5, D6 LED SMD 0805 0805 Brenno
0,10 0,20
R$ R$
Taxa de envio - Texas Instruments Texas Instruments
24,85 24,85
R$ R$
Q11 KST3906 Trans, PNP, 40-V, 200-mA, 225-mW SOT23 Dualcom
0,31 0,31
R$ R$
3000F/2.7V Ultracapacitor 3000F/2.7V Dualcom
412,00 2.472,00
9.5 x 12.7 x R$ R$
L3 6uH/3A UP2UC-4R7-R (modificado) Brenno
5.21mm 4,02 4,02
9.5 x 12.7 x R$ R$
L1 6.8uH/4.4A UP2UC-6R8-R 4.4A Brenno
5.21mm 4,02 4,02
R$ R$
R44 100K 0805 Brenno
0,04 0,04
R$ R$
C19, C35 100uF/16V tant Size D Brenno
0,90 1,80
R$ R$
C31 10-12pF 0603 Brenno
0,10 0,10
R$ R$
R45 22K 0805 Dualcom
0,04 0,04
R$ R$
R46 330K 0805 Brenno
0,04 0,04
R$ R$
R47 47K 0805 Brenno
0,04 0,04
TOTAL R$ 2.755,75
85
Dados do ADC
Resolução ADC 10 bits
Valor máx ADC 1024 Níveis
Referência do ADC 2,5 V
Medição de Vpainel (P+) Medição Icarga Banco (B_S & B_I) Medição de Vbanco (B+)
P+(máx) 12 V Imáx 2 A B+(máx) 0,8 V
Vbe transistor Q11 0,60 V Shunt R1 0,0125 Ohms R25 100000 Ohms
R33+R34 15600 Ohms Vshunt (B_S) 0,025 V R29 33000 Ohms
R35 3900 Ohms Ganho do AOP 100 V/V Vadc 0,198 V
Valor no
Vadc 2,280 V Vadc (B_I) 2,500 V ADC 81 Níveis
Valor no ADC 933 Níveis Valor no ADC 1023 Níveis % da escala 8 %
% da escala 91 % % da escala 100 %
Para a realização do Protótipo, foram dimensionadas a partir da carga até a sua fonte de
energia. Antes de tudo, foi adquirido os componentes e acessórios para a realização física do
Projeto. A lista de componentes pode ser visualizada no APÊNDICE 2, na referência é possível
verificar o custo e a quantidade de cada componente e acessório adquirido.
A primeira ação para a efetivação do projeto foi a realização da soldagem dos LEDs nas
placas de MCPCB em alumínio e a colagem das Lentes nas placas junto aos LEDs. Após o todos
os LEDs serem soldados na placa MCPCB, os mesmos foram colados no dissipador HS2816
usando uma pasta térmica apropriada Figura 28.
Após realizar todas as montagens dos LEDs, foi dimensionada através do projeto CAD a
placa de alumínio onde foi alocado cada conjunto. Como cada lente possui 60°, eles foram
dispostos de forma circular para que seja iluminada toda a circunferência de onde a luminária for
instalada.
87
O arquivo em CAD (Figura 29) foi enviado a um centro de usinagem. Depois de finalizado,
todos os conjuntos compostos de LED e dissipador, foram fixados na placa em alumínio. Além
disso, os LED foram ligados em série como foi dimensionado anteriormente (Figura 30).
Antes de ligar os Ultracapacitores para ser gerada uma Capacitância Equivalente proposta,
foi de suma importância montar a placa responsável pelo equilíbrio de cargas do banco. Após
realizar o roteamento do esquemático, foi solicitada a produção da placa PCI em uma empresa
especializada (Figura 31).
88
A motagem do Módulo Solar exigiu cuidado e atenção em sua concepção. As células são
extremamente frágeis e susceptíveis a qualquer dano. Um vidro de 38x38cm foi cortado para que
proteger as células. Tendo as chapas de vidro em mãos, foi realizada a colagem dos paineis
através de silicone. Cada célula foi ligada para se obter 2 conjuntos de 18 células em série. Além
disso, um pequeno circuito compostos por 4 diodos foi usado para proteger contra tensão e
corrente reversa. Após a montagem o Módulo foi selado através de perfis U em alumínio através
de silicone. O resultado final pode ser visualizado na figura 35.
90
APÊNDICE 5 – FIRMWARE
//Header Files//
#include <msp430.h>
#include "msp430f5132.h"
//Definitions//
#define CALTDH0CTL1_200 *((unsigned int *)0x1A34)
#define TURN_OFF_BUCK_STAGE TD0CCTL1 = TD0CCTL2 = OUTMOD_0;
#define TURN_ON_BUCK_STAGE {TD0CCTL1 = OUTMOD_6; TD0CCTL2 = OUTMOD_2;}
#define TURN_ON_BOOST_STAGE TD1CCTL1 = OUTMOD_6;
#define TURN_OFF_BOOST_STAGE TD1CCTL1 = OUTMOD_0;
#define REF_AVG_LOAD_COUNTER 2
#define REF_AVG_MPPT_COUNTER 2
#define REF_AVG_STANDBY_COUNTER 20 // 5 seconds in standby mode
#define SUFFICIENT_PANEL_VOLTAGE 278 // 4.0V; To turn off the load; charge battery
#define PANEL_UPPER_LIMIT 933 // 12.0V to turn off the buck; protection purpose
#define MPPT_STATE 0
#define STAND_BY_STATE 1
#define LOAD_MANAGEMENT_STATE 2
#define START_MPPT_STATE 3
#define START_STANDBY_STATE 4
#define START_LOAD_MANAGEMENT_STATE 5
93
//Variable declaration//
unsigned int ADC_Readings [5],
System_reset_Mode_ON, Load_Monitor_Mode_ON,
// Flags for comparator ISR
OC_Triggered = 0, OC_Triggered_Counter = 0,
// Flags for over load current protection
OV_Triggered = 0, OV_Triggered_Counter = 0,
// Flags for over load voltage protection
Load_On = 0,
Charge_On = 0,
CV_Mode = 0,
cc_to_cv = 0,
Wait_State = 0,
Wait_Counter = 0,
Battery_Low_Current_Counter = 0,
Dimm_on = 0;
int MPPT_Direction = 1,
LPM3_On = 0;
int Present_State;
int ms=0, sec=0, min=0;
//Functions
void init_IO (void);
void Init_Clocks (void);
void SetVcoreUp (unsigned int level);
void init_WDT (void);
void init_ADC (void);
void MPPT (void);
void init_TimerD_BUCK (void);
void init_TimerD_BOOST (void);
void init_TimerA (void);
void Load_Management (void);
void PI_Control (void);
void init_Comparator_LoadMonitor (void);
void init_Comparator_System_Reset (void);
void Battery_Charge_Profiling(void);
void init_WDTLowpowermode3 (void);
void Average_LOAD_ADC_Values(void);
void Average_MPPT_ADC_Values(void);
94
void Average_STANDBY_ADC_Values();
// Main loop
while(1)
{
switch(Present_State)
{
case MPPT_STATE :
{
if(Avg_MPPT_Counter >= REF_AVG_MPPT_COUNTER)
{
Average_MPPT_ADC_Values();
if((Panel_Voltage < PANEL_UPPER_LIMIT)&&(!Wait_State)&&(Battery_Voltage < Panel_Voltage))
{
TURN_ON_BUCK_STAGE;
if(MPPT_Loop == 1) MPPT();
else Battery_Charge_Profiling();
// update timers
TD0CCTL0 &= ~TDIFG;
// wait till the timer completes its current cycle
while(!(TD0CCTL0 & TDIFG));
TD0CCR1 = 1000-Duty_Buck;
TD0CCR2 = 1000-Duty_Buck-DEADTIME;
if(Panel_Voltage > PANEL_UPPER_LIMIT)
Present_State = START_STANDBY_STATE;
}//end if
if (((Battery_Charging_Current < 10)&&(!Wait_State))||(Panel_Voltage > PANEL_UPPER_LIMIT))
{
Battery_Low_Current_Counter++;
if((Battery_Low_Current_Counter > 10)||(Panel_Voltage > PANEL_UPPER_LIMIT))
{
TURN_OFF_BUCK_STAGE;
Duty_Buck = 500; // 50%
Wait_State = 1;
Wait_Counter = 0;
if(Panel_Voltage < SUFFICIENT_PANEL_VOLTAGE)
Present_State = START_STANDBY_STATE;
}
}
}
else if((Battery_Charging_Current > 9))
// reset counter once the battery current comes up
Battery_Low_Current_Counter = 0;
/* This block generates approximately 5 seconds delay whenever battery current goes below a threshold value or panel voltage goes
above upper limit panel is switched off and restarted after 5 seconds*/
if(Wait_State == 1)
95
{
Wait_Counter++;
if(Wait_Counter > 100)
{
Wait_State = 0;
Wait_Counter = 0;
Battery_Low_Current_Counter = 0;
}
}
}// end of MPPT_STATE block
break;
case STAND_BY_STATE :
{
if(Avg_MPPT_Counter >= REF_AVG_STANDBY_COUNTER)
{
Average_STANDBY_ADC_Values();
if(Panel_Voltage > PANEL_UPPER_LIMIT)
{
//Present_State = START_MPPT_STATE;
//system reset
PMMCTL0 |=PMMSWBOR;
// Brown out reset by software
}
else if(Panel_Voltage < SUFFICIENT_PANEL_VOLTAGE)
{
//enable timer D for boost
TURN_OFF_BUCK_STAGE
TD1CTL0 |= MC_1;
Present_State = START_LOAD_MANAGEMENT_STATE;
Load_On = 0;
}
else
{
Present_State = STAND_BY_STATE;
LPM3_On = 1;
PJOUT |= LED_1; //Debug
__bis_SR_register(LPM3_bits);
}
}
}// end of STAND_BY_STATE block
break;
case START_MPPT_STATE :
{
init_WDT(); // set the ADC sampling interval to 3.2ms
// Duty_Buck = (Battery_Voltage/(Panel_Voltage*1.25))*1000;
if(Duty_Buck < DUTY_BUCK_LOWER_THRESHOLD)
Duty_Buck = DUTY_BUCK_LOWER_THRESHOLD;
MPPT_Direction = 1;
Present_State = MPPT_STATE;
} // end of START_MPPT_STATE block
break;
case START_STANDBY_STATE :
{
init_WDTLowpowermode3(); // change the ADC sampling interval from 32ms to .25s
//for low standby current
CBCTL1 &= ~CBON; // switch off the comparator to save power
//disable timer D to save power
TD0CTL0 &= ~MC_1;
TD1CTL0 &= ~MC_1;
TURN_OFF_BUCK_STAGE;
TURN_OFF_BOOST_STAGE;
Present_State = STAND_BY_STATE;
}// end of START_STANDBY_STATE block
break;
96
case LOAD_MANAGEMENT_STATE :
{
if(Avg_MPPT_Counter >= REF_AVG_MPPT_COUNTER)
Average_MPPT_ADC_Values();
if(Avg_LOAD_Counter >= REF_AVG_LOAD_COUNTER)
{
Average_LOAD_ADC_Values();
// first check all the exit conditions
if (Panel_Voltage > PANEL_UPPER_LIMIT)
PMMCTL0 |=PMMSWBOR; // Brown out reset by software
else // If panel voltage in range, Charge power bank
{
if(Panel_Voltage > SUFFICIENT_PANEL_VOLTAGE)
{
Present_State = START_STANDBY_STATE;
TURN_OFF_BOOST_STAGE;
TURN_OFF_TIMER_A;
Load_On=0;
}
else //If panel voltage low, Power-on LEDs
{
// if (P3IN && SENSOR) Dimm_on = 0; //IR sensor active in "H"
if (Dimm_on == 0) Ref_Load_Current = REF_LOAD_CURRENT_FULL_BRIGHTNESS;
else Ref_Load_Current = REF_LOAD_CURRENT_HALF_BRIGHTNESS;
if (Battery_Voltage < BANK_ULV)
{
init_Comparator_System_Reset();
PJOUT |= LED_2; //Debug
__bis_SR_register(LPM4_bits);
}
else if(Battery_Voltage < BANK_LV)
{
Ref_Load_Current = REF_LOAD_CURRENT_LOW_BRIGHTNESS;
TURN_OFF_TIMER_A;
}
if(OC_Triggered) // if over current has triggered wait for approximately 10s and restart boost
{
OC_Triggered_Counter++;
if(OC_Triggered_Counter == OC_TRIGGERED_COUNTER_THRESHOLD)
{
Duty_Boost = 500;
TURN_ON_BOOST_STAGE;
Load_On = 1;
OC_Triggered = 0;
OC_Triggered_Counter = 0;
}
}
}
if(OV_Triggered) // if over voltage has triggered wait for approximately 10s and restart boost
{
OV_Triggered_Counter++;
if(OV_Triggered_Counter == OV_TRIGGERED_COUNTER_THRESHOLD)
{
Duty_Boost = 500;
TURN_ON_BOOST_STAGE;
Load_On = 1;
OV_Triggered = 0;
OV_Triggered_Counter = 0;
}
}
}
if(Load_On)
Load_Management();
}
}// end of LOAD_MANAGEMENT_STATE block
break;
97
case START_LOAD_MANAGEMENT_STATE :
{
if(Battery_Voltage > BANK_LV)
{
init_WDT(); // initialize ADC sampling interval to 32ms
init_Comparator_LoadMonitor();
TURN_ON_TIMER_A;
// Ref_Load_Current = REF_LOAD_CURRENT_HALF_BRIGHTNESS;
Ref_Load_Current = REF_LOAD_CURRENT_FULL_BRIGHTNESS;
Load_On = 1;
Duty_Boost = 500;
TURN_ON_BOOST_STAGE;
Present_State = LOAD_MANAGEMENT_STATE;
}
}// end of START_LOAD_MANAGEMENT_STATE block
break;
default : break;
}//end of switch block
}//end of main loop
}//end main
if(MPPT_Direction == 1)
{
Duty_Buck ++;
if(Duty_Buck>DUTY_BUCK_UPPER_THRESHOLD)
Duty_Buck=DUTY_BUCK_UPPER_THRESHOLD;
}
else
{
Duty_Buck --;
if(Duty_Buck<DUTY_BUCK_LOWER_THRESHOLD)
Duty_Buck=DUTY_BUCK_LOWER_THRESHOLD;
}
Prev_Battery_Charging_Current = Battery_Charging_Current;
Prev_Panel_Voltage = Panel_Voltage;
if(Battery_Charging_Current >= CC_LIMIT ||(Battery_Voltage >= CC_TO_CV_LIMIT))
{
MPP_Loop_Exit_Counter ++;
if (MPP_Loop_Exit_Counter > MPPT_LOOP_EXIT_LIMIT)
{
MPPT_Loop = 0;
MPP_Loop_Exit_Counter = 0;
CC_Loop_Exit_Counter=0;
if (Battery_Voltage > CC_TO_CV_LIMIT)
CV_Mode = 1;
else
CV_Mode = 0;
}
}
else
MPP_Loop_Exit_Counter = 0;
}
DUTY_BUCK_UPPER_THRESHOLD = DUTY_BUCK_LOWER_THRESHOLD;
if ((Battery_Voltage <= CC_TO_CV_LIMIT) && (!CV_Mode) && (Battery_Voltage < Panel_Voltage))
{
if (Battery_Charging_Current < CC_LIMIT)
{
Duty_Buck++;
if (Duty_Buck > DUTY_BUCK_UPPER_THRESHOLD)
{
Duty_Buck = DUTY_BUCK_UPPER_THRESHOLD;
CC_Loop_Exit_Counter ++;
if (CC_Loop_Exit_Counter > MPPT_LOOP_EXIT_LIMIT)
{
MPPT_Loop = 1;
MPP_Loop_Exit_Counter = 0;
CC_Loop_Exit_Counter = 0;
Present_State = START_MPPT_STATE;
}
}
}
else if (Battery_Charging_Current > CC_LIMIT)
{
Duty_Buck--;
if (Duty_Buck < DUTY_BUCK_LOWER_THRESHOLD)
Duty_Buck = DUTY_BUCK_LOWER_THRESHOLD;
CC_Loop_Exit_Counter = 0;
}
}
else
{
CV_Mode = 1;
if (Battery_Voltage < CC_TO_CV_LIMIT)
{
Duty_Buck++;
if (Duty_Buck > DUTY_BUCK_UPPER_THRESHOLD)
Duty_Buck = DUTY_BUCK_UPPER_THRESHOLD;
}
else
{
Duty_Buck--;
if (Duty_Buck < DUTY_BUCK_LOWER_THRESHOLD)
Duty_Buck = DUTY_BUCK_LOWER_THRESHOLD;
}
if (Battery_Voltage < FLOAT_VOLTAGE)
{
CC_Loop_Exit_Counter ++;
if (CC_Loop_Exit_Counter > MPPT_LOOP_EXIT_LIMIT)
{
MPPT_Loop = 1;
MPP_Loop_Exit_Counter = 0;
CC_Loop_Exit_Counter = 0;
Present_State = START_MPPT_STATE;
}
}
}
}
}
TD1CCTL0 &= ~CCIFG;
while(!(TD1CCTL0 & CCIFG)); // WAIT TILL THE TIMER COMPLETES ITS CURRENT CYCLE
TD1CCR1 = 1000-Duty_Boost;
}
void Average_MPPT_ADC_Values()
{
Avg_MPPT_Counter = 0;
Panel_Voltage = Panel_Voltage_Buffer/REF_AVG_MPPT_COUNTER;
if (Panel_Voltage == 0) Panel_Voltage = 1;
Battery_Voltage = Battery_Voltage_Buffer/REF_AVG_MPPT_COUNTER;
Load_Voltage = Load_Voltage_Buffer/REF_AVG_MPPT_COUNTER;
Battery_Charging_Current = Battery_Charging_Current_Buffer/REF_AVG_MPPT_COUNTER;
Load_Voltage_Buffer = 0;
Panel_Voltage_Buffer = 0;
Battery_Voltage_Buffer = 0;
Battery_Charging_Current_Buffer = 0;
}
void Average_STANDBY_ADC_Values()
{
Avg_MPPT_Counter = 0;
Panel_Voltage = Panel_Voltage_Buffer/REF_AVG_STANDBY_COUNTER;
if (Panel_Voltage == 0) Panel_Voltage = 1;
Battery_Voltage = Battery_Voltage_Buffer/REF_AVG_STANDBY_COUNTER;
Load_Voltage = Load_Voltage_Buffer/REF_AVG_STANDBY_COUNTER;
Battery_Charging_Current = Battery_Charging_Current_Buffer/REF_AVG_STANDBY_COUNTER;
Load_Voltage_Buffer = 0;
Panel_Voltage_Buffer = 0;
Battery_Voltage_Buffer = 0;
Battery_Charging_Current_Buffer = 0;
}
void Average_LOAD_ADC_Values()
{
Avg_LOAD_Counter = 0;
Load_Current = Load_Current_Buffer/REF_AVG_LOAD_COUNTER;// Copy ADC Readings for use
Load_Current_Buffer = 0;
}
// Timer0 A0 interrupt service routine; count for any hours, specified in minutes
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
ms++;
if(ms == 1000)
{
sec++;
ms = 0;
PJOUT ^= LED_1; // TOGGLE LED1 using XOR
}
if(sec == 60)
{
min++;
ms = sec = 0;
}
101
if(min == MINUTES)
{
ms = sec = min = 0;
Dimm_on = 1;
}
TA0CCTL0 &= ~CCIFG;
TA0CTL &= ~TAIFG;
}
/*Comparator generates interrupt when +ve terminal is higher than -ve one
* So here ref voltage is given to -ve terminal*/
// Configured to detect over current
// Generates interrupt when load current goes above approximately 730mA
void init_Comparator_LoadMonitor (void)
{
System_reset_Mode_ON = 0;
Load_Monitor_Mode_ON = 1;
// clear all registers
CBCTL0 = CBCTL1 = CBCTL2 = CBCTL3 = CBINT = 0;
CBCTL0 |= CBIPEN + CBIPSEL_4; // Enable V+, input channel CB4 (L_I)
CBCTL1 |= CBPWRMD_1; // normal power mode
CBCTL2 |= CBRSEL; // VREF is applied to -terminal
CBCTL3 |= BIT4; // Input Buffer Disable @P1.4/CB4
CBCTL2 |= CBRS_2 + CBREFL_3+ CBREF1_6 + CBREF0_6; // REF2.5V applied to R-ladder (0.547V)
__delay_cycles(7500); // delay for the reference to settle
CBINT &= ~(CBIFG + CBIIFG); // Clear any errant interrupts
CBINT |= CBIE; // Enable CompB Interrupt on rising edge of CBIFG (CBIES=0)
CBCTL1 |= CBON; // Turn On ComparatorB
}
// Configured to detect oanel sufficient voltage
// Generates interrupt when panel voltage goes above configured voltage
void init_Comparator_System_Reset (void)
{
System_reset_Mode_ON = 1;
Load_Monitor_Mode_ON = 0;
// clear all registers
CBCTL0 = CBCTL1 = CBCTL2 = CBCTL3 = CBINT = 0;
CBCTL0 |= CBIPEN + CBIPSEL_0; // Enable V+, input channel CB0 (P_V)
CBCTL1 |= CBPWRMD_1; // normal power mode
CBCTL2 |= CBRSEL; // VREF is applied to -terminal
CBCTL3 |= BIT0; // Input Buffer Disable @P1.0/CB4
CBCTL2 |= CBRS_2 + CBREFL_3 + CBREF1_28 + CBREF0_28; // REF2.5V applied to R-ladder (2.266V)
__delay_cycles(7500); // delay for the reference to settle
CBINT &= ~(CBIFG + CBIIFG); // Clear any errant interrupts
CBINT |= CBIE; // Enable CompB Interrupt on rising edge of CBIFG (CBIES=0)
CBCTL1 |= CBON; // Turn On ComparatorB
}
// Worst-case settling time for the DCO when the DCO range bits have been
// changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx
// UG for optimization.
// 32 x 32 x 25 MHz / 32,768 Hz ~ 780k MCLK cycles for DCO to settle
__delay_cycles(782000);
// Loop until Xt1 & DCO stabilizes - In this case only DCO has to stabilize
do
{
UCSCTL7 &= ~(XT1LFOFFG + XT1HFOFFG + DCOFFG); // Clear XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}
while (SFRIFG1&OFIFG); // Test oscillator fault flag
}
//IO INITIALISATION//
void init_IO (void)
{
// General IO config
P1OUT = 0;
P2OUT = 0;
PJOUT = 0;
P1SEL |= BIT6 + BIT7; //CONFIGURE TD0.1 , PW_H
P1DIR |= BIT6 + BIT7; //OUTPUT HIGH SIDE MOSFET
P2SEL |= BIT0 + BIT2; //CONFIGURE TD0.2 , TD1.1 FOR PW_L , PW_B
P2DIR |= BIT0 + BIT1 + BIT2; //OUTPUT LOW SIDE MOSFET, BOOST STAGE MOSFET
P3SEL &= ~BIT6; //P3.6 = IN
P3REN |= BIT6; //ENABLE P3.6 RESISTOR
P3OUT |= 0; //P3.6 RESISTOR = PULL-DOWN
PJDIR |= BIT4 + BIT5; //CONFIGURE STATUS LEDS
//ADC INITIALISATION//
void init_ADC (void)
{
ADC10CTL0 = ADC10SHT_2 + ADC10MSC + ADC10ON;
// 8clk cycles, Single trigger, conversion disabled
ADC10CTL1 = ADC10SHP + ADC10CONSEQ_1;
// Sampling timer, Sequence of channels
ADC10CTL2 |= ADC10RES;
// 10-bit conversion results
ADC10MCTL0 = ADC10INCH_4 + ADC10SREF_1;
// A4,A3,A2,A1,A0(EoS), Vref+ = Vref, Vref- = gnd
#pragma vector=DMA_VECTOR
__interrupt void DMA0_ISR (void)
{
switch(__even_in_range(DMAIV,16))
{
case 0: break; // No interrupt (No conversion)
case 2: // Sequence of conversions complete, Interrupt due to channel 0
ADC10CTL0 &= ~ADC10ENC; // Disabled Conversion
Panel_Voltage_Buffer += ADC_Readings [P_V];
Battery_Voltage_Buffer += ADC_Readings [B_V];
Battery_Charging_Current_Buffer += ADC_Readings [B_I];
Load_Voltage_Buffer += ADC_Readings [L_V];
Load_Current_Buffer += ADC_Readings [L_I];
Avg_LOAD_Counter++;
Avg_MPPT_Counter++;
if(ADC_Readings [L_V] > LOAD_VOLTAGE_LIMIT) // load voltage > limit => disable load
{
TURN_OFF_BOOST_STAGE;
Load_On = 0;
OV_Triggered = 1;
OV_Triggered_Counter = 0; // Take action for over current protection by setting a flag
}
// to prevent boosting
if(ADC_Readings [P_V] > PANEL_UPPER_LIMIT)
{
TURN_OFF_BUCK_STAGE;
Duty_Buck = 500; // SET DC=50%
Wait_State = 1;
Wait_Counter = 0;
}
// reset counter if these are overflowing. This can happen when MCU is in LPM
if(Avg_LOAD_Counter>REF_AVG_LOAD_COUNTER)
104
{
Avg_LOAD_Counter = 0;
Load_Current_Buffer = 0;
}
if((Avg_MPPT_Counter==REF_AVG_STANDBY_COUNTER)&&(LPM3_On==1))
{
LPM3_On = 0;
ADC10CTL0 &= ~ADC10ON; // turn off ADC core to save power
LPM3_EXIT;
}
break; // DMA0IFG