智能光伏汇流采集.docx
《智能光伏汇流采集.docx》由会员分享,可在线阅读,更多相关《智能光伏汇流采集.docx(13页珍藏版)》请在冰豆网上搜索。
智能光伏汇流采集
智能光伏汇流信号采集装置
摘要:
伴随着世界人口的不断增长和城市化进程的不断推进,化石能源日趋枯竭,燃烧化石燃料所导致的环境污染日趋严重。
太阳能是一种低密度的平面能源,需要数量巨大的太阳能电池板阵列进行串并联组合来达到所需功率,为了减少电池组件与逆变器之间的连接线和方便日后维护,同时减少投资成本,需要在直流侧配置光伏阵列汇流箱、逐级汇流的方式进行一次和二次汇流,而在汇流的过程中对电路电流的实时状态监测就尤为重要。
我们的作品是基于飞思卡尔MC9S12XS128单片机强大的模拟信号采集和处理能力的信号采集装置,采用TL072运放作为电压信号的放大模块,DALLAS18B20传感器作为温度采集模块,通过单片机的AD模块进行信号采集,传给单片机内部进行信号处理,在LCD12864显示出来,同时进行数据的处理和判断,若电流信号超过一定阈值,就进行光声报警。
1.作品描述
(1)实现的主要功能
1、多路电流状态检测,包括瞬态和平均直流电流,以及电压值。
2、对电池开路报警,可设置报警最小阈值。
3、实时液晶显示监测动态。
4、对周围温度采集。
5、实现光声报警提示。
(2)实用性或者创新点
在化石能源日趋枯竭,新能源的开发和投入使用需求日益严峻的今天,对新能源太阳能开发的过程中光伏电池的状态监测需求也同样伴随而生,我们的作品可以用于监测太阳能光电池阵列中电池板运行状态,光电池电流测量,汇流箱温度等状态信号采集和监测以及报警。
2、系统设计方案说明
2.1系统总体方案
MC9S12X系列单片机是飞思卡尔半导体公司的产品,总线频率是16MHZ,具有丰富的外设和I/O资源,多数引脚具有复用功能,具有256KB的内部程序存储器,用来保存程序和原始数据。
它的ATD模块是8通道、10位精度,多路复用、主次逼近型的模数转换器,其优点是速度较高、功耗低、性价比高。
我们的方案是通过由稳压源通过我们的多路电流电压发生器产生我们要采集的信号,该发生器由滑动变阻器和多个电阻串并而成,通过运放TL072将要采集的信号进行放大后供给单片机。
单片机AD模块的AN引脚进行信号采集后,送进单片机内部寄存器,通过对内部寄存器改变设置采集的信号的精度,处理后发送到LCD12864液晶屏进行显示。
同时对温度传感器18B20进行温度采集和显示。
2.2系统子模块设计
1、多路电流电压信号发生器
我们的方案是通过由稳压源通过我们的多路电流电压发生器产生我们要采集的信号,该发生器由滑动变阻器和多个电阻串并而成,通过运放TL072将要采集的信号进行放大后供给单片机。
多路电流电压信号发生器
多路电流电压信号发生器实物图
同相放大电路
电压增益Av
Av=Vi/Vo
=(R1+R2)/R1
=1+R2/R1
2、LCD12864液晶电路
程序:
#include/*commondefinesandmacros*/
#include"derivative.h"/*derivative-specificdefinitions*/
#defineucharunsignedchar
#defineuintunsignedint
#defineRSPORTA_PA4
#defineRWPORTA_PA2
#defineEPORTA_PA0
#definePSBPORTE_PE2
#defineRESPORTB_PB5
charc[10]={'0','1','2','3','4','5','6','7','8','9'};
intboo=0;
inti=0;
intx,y,z,t;
floatm;
floatn=0.01953;
uchardis[]=
{"通道1:
电压:
5.0V""通道3:
电压:
5.0V"
"通道2:
电压:
3.0V""通道4:
电压:
4.6V"};
uchardis1[]=
{"通道5:
电压:
5.0V""通道7:
电压:
4.2V"
"通道6:
电压:
3.8V""通道8:
电压:
3.2V"};
voidPLL_Init()//PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
{//锁相环时钟=2*16*(2+1)/(1+1)=48MHz
REFDV=1;//总线时钟=48MHz/2=24MHZ
SYNR=2;
while(!
(CRGFLG&0x08));//时钟校正同步,等待单片机内部时钟稳定
CLKSEL=0x80;//再次使能PLLCLK,确保不出错
}
voiddelay(longintz)
{
uinti,j;
for(i=0;i<10;i++)
for(j=0;j}
/*voidcheckBusy()//检测忙标志
{
ucharbusy;
DDRT=0X00;
do
{
E=0;
RS=0;
RW=1;
//delay4us();
E=1;//在使能端的一个上升沿读取LCD数据
busy=PTT;
//delay4us();
E=0;
}while(busy&0x80);//判断最高位是否为0,为0则处于空闲状态
DDRT=0XFF;
}*/
voidtrans(uchardat,uintrs)//写入子函数,rs为1写数据,rs为0写指令
{
//checkBusy();
RW=0;
RS=rs;
delay(24);
PTT=dat;
E=1;
delay(24);
E=0;
}
voidLCDinit()
{
RES=0;//复位
RES=1;//复位置高
trans(0x30,0);//使用基本指令集,不打开绘图显示
trans(0x02,0);//地址归位
trans(0x0c,0);//显示开,游标关
trans(0x01,0);//清除显示
trans(0x06,0);//整体显示不移动,游标右移
}
voidwrite(uchar*adder1)
{
unsignedchari;
trans(0x80,0);//SetGraphicDisplayRAMAddress
//delay(100);
for(i=0;i<32;i++)
{
trans(*adder1,1);
adder1++;
}
trans(0x90,0);//SetGraphicDisplayRAMAddress
//delay(100);
for(i=32;i<64;i++)
{
trans(*adder1,1);
adder1++;
}
}
voidxshanzi1()
{
delay(60000);
dis[12]='0';dis[14]='1';
dis[28]='0';dis[30]='1';
dis[44]='0';dis[46]='1';
dis[60]='0';dis[62]='1';
write(dis);
}
voidxshanzi2()
{
delay(60000);
dis1[12]='0';dis1[14]='1';
dis1[28]='0';dis1[30]='1';
dis1[44]='0';dis1[46]='1';
dis1[60]='0';dis1[62]='1';
write(dis1);
}
voidATD_Init()//AD初始化
{
ATD0CTL1=0x00;//8bit
ATD0CTL2=0x40;//fastclearflag,disenableinterrupt,externaldisable
ATD0CTL3=0xc0;//8channel,rightjustified,nofifo,nofreezed
ATD0CTL4=0x21;//4ATDclock,PRS=1,ATDclock=[Busclock/(PRS+1)]*0.5
ATD0CTL5=0x30;//specialchanneldisenable,continuousacquisition,multi-channel,firstAN0
ATD0DIEN=0x00;//disenabledigitialinput
}
intGet_AD(bytech)//AD采样
{
intad;
while(!
ATD0STAT0_SCF);
switch(ch)
{
default:
case0:
ad=ATD0DR0;
break;
case1:
ad=ATD0DR1;
break;
case2:
ad=ATD0DR2;
break;
case3:
ad=ATD0DR3;
break;
case4:
ad=ATD0DR4;
break;
case5:
ad=ATD0DR5;
break;
case6:
ad=ATD0DR6;
break;
case7:
ad=ATD0DR7;
break;
}
returnad;
}
voidmain()
{
PLL_Init();
ATD_Init();
LCDinit();
PSB=1;//设置为并行工作模式
DDRA=0XFF;//设置为输出
DDRB=0xFF;
DDRE=0XFF;
DDRT=0XFF;
DDRP=0X00;//设置为输入
PERP=0XFF;
PPSP=0X00;
PORTA=0x00;
PORTB=0x00;
PORTE=0x00;
PTT=0x00;
EnableInterrupts;
while
(1)
{
t=Get_AD(0);
m=t*n;
}
}
/*while
(1)
{
if(PTP_PTP0==0&&boo==1){boo=0;xshanzi1();}
if(PTP_PTP2==0&&boo==0){boo=1;xshanzi2();}
}*/