新能源发电综合实践光伏并网发电模拟装置
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
光伏并网发电模拟装置
摘要
本设计以dsPIC30F2010单片机为控制器,采用全桥DC/AC逆变电路和双极性SPWM 控制构建模拟光伏并网发电系统。
设计的系统绝大部分指标满足设计指标要求,不仅具有性能优良的模拟光伏电池的最大功率跟踪、数字锁频锁相功能,而且有低的输出电压THD,高的效率和可靠性,以及采用打嗝方式的欠压和过载保护和故障排除后自恢复功能。
关键词:太阳能,并网光伏发电系统,MPPT,数字锁相
ABSTRACT
A grid photovoltaic inverter was proposed and designed with MCU dsPIC30F2010, DC/AC power topology and SPWM control scheme. The inverter can almost meet the design specifications, and had not only good performance MPPT, phase lock,but also low THD,high efficiency and reliability. The hip protection scheme was adopted for undervoltage and
over-current.
Keywords:Solar energy,grid photovoltaic inverter, MPPT, digital phase lock
一、方案论证与比较
太阳能电池板价格昂贵,且光电转换效率低,因此并网型光伏发电系统的效率、最大功率跟踪MPPT、输出电压/电流的THD、锁频锁相等性能为关键核心指标。
根据设计任务要求,以上述指标为方案评估指标,论证系统关键的方案如下:
1.1 光伏逆变器的SPWM控制波形产生方案评估
方案一:用分立器件电路产生,主要由三角波发生器、正弦波发生器和比较器组成,但由于其电路复杂、灵活性差、调试困难等缺点,因此一般很少采用。
方案二:用专有集成芯片产生,虽然功能较强,输出波形质量较高,但是灵活性差、采用性能优良的控制方法能力差、成本较高,不适合小系统的设计需要。
方案三:用单片机或者数据信号处理器等数字控制器实现,目前许多单片机都具有产生SPWM波的功能。
采用单片机具有电路简单可靠、灵活性好、可以采用性能优良的控制方法,而且方便实现系统状态监控、显示和处理,使整个系统控制非常方便。
鉴于上述分析,选用方案三。
1.2 SPWM控制方法及功率电路评估
方案一:单极性控制方式,该控制方式仅用到一对高频开关,相对于双极性逆变具有损耗低、电磁干扰少;但其控制方式较为复杂。
方案二:双极性控制方式,该控制方式电流谐波分量小、易于消除,且其控制方式简单得到广泛应用。
虽然本发电模拟装置功率小,但由于全桥电路不存在半桥电路的中点电压可能不平衡问题(如果中点电压不平衡,将使逆变输出的正弦波有直流偏量),所以功率电路采用全桥电路。
鉴于上述分析,选用方案二以及全桥功率电路。
全桥DC/AC 驱动电路LC
滤
波
器
负
载
两路PWM
互补输出
控制芯片
dsPIC30f201
Uf信号
采样电路
Us、Ud 采样电路
Io Uo
采样电路模拟正弦信
号Uref
Ud Us
Rs
模拟光伏电池
u f
u o1
n1n2
n3
T
隔离变压器图1.光伏发电模拟装置系统框图
1.3 单片机选型
微控制器运算能力对系统性能有关键影响,方案评估如下:
方案一:采用PIC16F877A,该单片机为Microchip八位单片机,性价比高,但由于无硬件乘法器,运算速度较慢,很难满足该系统高性能数字控制要求。
方案二:采用dsPIC30F2010,该单片机嵌入DSP引擎,具有一个高速的硬件乘法器,拥有数字信号处理器的计算能力和数据吞吐能力,指令执行速度可达30MIPS,且性价比高,适合作为该系统的核心控制器件。
鉴于上述分析,选用方案二。
根据论证的方案,设计的光伏发电模拟装置系统框图如图1。
系统各模块分析设计和实现如第二部分。
二、理论分析与计算
2.1 MPPT控制策略及实现
在本题条件下对光伏电池进行模拟,要使得DC/AC逆变器具有最大功率点跟踪(MPPT)功能,就是要使得U d=U s/2;利用两个电压采样电路对直流稳压电源U s和输入电压值U d同时进行采样,计算采样值AD_averag0(输入电压值U d对应的采样值)与电压计算值AD_PI_OUT_REF(根据直流稳压电源U s对应采样值AD_averag2计算得到的基准值)的误差;将其误差转化为调制载波比的误差,对调制载波比采用增量式PI算法∆u(k)= u(k)-u(k-1)= K p*[e(k)-e(k-1)]+K i*e(k)进行调节,目的即是使得U d=U s/2;通过调节调制载波比来调节功率输出的大小,实现:当输出电压U d>U s/2时,增大调制载波比,使输出电流增大,从而使U d(U s-I d*R s)下降;当输出电压U d<U s/2时,减小调制载波比,使输出电流减小,从而使U d(U s-I d*R s)上升。
最终使得输出电压U d趋于稳定,以此方法实现了模拟MPPT 的功能。
本设计采用试凑法得到PI调节的参数:比例系数K p、积分系数K i。
经过不断的调整,得到了较为满意的控制效果。
(1) 确定比例系数K p:去掉PI的积分项,可以令K i=0使之为纯比例调节。
比例系数K p由0开始逐渐增大,直至U d出现振荡;再反过来,从此时的比例系数K p逐渐减小,直至U d振荡消失。
记录此时的比例系数K p,设定PI比例系数K p为当前值的60%~70%。
(2) 确定积分系数K i:比例系数K p确定之后,设定一个较大的积分系数K i,然后逐渐减小K i,直至U d出现振荡,然后再反过来,逐渐增大K i,直至U d振荡消失。
记录此时的K i,设定PI的积分系数K i为当前值的150%~180%。
(3) 对PI参数进行微调,直到满足性能要求。
2.2 数字锁相(同频、同相)控制策略及实现
并网部分要求工作时的负载电流必须与电网电压信号严格的同频同相,才能保证整个系统的安全运转,为了实现这个目标,通常使用锁相环来实现,本次设计用软件方式实现锁相,具体实现方法为:
利用两个正弦电压过零检测电路将模拟电网电压的正弦参考基准信号和电流反馈u f正弦信号分别转换为与其同频同相的方波信号,再利用dsPIC30F2010单片机的输入捕捉功能(引脚IC2/IC1)分别对两个方波信号的下降沿双次捕捉后进行中断处理。
锁频的实现:利用dsPIC30F2010单片机的IC2口对模拟电网电压对应的方波信号的两次下降沿进行捕获(其以dsPIC30F2010内部的TIMER2为时基),在中断子程序中读取捕捉缓冲器中IC2BUF的值两次,并保存在IC2BUF_reslut1、IC2BUF_result2中,计算此时的模拟电压正弦信号的周期(IC2BUF_result2 -IC2BUF_result1),得到每个PWM波的周期值PTPER,产生新的正弦输出周期,实现同频。
锁相的实现:在程序里面有个作为逆变器正弦波输出计数点的指针sin_v_n,为了防止波形的畸变,可以在一定范围内通过连续改变sin_v_n的值来实现相位的调整。
利用dsPIC
30F2010单片机的IC1口对电流反馈u f 正弦信号对应的方波信号的两次下降沿进行捕获(其也以dsPIC30F2010内部的TIMER2为时基),在中断子程序中读取捕捉缓冲器中IC1BUF 的值两次,并保存在IC1BUF_reslut1、IC1BUF_result2中,计算此时的相位偏移(IC1BUF_res ult2 –IC2BUF_result1),将其转化为指针sin_v_n 同量级的误差,在以后的数个正弦周期里对指针sin_v_n 进行微调整,直到消除相位偏移为止,从而实现输出正弦电压信号与模拟电网电压正弦信号的同相。
其中硬件方面主要在于实现电网过零点检测电路的稳定性,本检测电路为消除毛刺使用的是RC 滤波;软件方面需要保证两次输入捕捉数据的同步,通过设置一个标志寄存器IC_flag:当IC_flag=1时,两路捕捉保存数据;当IC_flag=0时,两路捕捉不保存数据并对上一次数据进行处理。
2.3 提高系统效率方法
光伏发电装置的主要损耗有功率开关器件、滤波电感以及控制电路功耗。
为提高系统效率,可采取选择合适的开关频率、性能优越的开关器件(通态电阻小、开关时间短)、增大滤波电感以减小电流纹波以及开关器件吸收电路。
提高MPPT 精度可以提高光伏电池利用率,即也提高效率。
2.4 滤波参数的计算
逆变器交流输出电压频率f o =45~55Hz ,逆变器开关频率设为20kHz ,滤波器的转折频率一般为(5~10) f o 。
为减少输出功率的无功分量,滤波电容的电流不大于额定输出电流的1/5。
满载时输出电流Io=0.5A ,即I o1=1A (此时U o1=14V ),则电容电流不能大于0.2A,滤波电容C 3为:
1310.20.2141225514
o o o I C uF f U ππ⨯<==⨯⨯,取4uF/250V 的CBB 电容。
在滤波电容C 3设计基础上,根据滤波器截止频率以及电感电流纹波要求,设计输出滤波电感L 1=3mH 。
滤波电感设计结果:磁芯:High Flux 的CH467060;匝数:191匝;线圈:1mm 漆包线;线圈损耗:1.75W ;因电感的高频交流励磁小,磁芯损耗可忽略不记;磁芯最大工作磁密:0.27T ,交流磁密:0.09T 。
三、电路与程序设计
3.1 DC/AC 主电路与器件设计
主电路原理图见附录图1-(a)。
主回路拓扑选择全桥逆变电路,上桥壁两个管子的漏极端需要一个浮点电压,因此选择IR2110实现高端驱动。
由于输入Us 为60V ,为保证开关管不被击穿并留有一定裕量设计选择IRF540(耐压100V 、额定电流27A 、通态电阻70m Ω)。
由于有无功功率回馈到输入侧,且功率场效应管体二极管性能差,全桥逆变电路的功率场效应管反并肖特基二极管为STPS8H100D (耐压100V 、压降0.58V 、额定电流8A )。
为减小输入端电压纹波,无功功率不回流到光伏电池,U d 端并电解电容1440uF/100V 。
3.2 控制电路及控制程序
开始
ad_flag=1?PWM 时基打开
调用I/O 端口初始化子程序调用PWM 初始化
子程序 定时时间到,显示电压电流
调用AD 初始化
子程序调用捕捉初始化子程序
主程序入口N
Y
主程序流程图
采样完毕,计
算误差PI 控制环节,调
节调制比
等待中断
调用LCD 初始化
子程序调用外部中断初始化子程序dis_flag=1?Y
N
图2. 主程序流程图
3.2.1 程序设计
主程序流程图如图2。
程序设计思想:为节约dsPIC30F2010的CPU资源,将显示部分功能放在主程序中,而将PWM输出改变程序、采样程序和输入捕捉功能设置中断,在相应中断子程序中进行相应的处理。
其dsPIC30F2010对中断的优先级也可以设置,因为PWM 输出改变脉宽的实时性要求最高,所以其中断优先级也最高,其次分别为输入捕捉、采样程序。
3.2.2 控制电路
控制电路原理图见附录图1-(b)。
用于锁相信号转换的正弦波过零点检测电路如图3,用于MPPT的输入电压采样电路如图4,输出电流采样电路如图5。
图3. 基准正弦波过零点检测电路图4. 输入电压采样电路
图5. 输出电流采样电路
图3的u REF输入的基准正弦波通过过零检测电路转化为方波输入到单片机捕捉引脚,并与采样的输出正弦波对比,通过程序控制实现同频同相。
图5的输出电流采样的值经过差分放大和经过绝对值电路整形,再经过RC滤波送到单片机A/D端口,实现过流保护和显示,以及SPWM的电流环控制(由于时间紧,实际系统未采用电流内环,但电流内环控制可以提高系统动态响应速度,改善THD)
3.3 保护电路
欠压保护:U d端用两个电阻R7和R10的分压,经单片机A/D采样与设定的保护阈值比较,如果超过阈值,单片机停止输出SPWM,实现欠压保护。
当欠压保护后,单片机将间隔5秒不断采样,如果欠压故障排除,则恢复工作,即采用打嗝方式保护。
过流保护:故障保护思想与欠压时相同,也是采用打嗝方式保护。
四、测试方案与测试结果
4.1测试方案及测试条件
4.1.1测试方案
系统测试方案框图如图6。
在U d端并万用表测U d值,在输入输出端各串一个电流表测I d、I o,在逆变器输出端连接一电能质量分析仪,测逆变器的输出频率(锁频指标)、
THD 、输出功率、电压;u REF 由函数信号发生器提供。
DC-AC
U d I d
i o1
u o
u REF
R u F
u o 1
滤波器
控制电路
n 1n 2
n 3
U S
R S
+
-
T i o
A
V
电能质量
分析仪
A
L
信号发生器
控制电路供电电源
图6. 系统测试原理框图
4.1.2测试仪器
信号发生器:台湾固纬SFG-1003;电量测量仪:杭州远方PF9811;示波器:美国泰克TDS2012B ;万用表:FLUKE 87III ;滑动变阻器:BX-7-11(10Ω/4.5A),BX-7-14(100Ω/2A)。
4.2 测试结果(测试时R S 、R L 用滑动变阻器) 4.2.1 最大功率跟踪MPPT
表1 系统MPPT 的U d 测试指标
R L (Ω)
U d (V)/误差 R S (Ω)
30 32 34 36 30 30.0/0% 30.0/0% 30.0/0% 30.1/0.3% 33 30.0/0% 30.0/0% 30.1/0.3% 30.1/0.3% 36
30.1/0%
30.0/0%
30.0/0%
30.0/0%
4.2.2 锁频
表2 系统锁频的测试指标
f REF (Hz) 45 47 49 50 51 53 55 f F (Hz) 44.99 46.96 48.95 49.93 50.95 52.92 54.96 误差
0.02%
0.09%
0.10%
0.14%
0.10%
0.10%
0.07%
表中的f REF 为函数信号发生器提供的基准正弦波频率;f F 为逆变器输出的正弦波频率。
4.2.3 效率η
当U S =60V ,U d =30V ,R S = R L =30Ω时,26.9
100%100%89.7%30.0
O d P P η=
⨯=⨯= 4.2.4 总谐波畸变率THD
根据附表1可知R S = R L =30Ω,U S =60V ,U d =30V 时,THD=3.5%。
注:由于定制的隔离升压变压器质量差,磁芯饱和较严重,接隔离变压器时,输出电
压畸变变严重。
如果用自耦调压器代替变压器(此时,自耦调压器的输出端接到逆变器的输出侧,调整匝比等于1:2),THD=1.2~2.0%,即THD 在1.2~2.0间变化。
4.2.5 相位跟踪测试
表3 相位跟踪测试指标(包括阻感负载)
相位差 f REF (Hz) (o ) 负载PF
45
47
49
50
51
53
55
0.70 -8.SS S1 -6.8 -5.3 -5.4 -5.5 -5.7 -5.9 0.90 -4.8 -5.0 -5.3 -5.4 -5.5 -4.8 -5.0 0.99
1.6
1.7
1.8
1.8
1.8
1.9
1.9
注:相位差指信号发生器的基准正弦波与逆变器输出波形的角度差;负载功率因数PF=0.99时,表示负载PF 为纯阻性负载,其余为阻感负载,如PF=0.7时,其阻抗角为cos(0.7)180/45.6o arc απ=⨯=
4.2.6 保护测试
a. 输入欠压保护
保护动作的电压值U dth =25.2V 。
当故障排除后,系统能自动恢复。
b. 输出过流保护
保护动作的电流值I oth =1.44A 。
当故障排除后,系统能自动恢复。
4.3 测试结果分析
根据测试实验结果,除相位跟踪和THD 的部分指标(阻感负载)外,设计调试的光伏发电模拟系统绝大部分指标都符合设计要求。
部分指标产生差值的原因有:1. 由于所购买的隔离变压器质量(磁心饱和和漏感大)存在问题导致输出端接上隔离变压器后THD 会变大较多,此外也将影响相位跟踪性能;2. 驱动电路与反馈电路未进行隔离以及PCB 布板不很合理,控制电路可能会受到干扰。
五、结论
经过四天三夜的努力,我们比较好完成了设计题目的大部分要求。
但由于时间太紧,任务重,以及功率电路PCB 布板经验不足,我们的设计上还存在着些不足之处,比如THD 还有差距,锁相环跟踪精度以及稳定控制等问题。
如果经过改进,相信性能还有提升空间。
在这四天三夜里,我们组员都付出了很多,也学习了很多;在这个过程中,我们遇到了很多难题,也解决了很多问题;我们收获了很多以前在课堂上所不能学到的东西。
我们将在以后的生活学习中更加努力,取得更大的进步。
六、参考文献
1.何礼高. dsPIC30F 电机与电源系列数字信号控制器原理与应用[M].北京:北京航空航天大学出版社,2007.
2.王兆安,黄 俊.电力电子技术[M].北京:机械工业出版社,2000.
附录
附录1:光伏模拟发电装置电路原理图
=
a
(a) 逆变器主电路及供电电源电路原理图
(b)控制电路原理图
附图1. 光伏模拟发电装置电路原理图
附录2:光伏模拟发电装置总谐波畸变率THD
附表1. 光伏模拟发电装置总谐波畸变率THD
R L (Ω) THD R S (Ω)
30 32 34 36 30 3.5% 3.5% 3.6% 3.8% 33 3.3% 3.5% 3.5% 3.6% 36
3.2%
3.3%
3.3%
3.5%
注:上述测试时,输入电压Us=60V,Ud=30V 。
附录3:光伏模拟发电装置部分实验波形 a.主电路实验波形
(a). 阻感负载PF=0.7时,全桥电路下桥臂Q3开关管的驱动波形ugs 和漏源级电压uds
波形(Us=60V ,Ud=38V ,Rs=30Ω,Io=0.4A )
uDS
ugs
uDS
ugs
(b). 阻性负载PF=0.99时,全桥电路下桥臂Q3开关管的驱动波形ugs和漏源级电压uds
(Us=60V,Ud=30.1V,Rs=30Ω,Io=0.8A)
b.锁相实验波形
逆变器输出正弦波
基准正弦波信号
(a). 阻感负载PF=0.7时,基准正弦波和逆变器输出波形
(Us=60V,Ud=37.5V,Rs=30Ω,Io=0.43A)
逆变器输出正弦波
基准正弦波信号
(b). 阻性负载PF=0.99时,基准正弦波和逆变器输出波形
(Us=60V,Ud=30.1V,Rs=30Ω,Io=0.82A)
附录4:光伏模拟发电系统重要源程序
//输出PWM初始化子程序
void pwminit(void)
{
PTCON =0x2002;/*前后分频为0,时基关闭,为连续向上,向下计数模式8*/
PTPER=600;/*假设晶振为12MHZ*8,4分频,得到24MHZ的主频,
时钟周期为41.6ns,即0.0416微秒,产生50us周期PWM*/
PWMCON1=0x0e11;/*PWM0为互补输出模式*/
PWMCON2=0x0302; /*特殊事件触发器输出后分频为1
输出改写与PWM时基同步使能从
占空比和周期缓冲寄存器更新*/
DTCON1=0x0008;/*死区*/
PDC1=30;
TRISE=0;
IFS2bits.PWMIF = 0;
IEC2bits.PWMIE=1;
_NSTDIS=0;//允许中断嵌套
IPC9bits.PWMIP=6;/*PWM中断优先级为6*/
IPC2bits.ADIP=4;/*AD中断优先级为4*/
SRbits.IPL=3;
}
//PWM中断子程序
void __attribute__((__interrupt__, no_auto_psv)) _PWMInterrupt(void)
{
IFS2bits.PWMIF = 0;
sin_v_n++;
if(sin_v_n>=400)
{sin_v_n=0;//计数值清零
if(!SoftStart_flag) m+=100;//软启动
if((m>3000)&&(!SoftStart_flag))
{SoftStart_flag=1;
ADCON1bits.ADON = 1;
T3CONbits.TON=1;//AD采样
T2CONbits.TON=1;//输入捕捉/*开始锁相*/
}
}
//根据调制比计算新的脉宽
carrydata=((long)m*sin_value[sin_v_n])>>7;
carrydata=PTPER*carrydata;
carrydata=carrydata>>8;
if(carrydata&0b0000100000000000) PDC1=PTPER+1;else PDC1=PTPER; carrydata=carrydata>>12;
PDC1=PDC1+(unsigned int)(carrydata);
}
//基准正弦电压信号采样
void __attribute__((__interrupt__, no_auto_psv)) _IC2Interrupt(void)
{
if(IC_flag)
{
IC2BUF_result1=IC2BUF;//保存两次捕捉值
IC2BUF_result2=IC2BUF;
IC_flag=0;
}
else
{
while(IC1CONbits.ICBNE) ICBUF_temp_result=IC1BUF;
//计算捕捉的基准正弦电压信号周期,实现同频
if(IC2BUF_result2-IC2BUF_result1>0)
{
Networkpower_cycle=(long)IC2BUF_result2-IC2BUF_result1;
PTPER_data=(uint)(Networkpower_cycle*2);
PTPER_data=PTPER_data/25;
if(PTPER_data>F_MIN_CYCLC_MAX) PTPER_data=F_MIN_CYCLC_MAX;
if(PTPER_data<F_MAX_CYCLC_MIN) PTPER_data=F_MAX_CYCLC_MIN;
IEC2bits.PWMIE=0;
PTPER=PTPER_data;
IEC2bits.PWMIE=1;
T3CONbits.TON=0;
PR3=PTPER<<3;//PR3=4*2*PTPER
T3CONbits.TON=1;
}
//计算相位偏移,对sin_v_n进行微调,实现同相
xiangwei=25*PTPER/2;
if(IC1BUF_result2-IC2BUF_result1>0)
{
phasic_data=IC1BUF_result2-IC2BUF_result1;
if(phasic_data<(xiangwei-23))
{
if(phasic_data>(xiangwei-325))
{if(sin_v_n<2)sin_v_n=398+sin_v_n;else sin_v_n=sin_v_n-2;}
else if(phasic_data>(xiangwei/2)){sin_v_n=sin_v_n-15;}
else if( phasic_data>325) {sin_v_n=sin_v_n+15;}
else if(phasic_data>23){if(sin_v_n>=398)sin_v_n=sin_v_n-398;
else sin_v_n=sin_v_n+2;}
}
}
IC_flag=1;
while(IC2CONbits.ICBNE)ICBUF_temp_result=IC2BUF;
}
IFS0bits.IC2IF=0;//
}
//输出正弦电压信号采样
void __attribute__((__interrupt__, no_auto_psv)) _IC1Interrupt(void)
{
if(IC_flag)
{
IC1BUF_result1=IC1BUF; //保存两次捕捉值
IC1BUF_result2=IC1BUF;
}
IFS0bits.IC1IF=0;
}
//ADC采样程序:
//对直流电源电压、输入电压、输出电流进行采样,实现MPPT模拟,进行欠压过流//保护
void __attribute__((interrupt, no_auto_psv)) _ADCInterrupt(void)
{
if(ad_select_flag)
{
if(protect_flag&&((AD_average2<U_MIN)||(AD_average1_2>I_MAX)))
/*判断是否电压过流*/
{
_PTEN=0;/*时基关闭,保护电路*/
IEC2bits.PWMIE=0;
IEC0bits.IC1IE=0;//捕捉中断禁止
IEC0bits.IC2IE=0;//捕捉中断禁止
ad_select_flag=0;
ad_n=0;
ad_n1=0;
ad_protect_time=0;
AD_sum0=0;
AD_sum1=0;
AD_sum1_2=0;
AD_sum2=0;
if(AD_average2<U_MIN) {PORTFbits.RF3=1;u_flag=1;}//欠压指示灯亮
if(AD_average1_2>I_MAX) PORTFbits.RF2=1;//过流指示灯亮
AD_average2=0;
AD_average1_2=I_MAX+10;
goto loop_ad;
}
AD_sum0=AD_sum0+ADCBUF0;
AD_sum1=AD_sum1+ADCBUF1;
AD_sum2=AD_sum2+ADCBUF2;
AD_sum3=AD_sum3+ADCBUF3;
PORTFbits.RF2=0;
ad_n++;
if(ad_n==100)
{
ad_n=0;
AD_sum0=AD_sum0>>2;
AD_average0=(uint)(AD_sum0)/25;AD_sum0=0;
if(!protect_flag) {if(AD_average0 >(PID_OUT_REF-10)) protect_flag=1;} AD_sum1=AD_sum1>>2;
AD_average1=(uint)(AD_sum1)/25;AD_sum1=0;
ad_n1++;
AD_sum1_2=AD_sum1_2+AD_average1;
if(ad_n1==20)
{ad_n1=0;
AD_sum1_2=AD_sum1_2>>2;
AD_average1_2=(uint)(AD_sum1_2)/5;
AD_sum1_2=0;
}
AD_sum2=AD_sum2>>2;
AD_average2=(uint)(AD_sum2)/25;AD_sum2=0;
AD_sum3=AD_sum3>>2;
AD_average3=(uint)(AD_sum3)/25;AD_sum3=0;
ad_flag=1;
}
}
else
{
if(ad_protect_time<5000)ad_protect_time++;
//欠压过流保护后延时一段时间(5s)才进行采样恢复
if(ad_protect_time==5000)
{
AD_sum0=AD_sum0+ADCBUF0;
AD_sum1=AD_sum1+ADCBUF1;
AD_sum2=AD_sum2+ADCBUF2;
ad_n++;
if(ad_n==100)
{
ad_n=0;
AD_sum0=AD_sum0>>2;
AD_average0=(uint)(AD_sum0)/25;AD_sum0=0;
AD_sum1=AD_sum1>>2;
AD_average1=(uint)(AD_sum1)/25;AD_sum1=0;
AD_sum2=AD_sum2>>2;
AD_average2=(uint)(AD_sum2)/25;AD_sum2=0;
ad_n1++;
AD_sum1_2=AD_sum1_2+AD_average1;
if(ad_n1==20)
{ad_n1=0;
AD_sum1_2=AD_sum1_2>>2;
AD_average1_2=(uint)(AD_sum1_2)/5;
AD_sum1_2=0;
}
ad_flag=1;
}
if((AD_average2>U_MIN)&&(AD_average1_2<I_MAX)) {
ad_select_flag=1;
protect_flag=1;
ad_n=0;
ad_n1=0;
AD_sum0=0;
AD_sum1=0;
AD_sum1_2=0;
AD_sum2=0;
AD_sum3=0;
while(IC2CONbits.ICBNE)ICBUF_temp_result=IC2BUF;
while(IC1CONbits.ICBNE) ICBUF_temp_result=IC1BUF;
IEC0bits.IC1IE=1;//中断使能
IEC0bits.IC2IE=1;//中断使能
_PTEN=1;/*时基开启,故障排除*/
IEC2bits.PWMIE=1;
PORTFbits.RF2=0;//过流指示灯暗
Nop()
PORTFbits.RF3=0;//欠压指示灯暗
SoftStart_flag=0;//保护恢复后、重新软启动
if(u_flag){m=3000;u_flag=0;} else {m=0;SoftStart_flag=0;}//重新软启动
goto loop_ad;
}
}
}
loop_ad:IFS0bits.ADIF = 0;
}
//MPPT控制算法PI调节子程序
void PI_adjust(void)
{
//PI_kp,PI_ki用Q8格式进行运算
AD_PID_JISUANG=(long)AD_average2*PID_OUT_REF/772;
AD_PID_OUT_REF=(uint)AD_PID_JISUANG;
PID_ek=AD_average0-AD_PID_OUT_REF;
PI_mk=(long)PI_kp*(PI_ek-PI_ek1)+(long)PI_ki*PI_ek;
PI_mk=PI_mk>>8;
PI_mk=PI_mk>>1;
PI_ek1=PI_ek;
PI_mk1=PI_mk1+(int)PI_mk;
if(PI_mk1>PI_m_max) PI_mk1=PI_m_max;
if(PI_mk1<PI_m_min) PI_mk1=PI_m_min;
IEC2bits.PWMIE=0;
m=PI_mk1;
IEC2bits.PWMIE=1;
}。