一、系统总体架构小型离线风光互补发电系统是一种独立运行的微电网系统它将风能和太阳能这两种清洁能源结合起来弥补单一能源受天气影响大的缺点为偏远地区、家庭、基站或户外设备提供稳定可靠的电力。STM32凭借其强大的运算能力和丰富的外设ADC、高级定时器、DMA是此类系统最理想的核心控制器。1.1 系统能量拓扑结构┌─────────────────────────────┐ │ 能量流向与管理系统 │ ┌─────────┐ ┌───┐ ┌─────────┐ ┌───┐ ┌─────────┐ │ 风力发电 │ │整流│ │ │ │逆变│ │ 交流负载 │ │ 机组 ├─┤桥堆├──┤ STM32 ├──┤器 │ │ (照明/电器)│ └─────────┘ └───┘ │ 智能 │ └───┘ └─────────┘ │ 控制器 │ │ │ (F407/ │ │ ┌─────────┐ ┌───┐ │ F334) │ ┌───┐ ┌─────────┐ │ 太阳能 │ │MPPT│ │ ├───┤DC/DC│ │ 直流负载 │ │ 光伏板 ├──┤升降压│────┤ ├───┤变换│ │ (LED/监控)│ └─────────┘ └───┘ │ │ └───┘ └─────────┘ │ │ └────┬────┘ │ ┌────▼────┐ │ 储能系统 │ │ (铅酸/ │ │ 磷酸铁锂) │ └─────────┘1.2 核心运行逻辑发电端风机发出不稳定的交流电经整流桥变为直流电光伏板发出直流电。两者汇合接入STM32控制的MPPT最大功率点跟踪升压电路。储能端电能经过MPPT后送入蓄电池组。STM32实时监测电池电压/电流执行智能充电管理防过充。用电端当负载需要时蓄电池的直流电经过STM32控制的逆变电路SPWM调制转变为纯净的正弦交流电或者直接供给直流负载。二、硬件核心设计2.1 关键元器件选型表模块分类推荐型号/参数数量功能说明主控芯片STM32F334 / STM32F4071拥有高速ADC、高级定时器适合做逆变SPWM和运算放大器风力发电机300W / 12V 永磁同步风机1离网型通常自带尾翼光伏板100W / 18V 单晶硅1-2块需根据当地平均日照配置整流桥KBPC3510 (35A/1000V)1将风机三相/单相交流电整流为直流电功率电感铁硅铝磁环电感 220uH / 20A1MPPT升压电路核心储能元件功率MOS管IRF3205 (55V/110A)4-6个分别用于MPPT升压和全桥逆变蓄电池12V 100Ah 铅酸 / 磷酸铁锂1组系统的能量缓冲池采样电阻康铜丝/锰铜丝 5mΩ / 10A2个串联在母线中用于STM32进行电流采样2.2 功率电路拓扑MPPT升压电路采用同步Buck-Boost拓扑或Boost拓扑。STM32通过调整PWM占空比调节光伏板和风机输出阻抗使其始终工作在最大功率点。全桥逆变电路采用H桥拓扑4个MOS管组成。STM32的高级定时器TIM1/TIM8输出互补的SPWM波形经过驱动芯片如IR2110放大后驱动MOS管。采样电路利用运放如LM358/INA240将几十安培的电流转化为0-3.3V的电压信号送入STM32的ADC引脚。三、软件控制系统设计基于标准库3.1 系统数据结构定义/* 风光互补发电系统数据结构 */#includestm32f10x.h#includestm32f10x_adc.h#includestm32f10x_tim.h#includestm32f10x_gpio.h#includestm32f10x_rcc.h#includemisc.h#includestdio.h#includemath.h// 系统运行状态typedefenum{SYS_INIT0,// 系统初始化SYS_CHARGING1,// 正常充电中SYS_FULL2,// 电池充满SYS_DISCHARGING3,// 电池放电SYS_FAULT4,// 系统故障过压/过流/短路SYS_STANDBY5// 待机模式夜间/无风无光}SystemState;// 能量数据类型typedefstruct{floatpv_voltage;// 光伏板电压 (V)floatpv_current;// 光伏板电流 (A)floatpv_power;// 光伏板功率 (W)floatwind_voltage;// 风机整流后电压 (V)floatwind_current;// 风机电流 (A)floatwind_power;// 风机功率 (W)floatbattery_voltage;// 蓄电池电压 (V)floatbattery_current;// 电池充放电电流 (A) 正为充负为放floatbattery_soc;// 电池剩余电量 (SOC, 0-100%)floatambient_temp;// 环境温度 (°C)}EnergyData;// 控制参数typedefstruct{floatmppt_target_voltage;// MPPT目标电压floatcharge_current_limit;// 充电限流 (A)uint16_tinverter_duty;// 逆变器PWM占空比uint8_tac_output_enable;// 交流输出使能}ControlParam;// 全局变量EnergyData energy_data;ControlParam ctrl_param;SystemState sys_stateSYS_INIT;volatileuint32_tsystem_tick0;3.2 数据采集系统ADC/* ADC数据采集与滤波 */// 定义ADC通道对应的电压电流// PA0 - 光伏电压, PA1 - 光伏电流, PA2 - 风电电压// PA3 - 风电电流, PA4 - 电池电压, PA5 - 电池电流#defineADC_VOLTAGE_REF3.3f// ADC参考电压#defineADC_RESOLUTION4096.0f// 12位ADC精度#defineVOLT_DIV_RATIO11.0f// 电压分压比 (100k 10k)#defineCURR_SENSE_RES0.005f// 采样电阻阻值 (5毫欧)#defineCURR_AMP_GAIN20.0f// 电流放大倍数/* 滑动平均滤波 */floatmoving_average_filter(floatnew_value,float*buffer,uint8_tsize){staticuint8_tindex0;staticfloatsum0;sum-buffer[index];// 减去旧值buffer[index]new_value;// 放入新值sumnew_value;// 加上新值index(index1)%size;returnsum/size;}/* 读取并更新能量数据 */voidupdate_energy_data(void){uint16_tadc_raw[6];floatadc_voltages[6];// 读取ADC原始数据假设已通过DMA或轮询获取// adc_raw[0] - PV Voltage, adc_raw[1] - PV Current, etc.// 转换为实际物理电压for(uint8_ti0;i6;i){adc_voltages[i](adc_raw[i]/ADC_RESOLUTION)*ADC_VOLTAGE_REF;}// 还原真实物理量energy_data.pv_voltageadc_voltages[0]*VOLT_DIV_RATIO;energy_data.pv_current(adc_voltages[1]/CURR_AMP_GAIN)/CURR_SENSE_RES;energy_data.pv_powerenergy_data.pv_voltage*energy_data.pv_current;energy_data.wind_voltageadc_voltages[2]*VOLT_DIV_RATIO;energy_data.wind_current(adc_voltages[3]/CURR_AMP_GAIN)/CURR_SENSE_RES;energy_data.wind_powerenergy_data.wind_voltage*energy_data.wind_current;energy_data.battery_voltageadc_voltages[4]*VOLT_DIV_RATIO;energy_data.battery_current(adc_voltages[5]/CURR_AMP_GAIN)/CURR_SENSE_RES;// 防止数据异常跳动if(energy_data.pv_current0)energy_data.pv_current0;if(energy_data.wind_current0)energy_data.wind_current0;}3.3 MPPT控制算法扰动观察法/* MPPT最大功率点跟踪 */typedefstruct{floatprev_power;// 上一时刻的功率floatprev_voltage;// 上一时刻的电压uint8_tperturb_dir;// 扰动方向0减小占空比1增大占空比uint16_tmppt_duty;// 当前MPPT占空比}MPPT_State;MPPT_State mppt_solar;// 光伏MPPT状态机MPPT_State mppt_wind;// 风机MPPT状态机/* 扰动观察法核心逻辑 */uint16_tMPPT_Perturb_Observe(MPPT_State*mppt,floatcurr_power,floatcurr_voltage){floatdelta_powercurr_power-mppt-prev_power;floatdelta_voltagecurr_voltage-mppt-prev_voltage;// 1. 判断功率变化方向if(delta_power0){// 功率增加继续沿原方向扰动if(mppt-perturb_dir0){mppt-mppt_duty-5;// 减小占空比 - 升高母线电压}else{mppt-mppt_duty5;// 增大占空比 - 降低母线电压}}else{// 功率减小反转扰动方向if(mppt-perturb_dir0){mppt-mppt_duty5;mppt-perturb_dir1;}else{mppt-mppt_duty-5;mppt-perturb_dir0;}}// 限制占空比范围 (例如 10% ~ 90%)if(mppt-mppt_duty100)mppt-mppt_duty100;if(mppt-mppt_duty900)mppt-mppt_duty900;// 更新历史数据mppt-prev_powercurr_power;mppt-prev_voltagecurr_voltage;returnmppt-mppt_duty;}/* MPPT控制任务 */voidmppt_control_task(void){// 只有当光照和风力达到一定阈值时才启动MPPTif(energy_data.pv_voltage15.0f){// 光伏有光照uint16_tsolar_dutyMPPT_Perturb_Observe(mppt_solar,energy_data.pv_power,energy_data.pv_voltage);// 将新的占空比写入PWM寄存器TIM_SetCompare1(TIM1,solar_duty);}if(energy_data.wind_voltage12.0f){// 风机在转动uint16_twind_dutyMPPT_Perturb_Observe(mppt_wind,energy_data.wind_power,energy_data.wind_voltage);// 将新的占空比写入PWM寄存器TIM_SetCompare2(TIM1,wind_duty);}}3.4 蓄电池智能充电策略三段式/* 蓄电池充放电管理 */typedefenum{CHARGE_STAGE_CC0,// 恒流充电阶段CHARGE_STAGE_CV1,// 恒压充电阶段CHARGE_STAGE_FLOAT2,// 浮充/涓流充电阶段DISCHARGE_NORMAL3,// 正常放电DISCHARGE_CUTOFF4// 欠压截止}BatteryStage;BatteryStage bat_stageCHARGE_STAGE_CC;/* 12V铅酸电池三段式充电参数 */#defineBAT_BULK_VOLTAGE14.4f// 恒压阶段电压上限#defineBAT_FLOAT_VOLTAGE13.6f// 浮充电压#defineBAT_CUTOFF_VOLTAGE10.8f// 欠压保护电压#defineBAT_CHARGE_CURRENT_MAX20.0f// 最大充电电流/* 电池状态机管理 */voidbattery_management_task(void){// 1. 欠压保护最高优先级if(energy_data.battery_voltageBAT_CUTOFF_VOLTAGE){bat_stageDISCHARGE_CUTOFF;sys_stateSYS_FAULT;printf(WARNING: Battery Undervoltage Cutoff!\n);// 强制关闭逆变器防止电池损坏ctrl_param.ac_output_enable0;return;}// 2. 根据电压判断充电阶段switch(bat_stage){caseCHARGE_STAGE_CC:// 恒流阶段电流达到最大值电压缓慢上升if(energy_data.battery_voltageBAT_BULK_VOLTAGE){bat_stageCHARGE_STAGE_CV;// 切换到恒压阶段printf(Switch to Constant Voltage stage.\n);}// 控制充电电流不超过最大限值if(energy_data.battery_currentBAT_CHARGE_CURRENT_MAX){// 减小MPPT输出功率mppt_solar.mppt_duty10;}break;caseCHARGE_STAGE_CV:// 恒压阶段电压恒定电流逐渐下降if(energy_data.battery_current1.0f){// 电流降到很小bat_stageCHARGE_STAGE_FLOAT;printf(Switch to Float Charge stage.\n);}break;caseCHARGE_STAGE_FLOAT:// 浮充阶段维持满电状态if(energy_data.battery_voltageBAT_FLOAT_VOLTAGE0.2f){// 稍微过充减小输入mppt_solar.mppt_duty5;}break;}// 更新SOC估算简单的电压法实际应用可用库仑计法energy_data.battery_soc(energy_data.battery_voltage-10.5f)/(14.4f-10.5f)*100.0f;if(energy_data.battery_soc100)energy_data.battery_soc100;if(energy_data.battery_soc0)energy_data.battery_soc0;}3.5 离网正弦波逆变器SPWM/* SPWM正弦波逆变器控制 */// 正弦波查找表 (50Hz, 10kHz载波200个采样点)constuint16_tsin_table[200]{512,544,575,607,638,669,699,729,758,786,// ... 中间省略 180 个数据点 ...758,729,699,669,638,607,575,544,512};volatileuint16_tspwm_index0;/* 定时器1更新中断 - 生成SPWM */voidTIM1_UP_TIM16_IRQHandler(void){if(TIM_GetITStatus(TIM1,TIM_IT_Update)!RESET){if(ctrl_param.ac_output_enable){// 取正弦表的值作为占空比uint16_ttarget_dutysin_table[spwm_index];// 更新PWM比较寄存器产生正弦调制波TIM_SetCompare1(TIM1,target_duty);// 通道1 输出正弦TIM_SetCompare2(TIM1,target_duty);// 通道2 输出正弦- (需经死区及反向逻辑处理)// 指向下一个采样点spwm_index;if(spwm_index200){spwm_index0;}}else{// 关闭输出占空比置零TIM_SetCompare1(TIM1,0);TIM_SetCompare2(TIM1,0);}TIM_ClearITPendingBit(TIM1,TIM_IT_Update);}}参考资料 小型离线风光互补式发电系统www.youwenfan.com/contentcsu/133229.html四、系统能量调度策略4.1 智能调度逻辑/* 系统能量调度与状态管理 */voidsystem_energy_scheduler(void){floattotal_input_powerenergy_data.pv_powerenergy_data.wind_power;floattotal_load_power0.0f;// 假设从负载电流采样计算得到switch(sys_state){caseSYS_INIT:if(energy_data.battery_voltage11.0f){sys_stateSYS_STANDBY;printf(System Boot Complete.\n);}break;caseSYS_STANDBY:// 只要有风或有光就转入充电模式if(total_input_power10.0f){sys_stateSYS_CHARGING;}// 如果有负载请求且电池足够转入放电if(total_load_power5.0fenergy_data.battery_soc30){sys_stateSYS_DISCHARGING;ctrl_param.ac_output_enable1;}break;caseSYS_CHARGING:// 如果充电已满转入浮充或待机if(bat_stageCHARGE_STAGE_FLOAT){sys_stateSYS_FULL;}// 如果无风无光且电池未满防止电池饿死if(total_input_power1.0f){sys_stateSYS_STANDBY;}break;caseSYS_FULL:// 电池满了多余的电能可以接入假负载泄放电阻或者直接停机if(total_input_power50.0f){// 启用卸荷电路控制一个MOS管接通水泥电阻GPIO_SetBits(GPIOB,GPIO_Pin_12);}break;caseSYS_DISCHARGING:// 电池放电过低if(energy_data.battery_soc20){sys_stateSYS_STANDBY;ctrl_param.ac_output_enable0;// 切断输出保护电池}break;}}五、主程序与系统集成5.1 主程序框架/* 主程序风光互补发电系统 */#includestm32f10x.h#includesystem_stm32f10x.h// 系统时钟滴答voidSysTick_Init(void){SysTick_Config(SystemCoreClock/1000);// 1ms中断}voidSysTick_Handler(void){system_tick;}uint32_tGet_SystemTick(void){returnsystem_tick;}intmain(void){// 1. 底层硬件初始化SystemInit();SysTick_Init();// 2. 外设初始化USART1_Init(115200);// 用于电脑监控/调试ADC_DMA_Init();// 模拟量采集 (电流、电压)PWM_MPPT_Init();// MPPT升压电路 PWM (e.g., TIM1 CH1/CH2)PWM_Inverter_Init();// 逆变器 SPWM (e.g., TIM8 CH1/CH2)Relay_Init();// 继电器/卸荷控制printf(\r\n Small Wind-Solar Hybrid Power System \r\n);printf(System Version 1.0\r\n);// 3. 系统参数初始化mppt_solar.prev_power0;mppt_solar.mppt_duty500;// 初始占空比 50%energy_data.battery_soc50.0f;// 假定初始半电sys_stateSYS_INIT;printf(System Ready. Entering Main Loop...\r\n);// 4. 主循环while(1){// --- 10ms 快速控制任务 ---// 1. 数据采集与滤波update_energy_data();// 2. MPPT追踪每100ms运行一次即可这里为了演示staticuint32_tlast_mppt_time0;if(Get_SystemTick()-last_mppt_time100){mppt_control_task();last_mppt_timeGet_SystemTick();}// 3. 电池充放电管理battery_management_task();// --- 1s 慢速调度与监控任务 ---staticuint32_tlast_second_time0;if(Get_SystemTick()-last_second_time1000){// 4. 能量调度状态机system_energy_scheduler();// 5. 状态上报printf(PV: %.1fW | Wind: %.1fW | Bat: %.1fV (SOC:%d%%) | State: %d\r\n,energy_data.pv_power,energy_data.wind_power,energy_data.battery_voltage,(uint8_t)energy_data.battery_soc,sys_state);last_second_timeGet_SystemTick();}// 延时防止主循环空转过快for(volatileuint32_ti0;i5000;i);}}六、总结基于STM32的小型离线风光互补发电系统是一个集电力电子、嵌入式控制和新能源技术于一体的综合性项目。