mppt 扰动算法 C语言实现代码
时间: 2023-12-06 14:45:40 浏览: 240
以下是一个简单的基于Perturb and Observe (P&O) 扰动算法的MPPT(最大功率点追踪)C语言实现代码:
```c
#include<reg51.h>
#define VREF 5.0 // 参考电压
#define K 0.02 // 扰动步长因子
sbit Pwm=P2^0; // PWM 输出引脚
sbit Incr=P1^0; // 增加电压扰动信号输入引脚
sbit Decr=P1^1; // 减少电压扰动信号输入引脚
float Vpv,Vpv_old,Ipv,Ppv,Vpv_ref,Pwm_duty;
void ADC_Init() // ADC初始化
{
ADCON=0x80; // A/D转换器开关打开
ADCON|=0x38; // 设定转换通道(AN0)
P1ASF=0x01; // 将P1_0设置为模拟输入
}
unsigned int Get_ADC() // 获取ADC值
{
unsigned int adc_value;
ADC_CONTR=0x8F; // 定时器1开始计数,转换电路打开,选择通道0
delay(2); // 延时等待转换完成
ADC_CONTR&=0xEF; // 关闭转换电路
adc_value=ADC_RES; // 获取ADC值
adc_value|=((unsigned int)ADC_RESL<<8);
return adc_value;
}
void PWM_Init() // PWM初始化
{
TMOD|=0x10; // 定时器1工作在模式1: 16位定时器模式
TH1=0x3C; // 设定定时器初值,产生PWM频率为50KHz
TL1=0x00;
Pwm=0; // PWM输出初始为低电平
TR1=1; // 启动定时器1
}
void delay(unsigned char i) // 延时函数
{
unsigned char j;
while(i--)
{
j=250;
while(j--);
}
}
void Perturb_Observe() // 扰动观察法
{
Vpv=(float)Get_ADC()*VREF/1024.0; // 获取PV电压值
Ipv=(float)Get_ADC()*VREF/1024.0; // 获取PV电流值
Ppv=Vpv*Ipv; // PV电压和电流的积即为PV功率值
if(Vpv>Vpv_old) // PV电压增加,需要减少电压扰动
{
Vpv_ref=Vpv-K; // 扰动电压减小
}
else if(Vpv<Vpv_old) // PV电压减小,需要增加电压扰动
{
Vpv_ref=Vpv+K; // 扰动电压增加
}
else // PV电压不变,维持当前扰动电压
{
Vpv_ref=Vpv;
}
if(Vpv_ref<0.0) // 扰动电压不能为负数
{
Vpv_ref=0.0;
}
if(Vpv_ref>VREF) // 扰动电压不能超过参考电压
{
Vpv_ref=VREF;
}
Pwm_duty=Ppv/Vpv_ref; // 计算PWM占空比
if(Pwm_duty>1.0) // PWM占空比不能超过1
{
Pwm_duty=1.0;
}
TH1=(65536-Pwm_duty*65535)/256; // 计算PWM高电平时间
TL1=(65536-Pwm_duty*65535)%256;
Vpv_old=Vpv; // 保存当前PV电压值
}
void main()
{
ADC_Init(); // 初始化ADC
PWM_Init(); // 初始化PWM
while(1)
{
Perturb_Observe(); // 扰动观察法追踪最大功率点
}
}
```
需要注意的是,以上代码仅为简单实现,实际应用中需要进行更多的参数调整和优化。