基于tlc2543数字量输入的51单片机光伏MPPT的C语言代码
时间: 2024-05-10 21:16:17 浏览: 110
C51环境下TLC2543的软件设计
以下是基于TLC2543数字量输入的51单片机光伏MPPT的C语言代码的示例:
```c
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
// 定义ADC转换时钟频率
#define ADC_CLOCK 4000000
// 定义ADC采样数
#define ADC_SAMPLES 256
// 定义PWM输出频率
#define PWM_FREQUENCY 50000
// 定义最小PWM输出占空比
#define PWM_MIN_DUTY 10
// 定义最大PWM输出占空比
#define PWM_MAX_DUTY 90
// 定义MPPT控制周期
#define MPPT_PERIOD 100
// 定义光伏电池开路电压
#define V_OC 21.0
// 定义光伏电池最大功率电压
#define V_MPP 17.0
// 定义光伏电池最大功率电流
#define I_MPP 3.2
// 定义ADC采样数组
uint adc_samples[ADC_SAMPLES];
// 定义当前ADC采样值
uint adc_value;
// 定义当前PWM输出占空比
uchar pwm_duty;
// 定义当前MPPT控制计数器
uchar mppt_count;
// 定义当前MPPT控制状态
uchar mppt_state;
// 定义当前MPPT控制电流步长
float mppt_step;
// 定义当前MPPT控制电压目标值
float mppt_target;
// 定义当前MPPT控制电压实际值
float mppt_voltage;
// 定义ADC转换函数
void adc_convert()
{
uchar i;
// 启动ADC转换
ADC_CONTR = 0x80;
// 等待ADC转换完成
while (ADC_CONTR & 0x80);
// 读取ADC采样值
adc_value = 0;
for (i = 0; i < 16; i++)
{
adc_value <<= 1;
if (ADC_RES & 0x80)
adc_value |= 1;
_nop_();
ADC_RES <<= 1;
}
}
// 定义PWM输出函数
void pwm_output()
{
uchar i;
// 设置PWM输出占空比
for (i = 0; i < pwm_duty; i++)
P2 |= 0x01;
for (i = pwm_duty; i < 100; i++)
P2 &= ~0x01;
}
// 定义MPPT控制函数
void mppt_control()
{
float voltage, current, power;
// 计算当前光伏电池电压
voltage = (float)adc_value / 1023.0 * 5.0 * (V_OC / V_MPP);
// 计算当前光伏电池电流
current = (float)(V_OC - voltage) / 100.0;
// 计算当前光伏电池输出功率
power = voltage * current;
// 根据当前MPPT控制状态进行处理
switch (mppt_state)
{
case 0: // 初始化MPPT控制参数
mppt_count = 0;
mppt_state = 1;
mppt_step = I_MPP / 10.0;
mppt_target = V_OC / 2.0;
mppt_voltage = 0.0;
break;
case 1: // 以步长逐渐增加MPPT控制电压
mppt_voltage += mppt_step;
if (mppt_voltage >= V_OC)
{
mppt_voltage = V_OC;
mppt_state = 2;
}
break;
case 2: // 以步长逐渐减小MPPT控制电压
mppt_voltage -= mppt_step;
if (mppt_voltage <= V_MPP)
{
mppt_voltage = V_MPP;
mppt_state = 3;
}
break;
case 3: // 以步长逐渐增加MPPT控制电压
mppt_voltage += mppt_step;
if (mppt_voltage >= V_OC)
{
mppt_voltage = V_OC;
mppt_state = 4;
}
break;
case 4: // 以步长逐渐减小MPPT控制电压
mppt_voltage -= mppt_step;
if (mppt_voltage <= V_MPP)
{
mppt_voltage = V_MPP;
mppt_state = 1;
}
break;
}
// 根据当前光伏电池输出功率与MPPT控制电压进行比较
if (power > mppt_target)
{
mppt_count = 0;
mppt_target = power;
mppt_step /= 2.0;
if (mppt_step < 0.001)
mppt_step = 0.001;
}
else
{
mppt_count++;
if (mppt_count >= MPPT_PERIOD)
{
mppt_count = 0;
mppt_target = power;
mppt_step *= 2.0;
if (mppt_step > 1.0)
mppt_step = 1.0;
}
}
// 计算当前PWM输出占空比
pwm_duty = (uchar)(PWM_MIN_DUTY + (PWM_MAX_DUTY - PWM_MIN_DUTY) * (mppt_voltage / V_OC));
// 输出PWM信号
pwm_output();
}
// 主函数
void main()
{
uchar i;
// 初始化ADC转换参数
ADC_CONTR = 0x83;
ADC_RES = 0;
ADC_RESL = 0;
// 初始化PWM输出参数
TH0 = TL0 = (65536 - (FREQ_SYS / 12 / PWM_FREQUENCY)) / 2;
TMOD = 0x01;
ET0 = 1;
EA = 1;
TR0 = 1;
// 初始化MPPT控制参数
mppt_state = 0;
// 进入主循环
while (1)
{
// 进行ADC采样
for (i = 0; i < ADC_SAMPLES; i++)
{
adc_convert();
adc_samples[i] = adc_value;
_nop_();
}
// 计算ADC采样值平均值
adc_value = 0;
for (i = 0; i < ADC_SAMPLES; i++)
adc_value += adc_samples[i];
adc_value /= ADC_SAMPLES;
// 进行MPPT控制
mppt_control();
}
}
// 定义定时器0中断函数
void timer0_isr() interrupt 1
{
// 输出PWM信号
pwm_output();
}
```
这是一个基本的光伏MPPT控制程序,主要使用了TLC2543数字量输入进行ADC采样,通过PWM输出控制直流电动机的转速,从而实现光伏电池的最大功率点跟踪。需要注意的是,该程序只是一个示例,实际应用中还需要根据具体要求进行修改和优化。
阅读全文