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题,后续更新以前电设方案,个人本科经历,多处不足,敬请指正,互相学习。