zoukankan      html  css  js  c++  java
  • 能量回馈装置设计

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

  • 相关阅读:
    sqlite轻量型数据库笔记
    WPF学习之MVVM笔记
    Halcon 圆测量与直线测量
    深入浅出WPF_读书笔记
    研华轴卡PCI1245L配ADAM3956接线板与台达ASD-A2伺服驱动器和松下A5伺服驱动器
    dataGridView添加ComboBox 每行绑定不同的集合,显示默认值
    VS2015 注释英文
    java的安装环境配置详细步骤
    万能正则解析 json 数据 解析成键值对
    http 异步 接收 回传 数据文字和文件流
  • 原文地址:https://www.cnblogs.com/zhuhongzhous/p/9368236.html
Copyright © 2011-2022 走看看