写一个完整的MPPT居于功率点追踪算法,用C语言写
时间: 2023-06-01 22:03:18 浏览: 131
由于MPPT算法的实现需要采集太阳能电池板的电压和电流,因此需要先设计一个采集器来采集这些数据。以下是一个简单的采集器代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
#define ADC_CS 1
#define ADC_CLK 0
#define ADC_DIO 2
int read_adc(unsigned char channel)
{
unsigned char data[3];
int adcvalue = 0, i;
data[0] = 0x06 | ((channel & 0x07) << 4);
data[1] = 0x00;
data[2] = 0x00;
digitalWrite(ADC_CS, 0);
for(i = 0; i < 3; i++)
{
for(j = 0; j < 8; j++)
{
if(data[i] & 0x80)
digitalWrite(ADC_DIO, 1);
else
digitalWrite(ADC_DIO, 0);
digitalWrite(ADC_CLK, 1);
digitalWrite(ADC_CLK, 0);
data[i] <<= 1;
}
}
for(i = 0; i < 10; i++)
{
digitalWrite(ADC_CLK, 1);
digitalWrite(ADC_CLK, 0);
}
for(i = 0; i < 10; i++)
{
digitalWrite(ADC_CLK, 1);
adcvalue <<= 1;
if(digitalRead(ADC_DIO))
adcvalue |= 0x01;
digitalWrite(ADC_CLK, 0);
}
digitalWrite(ADC_CS, 1);
return adcvalue;
}
int main()
{
wiringPiSetup();
pinMode(ADC_CS, OUTPUT);
pinMode(ADC_CLK, OUTPUT);
pinMode(ADC_DIO, OUTPUT);
while(1)
{
int voltage = read_adc(0);
int current = read_adc(1);
printf("voltage: %d, current: %d\n", voltage, current);
delay(1000);
}
return 0;
}
```
该采集器使用了树莓派的GPIO口来控制ADC0809芯片进行数据采集,并通过串口输出电压和电流数据。
接着,我们来实现MPPT算法。该算法的实现方法有很多种,以下是一种基于P&O算法的实现方法:
```c
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
#define ADC_CS 1
#define ADC_CLK 0
#define ADC_DIO 2
#define MAX_VOLTAGE 20.0
#define MAX_CURRENT 5.0
#define DELTA_V 0.1
#define DELTA_P 0.05
int read_adc(unsigned char channel)
{
// 采集器代码
}
int main()
{
wiringPiSetup();
pinMode(ADC_CS, OUTPUT);
pinMode(ADC_CLK, OUTPUT);
pinMode(ADC_DIO, OUTPUT);
float voltage, current, power, power_old, delta_v, delta_p;
float voltage_max = 0, current_max = 0, power_max = 0;
while(1)
{
voltage = read_adc(0) * MAX_VOLTAGE / 1023.0;
current = read_adc(1) * MAX_CURRENT / 1023.0;
power = voltage * current;
delta_v = voltage - voltage_max;
delta_p = power - power_max;
if(delta_v > DELTA_V || delta_p > DELTA_P)
{
if(power > power_max)
{
power_max = power;
voltage_max = voltage;
current_max = current;
}
else if(delta_v < DELTA_V)
{
voltage_max = voltage;
current_max = current;
}
}
else if(delta_v < -DELTA_V)
{
voltage_max = voltage;
current_max = current;
}
printf("voltage: %.2f, current: %.2f, power: %.2f\n", voltage, current, power_max);
delay(1000);
}
return 0;
}
```
该算法会不断地采集电压和电流数据,并计算出当前的功率值。如果当前的功率值大于历史最大功率值,那么就更新最大功率值及其对应的电压和电流值;如果当前的电压值与历史最大电压值的差值大于设定的阈值,那么也会更新最大功率值及其对应的电压和电流值;如果当前的电压值与历史最大电压值的差值小于设定的阈值,则不做任何操作。如果当前的电压值与历史最大电压值的差值小于设定的阈值的相反数,则直接更新最大功率值及其对应的电压和电流值。
该算法实现简单,但是需要根据具体的太阳能电池板和光照条件调整阈值的大小,以达到最佳的功率点追踪效果。
阅读全文