控制电路

设计创造价值、技术造就未来

当前位置:首页>应用技术>控制电路

基于PMS150G这个电路设计的MPPT升压太阳能充电控制器

发布时间:2024-11-09
浏览次数:177
文章类型:初出版,修改版
技术成熟:绿色
技术价值:¥
详细技术内容

MUC(微控制器)程序将执行一个主要用于实现最大功率点追踪(MPPT)功能的控制算法,调节输出功率以适应输入电压的波动。下面是程序实现的基本思路和提示:
1. 初始化阶段
  定义引脚:设置输入输出引脚,用于电压、电流的采集以及控制MOSFET的PWM输出(如PMW-H和PMW-L)。
  初始化ADC:配置ADC模块,采集输入电压、电流及其他关键参数。
  初始化PWM:设置PWM频率和初始占空比,确保电路能够启动。

2. 数据采集和信号处理
  采样输入电压和电流:定期通过ADC读取输入电压(V-IN)和输入电流(I-IN),记录用于计算输入功率。
  电压、电流滤波:若输入信号有噪声,执行低通滤波器算法,平滑采样值。

3. MPPT算法
  使用MPPT算法(例如扰动观察法或增量导数法)调整PWM占空比,确保系统在最大功率点运行。
  算法步骤:
    计算当前功率:功率 = 电压 × 电流。
    比较前后两次的功率变化和电压变化,决定下一步的PWM调节方向。
    如果功率增加,保持当前调整方向;如果功率减少,反转调整方向。

4. PWM控制
  调整PWM信号:根据MPPT算法的结果,增加或减小PWM的占空比,以调节MOSFET的开关周期,从而控制输出电压和电流。
  频率和占空比限制:为了保护电路,设置PWM频率和占空比的上限和下限,避免过高或过低的功率输出。

5. 保护和故障处理
  输入电压/电流监控:实时检测输入电压和电流是否超出安全范围,若超出则停止PWM输出以保护电路。
  温度监控(若有):可以增加温度传感器,监控MOSFET的温度,防止过热。
  故障处理:当检测到过压、过流或其他故障时,停止输出并触发告警。

6. 输出数据与状态
  数据输出:通过串口或LED等显示当前状态,如输出功率、电流和电压等。
  状态指示:可以利用LED显示不同状态,如正常运行、待机或故障等。

简化的程序流程图

1. 初始化系统
2. 开始采样输入电压和电流
3. 执行MPPT算法
4. 调整PWM信号
5. 检测电压、电流是否在安全范围内
6. 更新状态显示
7. 返回步骤2,循环执行

这种程序结构可以确保系统实时调节,使输入功率保持在最大功率点,实现高效的能量转换。下面是更新电路图后的描述:

S150G.PNG更新电路图中已经添加了温度保护电路,并对MUC(微控制器)引脚进行了更清晰的定义。以下是对新的电路设计的分析和各部分描述。

1. 温度保护电路
  温度保护电路:通过热敏电阻或RT-Q1元件检测温度。Rt-Q1连接到一个电阻网络(如Rto=72K-36K),可以根据温度变化调节电阻值。
  保护触发:当温度超过设定阈值时,MUC将会检测到电压变化(由温度电阻网络分压而成),并根据此信号触发保护措施,比如关闭PWM信号输出来停止功率传输,从而保护电路免受高温损害。

2. 主要组件和控制
  IC1(IR2181):依然作为高低侧驱动器,用于驱动MOSFET(Q1、Q2),控制电流流向,以实现DC-DC转换。
  MOSFET (Q1, Q2 - HY3215):主要的开关管,用于MPPT算法中的调节,结合PWM信号来控制能量传输。
  电感L1(82uH):负责滤波和储能,处理输入电流的平滑。

3. MUC引脚功能
  PA0, PA3, PA4, PA5:这些引脚用于连接到外部的测量和控制信号,例如输入电压(V-IN)和输入电流(I-IN)采样。
  PWM控制引脚**(PMW-H和PMW-L):通过设置PWM信号调节MOSFET的占空比,以实现最大功率点跟踪。
  温度检测引脚(Rt-Q1接入的引脚):该引脚用于采集温度信号,判断是否需要启用温度保护。

4. 输入和输出
  输入范围:MPPT输入电压范围为20V-80V,输出电压在17V-64V之间,说明电路具有较广的适应范围,可以处理不同输入的变化。
  电压、电流监控:电流通过低阻值电阻R1(12mR)测量,而电压则通过电阻分压(如R3和WR1)来获得,微控制器通过这些信号进行MPPT算法控制。

5. 保护与状态指示
  温度保护:通过Rt-Q1网络和MUC采集到的温度信号,控制输出的开关,防止温度过高时继续运行。
  LED指示灯(D2):可能用于状态指示,比如在温度保护启动或电路故障时,显示不同的状态。

工作流程总结
1. 初始化阶段:定义引脚,初始化ADC和PWM。
2. 数据采集:定期采集电压、电流和温度。
3. MPPT控制:使用采集的数据执行MPPT算法,调节PWM占空比。
4. 温度监控:若温度超过设定值,触发保护措施,停止PWM输出。
5. 状态显示:通过LED或其他方式显示电路状态。

新的设计不仅可以实现最大功率点追踪,还能提供温度保护,大大增强了系统的安全性和稳定性。
根据您提供的单片机(MUC)脚位定义和工作步骤,我整理了一个控制流程,以帮助您进一步理解和优化程序:

1. 初始化过程
上电复位:复位后,初始化A5测量值,其他脚保持静止状态,确保系统稳定后再进行操作。

2. 太阳能电压监测
低电压检测:如果PA7 < A5a,设置PA5 = D9c(即LED慢闪烁3秒),表示太阳能板电压过低。
高电压检测:如果PA7 > A5c * 3S,设置PA5 = D9a(即LED快闪烁0.5秒),表示太阳能板电压过高。
 
3. MPPT参考值记录
电压区间判断:根据PA7的值确定当前最大功率点参考(MPPT)电压。根据不同的电压区间,设置相应的MPPT基准值:
 - 如果PA7 > A5a < A5a * S,则MPPT = A5a。
 - 如果PA7 > A5b < A5b * 2S,则MPPT = A5b。
 - 如果PA7 > A5c < A5c * 3S,则MPPT = A5c。

4. PWM控制
启用PWM输出:启用PA3和PA4的PWM信号,并根据以下条件调整PWM:
 降低PWM占空比:若PA7 < MPPT或PA0 > PA0 + X,减少PWM占空比,降低输出功率。
 电流保护:若PA6 = PA6或PA6 > PA6 + X,说明电流达到或超过设定值,关闭PWM以防止过流。
 循环功率比较:若PA7 = MPPT且PA0、PA6在允许范围内,则进入频率比较循环,调节频率以优化输出功率。

5. 充电完成或空载指示
充电完成或无负载状态:当PA0达到设定值时,设置PA5 = D9b(即LED长亮),指示充电完成或无负载。

频率与占空比的设置
PWM信号相反:PA3和PA4输出相反的PWM信号,形成半桥驱动的互补开关。
占空比调节范围:最小为1%,最大为95%(180度),以1%步进调整。
频率调节范围:工作频率在60KHz至80KHz之间,步进为100Hz。

这样设计的控制逻辑可以使系统在MPPT条件下,安全地监测太阳能板电压、输出电流及温度等参数,实现自动调节PWM输出,保护电路并最大化功率传输。您可以基于此流程编写代码,并根据实际需求进行进一步优化。


根据我的设计要求和参数设置,为您提供了一个基本的伪代码示例,帮助您编写单片机程序。这个代码包含初始化、数据采集、MPPT算法以及保护功能,满足您提供的功能需求。

// 定义变量
float Vsolar, Vout, Iout, Temp; // 分别为太阳能板电压、输出电压、输出电流和温度
float MPPT = 0;                 // 最大功率点追踪基准电压
int PWM_duty = 50;              // 初始PWM占空比为50%
int PWM_frequency = 60000;      // 初始PWM频率为60kHz
bool charging_complete = false; // 充电状态指示

// 校准常数
const float A5a = 0.513, A5b = 1.0283, A5c = 1.541;
const float S = 0.087;
const float PA0_cal = 1.199, X = 0.002;
const float PA6_cal = 0.122;

// LED指示模式
enum LED_Mode { D9a, D9b, D9c };
LED_Mode LED_status = D9c;  // 初始为慢闪烁

// 初始化函数
void setup() {
   init_ADC();          // 初始化ADC,用于电压和电流采样
   init_PWM(PWM_duty, PWM_frequency);  // 初始化PWM信号,设置频率和占空比
   set_LED_mode(D9c);   // 默认LED慢闪烁,表示未启动
}

// 主程序循环
void loop() {
   // 读取电压和电流分压值
   Vsolar = read_ADC(PA7); // 读取太阳能板电压
   Vout = read_ADC(PA0);   // 读取输出电压
   Iout = read_ADC(PA6);   // 读取输出电流(含温度信号)

   // 检测太阳能板电压状态
   if (Vsolar < A5a) {
       set_LED_mode(D9c);  // LED慢闪烁,表示太阳能板电压过低
   } else if (Vsolar > A5c * 3 * S) {
       set_LED_mode(D9a);  // LED快闪烁,表示太阳能板电压过高
   } else {
       // 记录MPPT比较值
       if (Vsolar > A5a && Vsolar < A5a * S) MPPT = A5a;
       else if (Vsolar > A5b && Vsolar < A5b * 2 * S) MPPT = A5b;
       else if (Vsolar > A5c && Vsolar < A5c * 3 * S) MPPT = A5c;

       // 开启PWM并执行MPPT控制逻辑
       start_PWM();

       // 调节PWM占空比
       if (Vsolar < MPPT || Vout > PA0_cal + X || Iout > PA6_cal) {
           PWM_duty = max(PWM_duty - 1, 1);  // 减少占空比
           set_PWM_duty(PWM_duty);
       } else if (Iout > PA6_cal + X) {
           stop_PWM();           // 关闭PWM,保护电路
       }

       // 检查充电完成或空载
       if (Vout == PA0_cal) {
           charging_complete = true;
           set_LED_mode(D9b);    // LED长亮,表示充电完成或空载
       } else {
           charging_complete = false;
       }
   }

   // 更新PWM频率和占空比
   adjust_PWM_frequency();

   delay(10); // 延迟10ms,避免过快采样
}

// ADC读取函数
float read_ADC(int pin) {
   // 此处为模拟读取ADC值的函数
   return analogRead(pin);
}

// PWM初始化和控制函数
void init_PWM(int duty, int frequency) {
   // 初始化PWM设置
   // 例如:设置PWM频率和占空比
}

void set_PWM_duty(int duty) {
   // 设置PWM占空比
}

void adjust_PWM_frequency() {
   if (PWM_frequency < 80000) PWM_frequency += 100; // 增加频率
   else PWM_frequency = 60000; // 频率超过80kHz后重置为60kHz
}

// LED控制函数
void set_LED_mode(LED_Mode mode) {
   switch(mode) {
       case D9a:
           // 快闪烁实现
           break;
       case D9b:
           // 长亮实现
           break;
       case D9c:
           // 慢闪烁实现
           break;
   }
}

重新优化程序

1. 增加了采样时间控制:
  - 定义 SAMPLE_TIME 为10ms
  - 使用 g_last_sample_time 记录上次采样时间
  - 在 mppt_control() 函数中增加时间检查

2. 优化了ADC采样:
  - 增加了简单的均值滤波
  - 每个通道采样4次取平均值
  - 采样间隔1ms,减少干扰

3. 优化了LED控制:
  - 使用时间戳控制LED闪烁
  - 避免使用delay影响主循环

4. 移除了主循环中的delay:
  - 通过采样时间控制来实现周期性执行
  - 提高了系统响应性

这些修改可以使系统:
1. 更稳定的采样周期
2. 更准确的电压电流读数
3. 更流畅的LED指示效果
4. 更好的实时响应能力

下面是一个完整的程序直接烧入单片机进行测试:

<antArtifact identifier="mppt-controller" type="application/vnd.ant.code" language="c" title="MPPT Solar Charge Controller with 10ms Sampling">
// 常量定义
#define PWM_MIN         10    // 1% PWM
#define PWM_MAX         950   // 95% PWM
#define PWM_STEP        10    // 1% step
#define FREQ_MIN        60000 // 60KHz
#define FREQ_MAX        80000 // 80KHz
#define FREQ_STEP       100   // 100Hz step
#define SAMPLE_TIME     10    // 10ms采样时间

// 电压阈值常量
#define A5a             0.513
#define A5b             1.0283
#define A5c             1.541
#define S               0.087
#define VOUT_TARGET     1.199
#define IOUT_TARGET     0.122
#define X               0.002

// LED闪烁模式
#define LED_FAST        500   // 0.5s
#define LED_SLOW        3000  // 3s

// 引脚定义
#define PIN_SOLAR_V     PA7   // 太阳能板电压检测
#define PIN_CURRENT     PA6   // 输出电流检测
#define PIN_OUT_V       PA0   // 输出电压检测
#define PIN_PWM_L       PA3   // PWM低端输出
#define PIN_PWM_H       PA4   // PWM高端输出
#define PIN_LED         PA5   // LED指示

// 全局变量
uint16_t g_pwm_duty = PWM_MIN;
uint32_t g_freq = FREQ_MIN;
float g_mppt_target = 0;
uint32_t g_last_sample_time = 0;

// LED控制函数
void led_control(uint8_t mode) {
    static uint32_t led_last_time = 0;
    uint32_t current_time = millis();
    
    switch(mode) {
        case 1: // 快闪 0.5s
            if((current_time - led_last_time) >= LED_FAST) {
                digitalWrite(PIN_LED, !digitalRead(PIN_LED));
                led_last_time = current_time;
            }
            break;
        case 2: // 常亮
            digitalWrite(PIN_LED, LOW);
            break;
        case 3: // 慢闪 3s
            if((current_time - led_last_time) >= LED_SLOW) {
                digitalWrite(PIN_LED, !digitalRead(PIN_LED));
                led_last_time = current_time;
            }
            break;
    }
}

// 读取ADC值并转换为电压,加入滤波
float read_voltage(uint8_t pin) {
    const uint8_t SAMPLE_COUNT = 4;  // 采样4次取平均值
    float sum = 0;
    
    for(uint8_t i = 0; i < SAMPLE_COUNT; i++) {
        sum += analogRead(pin);
        delay(1);  // 采样间隔1ms
    }
    
    return (sum / SAMPLE_COUNT) * (3.3 / 1024.0);  // 假设ADC参考电压为3.3V,分辨率为10位
}

// 设置PWM
void set_pwm(uint16_t duty, uint32_t freq) {
    // 设置PWM频率和占空比
    setPWMFreq(freq);
    analogWrite(PIN_PWM_L, duty);
    analogWrite(PIN_PWM_H, 1000 - duty); // 反相PWM
}

// 更新MPPT目标值
void update_mppt_target(float solar_v) {
    if(solar_v > A5a && solar_v < (A5a * S)) {
        g_mppt_target = A5a;
    } else if(solar_v > A5b && solar_v < (A5b * 2 * S)) {
        g_mppt_target = A5b;
    } else if(solar_v > A5c && solar_v < (A5c * 3 * S)) {
        g_mppt_target = A5c;
    }
}

// MPPT控制逻辑
void mppt_control() {
    uint32_t current_time = millis();
    
    // 检查是否到达采样时间
    if((current_time - g_last_sample_time) < SAMPLE_TIME) {
        return;  // 未到采样时间,退出
    }
    g_last_sample_time = current_time;  // 更新上次采样时间
    
    float solar_v = read_voltage(PIN_SOLAR_V);
    float out_v = read_voltage(PIN_OUT_V);
    float out_i = read_voltage(PIN_CURRENT);
    
    // 电压检查和LED指示
    if(solar_v < A5a) {
        led_control(3); // 慢闪 - 电压过低
        set_pwm(0, g_freq); // 关闭PWM
        return;
    } else if(solar_v > (A5c * 3 * S)) {
        led_control(1); // 快闪 - 电压过高
        set_pwm(0, g_freq); // 关闭PWM
        return;
    }
    
    // 更新MPPT目标值
    update_mppt_target(solar_v);
    
    // PWM控制逻辑
    if(solar_v < g_mppt_target) {
        if(g_pwm_duty > PWM_MIN) {
            g_pwm_duty -= PWM_STEP;
        }
    } else if(out_v > (VOUT_TARGET + X)) {
        if(g_pwm_duty > PWM_MIN) {
            g_pwm_duty -= PWM_STEP;
        }
    } else if(out_i > (IOUT_TARGET + X)) {
        set_pwm(0, g_freq); // 关闭PWM
        return;
    } else if(solar_v >= g_mppt_target && 
             out_v <= VOUT_TARGET && 
             out_i <= IOUT_TARGET) {
        // 优化输出功率
        optimize_power();
    }
    
    // 检查充电完成状态
    if(abs(out_v - VOUT_TARGET) < X) {
        led_control(2); // 常亮 - 充电完成
    }
    
    // 更新PWM输出
    set_pwm(g_pwm_duty, g_freq);
}

// 输出功率优化
void optimize_power() {
    static float last_power = 0;
    float out_v = read_voltage(PIN_OUT_V);
    float out_i = read_voltage(PIN_CURRENT);
    float current_power = out_v * out_i;
    
    // 通过调整频率寻找最大功率点
    if(current_power > last_power) {
        if(g_freq < FREQ_MAX) {
            g_freq += FREQ_STEP;
        }
    } else {
        if(g_freq > FREQ_MIN) {
            g_freq -= FREQ_STEP;
        }
    }
    
    last_power = current_power;
}

// 主程序初始化
void setup() {
    // 配置引脚模式
    pinMode(PIN_SOLAR_V, INPUT);
    pinMode(PIN_CURRENT, INPUT);
    pinMode(PIN_OUT_V, INPUT);
    pinMode(PIN_PWM_L, OUTPUT);
    pinMode(PIN_PWM_H, OUTPUT);
    pinMode(PIN_LED, OUTPUT);
    
    // 初始化PWM
    g_pwm_duty = PWM_MIN;
    g_freq = FREQ_MIN;
    set_pwm(0, g_freq); // 初始状态PWM关闭
    
    g_last_sample_time = millis(); // 初始化采样时间
}

// 主循环
void loop() {
    mppt_control();
}
</antArtifact>

注意:文章内容随时随地会进行修改,特别是程序优化后会重新发布

上一篇:采用PMW方式的MPPT太阳能板升压充电电路CN3306

下一篇:推荐一个20V-200V在各种控制电路和应用电路中使用的5伏和9伏至15伏的小电源

发表评论:

评论记录:

未查询到任何数据!
返回顶部