能量回馈装置设计

1、本能量回馈装置来源为2018全国电子设计大赛E题,

其中变流器进行负载试验时,需在其输出端接负载。通常情况下,输出电能消耗在该负载上。为了节能,应进行能量回馈。负载试验时,变流器1(逆变器)将直流电变为交流电,其输出通过连接单元与变流器2(整流器)相连,变流器2将交流电转换成直流电,并回馈至变流器1的输入端,与直流电源一起共同给变流器1供电,从而实现了节能。其中系统结构图如下:

 

其要求如下:

(1)变流器1输出端c、d仅连接电阻性负载,变流器1能输出50Hz、25V0.25V、2A的单相正弦交流电。                                                   

(2)在要求(1)的条件下,变流器1输出交流电的频率范围可设定为20Hz~100H,

步进1Hz。                                                           

(3)变流器1与能量回馈装置按图1所示连接,系统能实现能量回馈,变流器1输出电流I1 = 1A。                                                          

(4)变流器1与能量回馈装置按图1所示连接,变流器1输出电流I1 = 2A,要求直流电源输出功率Pd越小越好。    

2、分析如下,

(1)基本单个部分分析:题中变流器1为DC-AC模块,基本两路半桥实现互补输出,通过两路SPWM驱动半桥,输出正弦波形,实现DC-AC的交流信号产生;其二连接单元,初始想法为信号隔离装置,也就是将连接单元1和连接单元2的GND信号隔离开,放置波形出现失真,先是定做了30V-30V的1:1的100W变压器,实现接地信号的隔离,后期发现变流器1和变流器2共地并没有太大影响输出交流信号,故后来没有使用变压器隔离;变流器2为AC-DC转换器,即通过整流桥实现信号变化,

(2)连接整体相关分析,需要实现变流器的50Hz、25V、2A的正弦交流信号的产生,需要实现电压值的恒定,以及电流值的稳定。个人思路如下:通过采集变流器1输出电压,实现PID调节电压,再通过负载实现2A,通过恒压以及负载调节实现电流值的稳定;第二问中的频率步进可调,只要实现开环调节即可;第三问需要实现在加入能量回馈装置之后,实现电流值的恒定,后来官方出题人补充:使得能量回馈装置呈阻性,也就是将能量回馈装置做成电流源,其基本原理就是:调节电流就是调节负载阻性,实现题目要求的实现,同时后半部分的电流回馈至输入处时,需要实现后半部分的高压回馈,原因:电压值过低会使得电流值无法回馈造成电流倒灌,故最终选取方案为:PFC_BOOST升压电路作为能量回馈装置。同时对U1输出电流进行采样,进行反馈实现电流值的恒定,也就是调节能量回馈装置的电流,作为恒流源使用;第四问为变流器1输出电流为2A实现电路功率最大,即在输出2A的基础上,使得恒流源输出电流值最大,确保功率最大化。

3、硬件电路实现

3.1 U1变流器电路实现

(1)光耦隔离电路,使用6N137实现对SPWM波形的隔离,防止信号耦合,原理图如下:

 

(2)电压采样电路,通过电压互感器实现降压,完成电路电压采样,原理图如下:

 

 

(3)电源产生,主要通过LM2596以及ICL7660进行电压生成,原理如下:

 

 

(4)其驱动桥整体电路设计如下:

 

3.2 U2变流器的设计实现

(1)首先是整流桥的实现,将交流转换成直流输入值BOOST电路,完成升压功能,原理如下:

 

(2)其次为基本驱动电路,选型为TLP250驱动电路:

 

3.3 电路有效值采样电路,选型为AD637,进行采样,其原理如下:

 

4、软件设计.

主要设计PID电流反馈以及PID电压反馈,其他基本采样设计和配置,不多加赘述,有意者可另行留言,附上部分代码,为SPWM产生代码:

#include "pwm.h"

#include "led.h"

#include "oled.h"

#include "key.h"

#include "math.h"

#define P_I 3.1415926

u32 pwm_data[1000];

u16 sin_i;

static vu16 sign = 0;

vu16 Counter_sine=0;

extern u16 adc_i;

void sin_wave(u16 length);

void TIM1_Init(u16 arr, u16 psc)

{

GPIO_InitTypeDef         GPIO_InitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

TIM_OCInitTypeDef       TIM_OCInitStructure;

TIM_BDTRInitTypeDef      TIM_BDTRInitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;

GPIO_Init(GPIOB,&GPIO_InitStructure);

TIM_DeInit(TIM1);

TIM_TimeBaseInitStructure.TIM_Period = arr;    

TIM_TimeBaseInitStructure.TIM_Prescaler = psc; 

TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;   

TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;

TIM_OCInitStructure.TIM_Pulse = 0;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;

TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;

TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

TIM_OC1Init(TIM1, &TIM_OCInitStructure);

TIM_OC2Init(TIM1, &TIM_OCInitStructure);

TIM_OC3Init(TIM1, &TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);

TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);

TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);

TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;

TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;

TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;

TIM_BDTRInitStructure.TIM_DeadTime = 30;

TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;              

TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;

TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;

TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);

TIM_Cmd(TIM1, ENABLE);

 TIM_CCPreloadControl(TIM1,ENABLE);

TIM_CtrlPWMOutputs(TIM1, ENABLE);

}

TIM_ICInitTypeDef  TIM2_ICInitStructure;

extern u16 n;

u32 microsecond=0;

u32 EvenOdd=0;

void sin_wave(u16 length)

{

       for(sin_i = 0;sin_i < length;sin_i++)

       pwm_data[sin_i] = 3600*0.4 *sin(2*P_I * sin_i / length) + 1800;

}

void TIM4_Init(u16 arr, u16 psc)

{

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

       RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);

         TIM_DeInit(TIM4);               

         TIM_TimeBaseStructure.TIM_Period=arr;  

         TIM_TimeBaseStructure.TIM_Prescaler= psc; 

         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

         TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

         TIM_ClearFlag(TIM4, TIM_FLAG_Update);

         TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);

               TIM_Cmd(TIM4, ENABLE);

         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

         NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;

         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

         NVIC_Init(&NVIC_InitStructure);

}

void TIM4_IRQHandler(void)

{

 if (TIM_GetITStatus(TIM4 ,TIM_IT_Update) == SET)

 {

        Counter_sine++;

        TIM_SetCompare1(TIM1,(u16)(pwm_data[Counter_sine]));

        TIM_SetCompare2(TIM1,(u16)(pwm_data[Counter_sine]));

        TIM_SetCompare3(TIM1,(u16)(pwm_data[Counter_sine]));

        if(Counter_sine==n)

       {

               Counter_sine=0;

                  }

 }

 TIM_ClearITPendingBit(TIM4 , TIM_FLAG_Update);

}

5、此为18年电设A题,后续更新以前电设方案,个人本科经历,多处不足,敬请指正,互相学习。

原文地址:https://www.cnblogs.com/zhuhongzhous/p/9368236.html